【问题标题】:Tic-Tac-Toe to check for a winner井字游戏检查获胜者
【发布时间】:2016-03-21 22:56:58
【问题描述】:

我已经完成了井字游戏,但我唯一的问题是我无法从游戏中确定获胜者/平局。我有一种专门用于寻找获胜者的方法,但它不起作用。我究竟做错了什么?代码如下:

import java.util.Scanner;

public class TicTacToe {

    public static final int X = 1;
    public static final int Y = 2;

    public static void main(String[] args) {

        final int X = 1;
        final int Y = 2;

        int[][] board = {{0, 0, 0},
        {0, 0, 0},
        {0, 0, 0}
        };

        int count = 0;

        while (!checkWinner(board)) {
            printBoard(board);

            if (count % 2 == 0) {
                System.out.println("X's turn");
                move(X, board);
            } else {
                System.out.println("Y's turn");
                move(Y, board);
            }

            System.out.println();
            count++;
        }

    }

    public static boolean checkWinner(int[][] board) {
        if (board[0][0] == board[1][0] && board[1][0] == board[2][0] && (board[0][0] == "X" || board[0][0] == "Y")) {
            return true;
        } else if (board[0][1] == board[1][1] && board[1][1] == board[2][1] && (board[0][1] == "X" || board[0][1] == "Y")) {
            return true;
        } else if (board[0][2] == board[1][2] && board[1][2] == board[2][2] && (board[0][2] == "X" || board[0][2] == "Y")) {
            return true;
        } else if (board[0][0] == board[0][1] && board[0][1] == board[0][2] && (board[0][0] == "X" || board[0][0] == "Y")) {
            return true;
        } else if (board[1][0] == board[1][1] && board[1][1] == board[1][2] && (board[1][0] == "X" || board[1][0] == "Y")) {
            return true;
        } else if (board[2][0] == board[2][1] && board[2][1] == board[2][2] && (board[2][0] == "X" || board[2][0] == "Y")) {
            return true;
        } else if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && (board[0][0] == "X" || board[0][0] == "Y")) {
            return true;
        } else if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && (board[2][0] == "X" || board[2][0] == "Y")) {
            return true;
        } else {
            return false;
        }
    }

    public static void printBoard(int[][] board) {
        for (int i = 0; i < 3; i++) {
            System.out.print("| ");
            for (int j = 0; j < 3; j++) {
                if (board[i][j] == TicTacToe.X) {
                    System.out.print("X");
                } else if (board[i][j] == TicTacToe.Y) {
                    System.out.print("Y");
                } else {
                    System.out.print("-");
                }
                System.out.print(" | ");
            }
            System.out.println();
        }
    }

    public static void move(int player, int[][] board) {
        Scanner myScan = new Scanner(System.in);

        System.out.print("Row: ");
        int x = myScan.nextInt();
        System.out.print("Column: ");
        int y = myScan.nextInt();

        board[x][y] = player;

    }

}

我不需要向这个程序添加其他方法,因为这就是我所需要的。

【问题讨论】:

  • 基本上,你有一个 3x3 的矩阵,所以给定一个单一的起点,你需要检查水平、垂直和对角线方向,好消息是,起点总是可以是第一行 (并检查),也许像this和像this这样的东西

标签: java eclipse


【解决方案1】:

如果没有获胜者AND棋盘未满,您应该将while 循环中的条件替换为:

while(!checkWinner(board) && /*board is not full*/) {
//...
}

if(checkWinner(board)) //→ there's a winner;
else //it's a draw;

我建议您重新访问checkWinner 方法,虽然该格式有效,但效率很低,您可以找到一种更简单、更有趣的方法来实现它。例如,您可以利用以下内容:

int n = board[0][0] * board[0][1] * board[0][2];
n == 0; → has vacant cells
n == 1; → player 1 won
n == 8; → player 2 won 

【讨论】:

  • 效率更高。只是为了好玩。 int n = board[0][0] &amp; board[0][1] &amp; board[0][2]; 然后n == 0 没有赢家,n==1 玩家 1 获胜,n==2 玩家 2 获胜。我一般不建议这样做,因为显式编码是很好的编码,并且只在需要优化的地方进行优化——但对于初学者来说,弄清楚它为什么工作是一个很好的挑战。
【解决方案2】:

您的代码编译是否没有任何错误?

我不明白这是怎么回事? 板[1][0] == "X"

board 是一个整数数组!您应该看到“不兼容的操作数类型 int 和 String”!

【讨论】:

  • 我把它从“X”改成了“X”。
  • 这也是错误的......'x'(带单引号)将被解释为字节而不是字符串。
【解决方案3】:

您的数组是整数类型,但您在函数中将它与“X”和“Y”等字符串进行比较。您必须在 checkWinner() 函数的所有 if 语句中将 ... == " X" 替换为 ... == TicTacToe.X 和 ... == "Y" 与 ... == TicTacToe.Y .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多