我的 TicTacToe 游戏的 CheckingWinner 方法

CheckingWinner Method for my TicTacToe game

我尝试让 checkgamewinner 方法适用于我的 TicTacToe 游戏,但我在循环开始或结束时遇到问题。每当我开始打开我的游戏并单击一个字段时,它只会打印垃圾邮件“没有赢家”。这是我当前的代码:

public String checkGameWinner(char [][]grid) {
    boolean winner = false;
    String result = "None";
    while(!winner) {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (gridAt(0, 0) == 'x' & gridAt(0, 1) == 'x' & gridAt(0, 2) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(0, 0) == 'x' & gridAt(1, 0) == 'x' & gridAt(2, 0) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(0, 0) == 'x' & gridAt(1, 1) == 'x' & gridAt(2, 2) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(1, 0) == 'x' & gridAt(1, 1) == 'x' & gridAt(1, 2) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(2, 0) == 'x' & gridAt(2, 1) == 'x' & gridAt(2, 2) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(0, 1) == 'x' & gridAt(1, 1) == 'x' & gridAt(2, 1) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(0, 2) == 'x' & gridAt(1, 2) == 'x' & gridAt(2, 2) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(0, 2) == 'x' & gridAt(1, 1) == 'x' & gridAt(2, 0) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(0, 0) == 'x' & gridAt(0, 1) == 'x' & gridAt(0, 2) == 'x') {
                    winner = true;
                    System.out.println("Player x has won");
                    break;
                } else if (gridAt(0, 0) == 'o' & gridAt(1, 0) == 'o' & gridAt(2, 0) == 'o') {
                    winner = true;
                    System.out.println("Player o has won");
                } else if (gridAt(0, 0) == 'o' & gridAt(1, 1) == 'o' & gridAt(2, 2) == 'o') {
                    winner = true;
                    System.out.println("Player o has won");
                } else if (gridAt(1, 0) == 'o' & gridAt(1, 1) == 'o' & gridAt(1, 2) == 'o') {
                    winner = true;
                    System.out.println("Player o has won");
                } else if (gridAt(2, 0) == 'o' & gridAt(2, 1) == 'o' & gridAt(2, 2) == 'o') {
                    winner = true;
                    System.out.println("Player o has won");
                } else if (gridAt(0, 1) == 'o' & gridAt(1, 1) == 'o' & gridAt(2, 1) == 'o') {
                    winner = true;
                    System.out.println("Player o has won");
                } else if (gridAt(0, 2) == 'o' & gridAt(1, 2) == 'o' & gridAt(2, 2) == 'o') {
                    winner = true;
                    System.out.println("Player o has won");
                } else if (gridAt(0, 2) == 'o' & gridAt(1, 1) == 'o' & gridAt(2, 0) == 'o') {
                    winner = true;
                    System.out.println("Player o has won");
                } else {
                    result = "no winner";
                    System.out.println(result);
                }
            }

        }
    }
    return result;
}

不知道我还能做什么,我玩了一下布尔值,但当我的棋盘上有赢家时它并没有停止。

为什么不让自己轻松一点并创建这样的方法呢。

private boolean checkRows() {
}
private boolean checkColumns() {
}
private boolean checkDiagnonals() {
}

那么每个方法中的测试就会更少,并且可以更轻松地将它们作为单独的方法进行调试。

if (checkRows() || checkColumns() || checkDiagonals()) {
  // winning code here.
}

我假设它们是实例方法,因此它们可以访问 char[][] grid

关于您当前的代码。

  • 摆脱 while 循环,它没有用
  • 去掉 for 循环。您已经在检查显式索引。
  • 当您决定谁获胜时,将其打印出来并简单地 return true
  • 如果您在所有测试结束时都没有获胜者,return false

要调试,请为 xo 建立测试用例,这样您就知道去哪里找

我没有检查你的逻辑,但据我所知,你提到的问题是因为当你打开你的游戏时,你的网格将完全是空的,因此它会转到 else 块并执行它。

我希望这能指导您正确编写逻辑。

另外,尽量合理划分方法,便于阅读、调试和维护。

您不需要同时使用循环和 if else 条件。我已经创建了带有 if else 条件的示例程序。

public class Main
{
    public static void main(String[] args) {
        char [][]grid = {
                {'x', 'x', 'x'},
                {'x', 'x', 'x'},
                {'x', 'x', 'x'}
        };
        checkGameWinner(grid);
    }

    public static String checkGameWinner(char [][]grid) {
        String result = "None";
        boolean winner = true;
        if (grid[0][0] == 'x' && grid[0][1] == 'x' && grid[0][2] == 'x') {
            result = "Player x has won";
        } else if (grid[0][0] == 'x' && grid[1][0] == 'x' && grid[2][0] == 'x') {
            result = "Player x has won";
        } else if (grid[0][0] == 'x' && grid[1][1] == 'x' && grid[2][2] == 'x') {
            result = "Player x has won";
        } else if (grid[1][0] == 'x' && grid[1][1] == 'x' && grid[1][2] == 'x') {
            result = "Player x has won";
        } else if (grid[2][0] == 'x' && grid[2][1] == 'x' && grid[2][2] == 'x') {
            result = "Player x has won";
        } else if (grid[0][1] == 'x' && grid[1][1] == 'x' && grid[2][1] == 'x') {
            result = "Player x has won";
        } else if (grid[0][2] == 'x' && grid[1][2] == 'x' && grid[2][2] == 'x') {
            result = "Player x has won";
        } else if (grid[0][2] == 'x' && grid[1][1] == 'x' && grid[2][0] == 'x') {
            result = "Player x has won";
        } else if (grid[0][0] == 'x' && grid[0][1] == 'x' && grid[0][2] == 'x') {
            result = "Player x has won";
        } else if (grid[0][0] == 'o' && grid[1][0] == 'o' && grid[2][0] == 'o') {
            result = "Player o has won";
        } else if (grid[0][0] == 'o' && grid[1][1] == 'o' && grid[2][2] == 'o') {
            result = "Player o has won";
        } else if (grid[1][0] == 'o' && grid[1][1] == 'o' && grid[1][2] == 'o') {
            result = "Player o has won";
        } else if (grid[2][0] == 'o' && grid[2][1] == 'o' && grid[2][2] == 'o') {
            result = "Player o has won";
        } else if (grid[0][1] == 'o' && grid[1][1] == 'o' && grid[2][1] == 'o') {
            result = "Player o has won";
        } else if (grid[0][2] == 'o' && grid[1][2] == 'o' && grid[2][2] == 'o') {
            result = "Player o has won";
        } else if (grid[0][2] == 'o' && grid[1][1] == 'o' && grid[2][0] == 'o') {
            result = "Player o has won";
        } else {
            result = "no winner";
            winner = false;
        }
        System.out.println(result);
        return result;
    }
}

注意:以上不是解决给定问题的最佳方法。