【问题标题】:Random Tic Tac Toe checker issue随机井字检查器问题
【发布时间】:2017-01-11 20:51:38
【问题描述】:

好的,所以我必须制作一个随机的tictactoe 检查器,显示x 何时获胜、o 何时获胜以及何时出现平局。所以我遇到的问题是它不会显示平局,有时会说 x 或 o 赢了,而他们没有。我不知道在我的代码中要改变什么,因为在我进行对角线检查之前,它会打印出关系。这是整个代码,但我很确定问题出在检查板部分,通过使 xWin 和 oWin 变为真,我找不到它在哪里这样做。

package test;

import java.util.Scanner;
import java.util.Random;

public class TicTacToe {
    public static void main(String[] args) {
        System.out.println("Welcome to random Tic Tac Toe Checker. Let's see our randomly generated board.");
        int dimension = 3;
        char[][] board = new char[dimension][dimension];
        Random r = new Random();

        for (int i = 0; i < 3; i++) // filling board
        {
            for (int j = 0; j < 3; j++) {
                int choice = r.nextInt(2);
                if (choice == 0) {
                    board[i][j] = 'X';
                } else if (choice == 1) {
                    board[i][j] = 'O';
                }
            }
        }
        for (int i = 0; i < 3; i++) // filling board
        {
            for (int j = 0; j < 3; j++) {
                System.out.print(board[i][j]);
            }
            System.out.println();
        }

        boolean xWin = false;// checking board, order horizontal,vertical,left
                                // and right diagonal
        boolean oWin = false;

        for (int i = 0; i < 3; i++) {
            boolean lineWin = true;
            for (int j = 0; j < 3; j++) {
                if (board[i][j] != board[i][0]) {
                    lineWin = false;

                }
            }
            if (lineWin == true) {
                if (board[i][0] == 'X') {
                    xWin = false;
                }
                if (board[i][0] == 'O') {
                    oWin = false;
                }

            }
        }
        for (int j = 0; j < 3; j++) {
            boolean lineWin = true;
            for (int i = 0; i < 3; i++) {
                if (board[i][j] != board[0][j]) {
                    lineWin = true;

                }
            }
            if (lineWin == true) {
                if (board[0][j] == 'X') {
                    xWin = true;
                }
                if (board[0][j] == 'O') {
                    oWin = true;
                }

            }
        }
        boolean lineWin = true;
        for (int i = 0; i < 3; i++) {
            if (board[0][0] != board[i][i]) {
                lineWin = false;
            }
            if (lineWin == true) {
                if (board[0][0] == 'X') {
                    xWin = true;
                }
                if (board[0][0] == 'O') {
                    oWin = true;
                }

            }
        }
        lineWin = true;
        for (int i = 0; i < 3; i++) {
            if (board[0][0] != board[i][2 - i]) {
                lineWin = false;
            }
            if (lineWin == true) {
                if (board[0][0] == 'X') {
                    xWin = true;
                }
                if (board[0][0] == 'O') {
                    oWin = true;
                }
            }
        }

        if (xWin == false && oWin == false)// printing winners
        {
            System.out.println("CAT!It's a tie no one wins");
        }
        if (xWin == true) {
            System.out.println("X wins!");
        }

        if (oWin == true) {
            System.out.println("O wins!");
        }

    }
}

【问题讨论】:

  • 考虑到这一点,如果你知道line 不能再赢了,你为什么还要继续检查呢?另外,如果您知道XO 已经赢了,为什么还要继续检查其他可能的赢条件? Branching Statements 之类的东西(尤其是 break 语句)可能会有所帮助
  • 您能否举一个实施失败的例子?
  • if(board[0][0] != board[i][2-i]) 在你最后的检查是错误的,不是[0][0] 而是[0][2]
  • @Codor XOX OXX OXX X 赢了!哦,赢了! XOO XXX OXX X 赢了!哦,赢了!
  • @MadProgrammer 我的问题是我不知道它在哪里继续检查,我只是尝试了你推荐的方法,我很确定我做错了。我一直在想太多,现在我一直在尝试的一切都不起作用。

标签: java


【解决方案1】:

我修复了布尔错误以及对角线逻辑:

import java.util.Random;

public class TicTacToe {
  private static final int DIMENSION = 3;

