【问题标题】:Determining a winner in a NXN Tic Tac Toe game在 NXN Tic Tac Toe 游戏中确定获胜者
【发布时间】:2015-01-18 08:14:30
【问题描述】:

我尝试使用 play 和 hasWon 方法创建井字游戏类。

public class TicTacToe {

private enum State{Blank, X, O}
private int grid;
private State[][] board = new State[grid][grid];
private int moves;


//Default Constructor
public TicTacToe(int grid){

    board = new State[grid][grid];
    moves = 0;
}
public void play(State s, int m, int n){

    if (board[m][n] == State.Blank){
        board[m][n] = s;
    }
    moves++;
}




public boolean hasWon(State[][] board){

    //check winner in rows
    boolean state = false;
    int j = 0;
    int i = 0;
    while(j <= grid) {
        for (i = 0; i <= grid; i++) {
            if (board[j][i] == board[j][i + 1])
                state = true;
            else state = false;
            break;

        }
        if(state == false)
            j++;
        else return true;

    }
    //check winner in columns
    while(j <= grid) {
        for (i = 0; i < grid; i++) {
            if (board[i][j] == board[i + 1][j])
                state = true;
            else state = false;
            break;

        }
        if (state == true)
            j++;
        else return true;
    }
    //check winner in top diagonal
    while(j <= grid && i <= grid){
        if (board[i][j] == board[i+1][j+1])
            state = true;
        else state = false;
        break;

        i++;
        j++;
        return true;
    }


    //check winner in bottom diagonal
    int k = grid;
    int l = grid;
    while(k >= 0 && l >= 0){
        if (board[k][l] == board[k-1][l-1])
            state = true;
        else state = false;
        break;
        k--;
        l--;
        return true;
    }


    return false;
}

}

但是,当在 Main 类中调用时,程序的行为不正常。是不是代码逻辑有问题。

【问题讨论】:

  • “不正常”是什么意思?
  • 在某些情况下,它会给其他人带来胜利,但不是。
  • 你需要连续获得多少个? 3?
  • 嗯,你只是比较一个对角线,对于初学者来说。
  • 您可能会尝试为方法hasWon 实施一些单元测试,并在它返回不正确的结果时发现情况。这是非常有用的学习实践。

标签: java multidimensional-array tic-tac-toe


【解决方案1】:

当检查你的行时

for (i = 0; i < n; i++) {
    if (board[j][i] == board[j][i + 1])
        state = true;
}

如果行中的最后两个字符相同,则此代码始终将状态设置为 true,而与该行中的前一个字符无关。

列和对角线(您只按照托德所说的那样检查)是一样的。

如果您发现一些不相等的值,您希望停止比较该行的值:

for (i = 0; i < n; i++) {
    if (board[j][i] == board[j][i + 1]) {
        state = true;
    } else {
        state = false;
        break;
    }
}

行和对角线相同。

编辑: 此外:您没有在构造函数中设置字段网格,因此它始终为 0,并且您没有检查完整的行、列、对角线
缺失:

this.grid = grid;

【讨论】:

  • 已编辑以更改结果数组。
  • @Clockwork 他们编辑它的方式不起作用,因为break 命令现在导致循环在第一次迭代中直接停止。 break 只能在检测到不同值时使用。
猜你喜欢
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多