  public static void main(String[] args) {
    System.out.println("Welcome to random Tic Tac Toe Checker. Let's see our randomly generated board.");
    char[][] board = new char[DIMENSION][DIMENSION];
    final Random r = new Random();

    for (int i = 0; i < DIMENSION; i++) {
      for (int j = 0; j < DIMENSION; j++) {
        int choice = r.nextInt(2);
        if (choice == 0) {
          board[i][j] = 'X';
        } else if (choice == 1) {
          board[i][j] = 'O';
        }
      }
    }
    for (int i = 0; i < DIMENSION; i++) {
      for (int j = 0; j < DIMENSION; j++) {
        System.out.print(board[i][j]);
      }
      System.out.println();
    }


    boolean xWin = false;
    boolean oWin = false;

    for (int i = 0; i < DIMENSION; i++) {
      boolean lineWin = true;
      for (int j = 0; j < DIMENSION; j++) {
        if (board[i][j] != board[i][0]) {
          lineWin = false;
        }
      }
      if (lineWin) {
        if (board[i][0] == 'X') {
          xWin = true;
        }
        if (board[i][0] == 'O') {
          oWin = true;
        }

      }
    }
    for (int j = 0; j < DIMENSION; j++) {
      boolean lineWin = true;
      for (int i = 0; i < DIMENSION; i++) {
        if (board[i][j] != board[0][j]) {
          lineWin = false;
        }
      }
      if (lineWin) {
        if (board[0][j] == 'X') {
          xWin = true;
        }
        if (board[0][j] == 'O') {
          oWin = true;
        }

      }
    }
    boolean lineWin = true;
    for (int i = 0; i < DIMENSION; i++) {
      if (board[0][0] != board[i][i]) {
        lineWin = false;
      }
    }
    if (lineWin) {//this check should not be in the loop
      if (board[0][0] == 'X') {
        xWin = true;
      }
      if (board[0][0] == 'O') {
        oWin = true;
      }

    }
    lineWin = true;
    for (int i = 0; i < DIMENSION; i++) {
      if (board[DIMENSION - 1][0] != board[i][DIMENSION - 1 - i]) {
        lineWin = false;
      }
    }
    if (lineWin) {//this check should not be in the loop
      if (board[DIMENSION - 1][0] == 'X') {
        xWin = true;
      }
      if (board[DIMENSION - 1][0] == 'O') {
        oWin = true;
      }
    }
    if (xWin == true && oWin == true) {//printing winners
      System.out.println("Both players won!");
    }
    if (xWin == false && oWin == false) {
      System.out.println("CAT!It's a tie no one wins");
    }
    if (xWin == true) {
      System.out.println("X wins!");
    }

    if (oWin == true) {
      System.out.println("O wins!");
    }
  }
}

注意:你可以增加 DIMENSION 来笑。

【讨论】:

  • 你是男人中的神
【解决方案2】:

我认为这个文件的主要问题出现在中间,特别是第 34 到 66 行,在那里您对相同字符的水平和垂直行进行初始检查。

for (int i = 0; i < 3; i++) {
        boolean lineWin = true;
        for (int j = 0; j < 3; j++) {
            if (board[i][j] != board[i][0]) {
                lineWin = false;

            }
        }
        if (lineWin == true) {
            if (board[i][0] == 'X') {
                xWin = false; //THESE LINES SHOULD BE CHANGING THE WIN CONDITION TO TRUE
            }
            if (board[i][0] == 'O') {
                oWin = false; //LISTED ABOVE
            }

        }
    }
    for (int j = 0; j < 3; j++) {
        boolean lineWin = true;
        for (int i = 0; i < 3; i++) {
            if (board[i][j] != board[0][j]) {
                lineWin = true; //THIS LINE SHOULD BE FALSE

            }
        }
        if (lineWin == true) {
            if (board[0][j] == 'X') {
                xWin = true;
            }
            if (board[0][j] == 'O') {
                oWin = true;
            }
        }

我列出了一些可以修复代码并使其按照您希望的方式运行的更改。似乎在错误的时间将布尔值声明为 truefalse 时出现了一些错误,因此这应该能够解决问题。

【讨论】:

  • 我尝试了更改,但它仍然没有打印领带,而是打印一个没有赢的人
【解决方案3】:

在第一块

if(lineWin == true)
{
  if(board[i][0] == 'X')
  {
    xWin = false;
  }
  if(board[i][0] == 'O')
  {
    oWin = false;
  }
}

应该如下改变。

if(lineWin == true)
{
  if(board[i][0] == 'X')
  {
    xWin = true;
  }
  if(board[i][0] == 'O')
  {
    oWin = true;
  }
}

此外,在第二块中,部分

if(board[i][j] != board[0][j])
{
  lineWin = true;
}

应该如下改变。

if(board[i][j] != board[0][j])
{
  lineWin = false;
}

【讨论】:

  • 试过了,它仍然在打印,当它不是并且仍然没有记录平局时,它仍然是赢了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2017-07-21
相关资源
最近更新 更多