连接4个Java,检查win条件?

连接4个Java,检查win条件?,java,Java,这是我的密码: public boolean isGameOver() { if (getWinner() == null) return false; for (int i=0; i<BOARD_WIDTH; i++){ if (board[0][i]!=null){ return true; } } return true; } public Player getWinner()

这是我的密码:

public boolean isGameOver() {
    if (getWinner() == null)
        return false;
    for (int i=0; i<BOARD_WIDTH; i++){
        if (board[0][i]!=null){
            return true;
        }
    }
    return true;
}

public Player getWinner() {
    Player winner = getToMove();
    if (checkRows() || checkCols() || checkLowDiag() || checkHighDiag() ){
        return winner;
    }
    return null;
}

public boolean checkRows(){
    for (int i=0;i<BOARD_HEIGHT; i++){
        for (int j = 0; j<BOARD_WIDTH; j++){
            if (getSquare(i, j) != null && getSquare(i, j) == getToMove()){
                if (getSquare(i, j) == getSquare(i, j+1) && getSquare(i, j+1) != null &&
                        getSquare(i, j) == getSquare(i, j+2) && getSquare(i, j+2) != null &&
                        getSquare(i, j) == getSquare(i, j+3) && getSquare(i, j+3) != null)
                    return true;
            }
        }
    }
    return false;
}

public boolean checkCols(){
    for (int i=0;i<BOARD_HEIGHT; i++){
        for (int j = 0; j<BOARD_WIDTH; j++){
            if (getSquare(i, j) != null && getSquare(i, j) == getToMove()){
                if (getSquare(i, j) == getSquare(i+1, j) && getSquare(i+1, j) != null &&
                        getSquare(i, j) == getSquare(i+2, j) && getSquare(i+2, j) != null &&
                        getSquare(i, j) == getSquare(i+3, j) && getSquare(i+3, j) != null)
                    return true;
            }
        }
    }
    return false;
}

public boolean checkLowDiag(){
    for (int i=0; i<BOARD_HEIGHT; i++){
        for (int j=0; j<BOARD_WIDTH; j++){
            if (getSquare(i, j) != null && getSquare(i, j) == getToMove()){
                if (getSquare(i, j) == getSquare(i+1, j+1) && getSquare(i+1, j+1) != null &&
                        getSquare(i, j) == getSquare(i+2, j+2) && getSquare(i+2, j+2) != null &&
                        getSquare(i, j) == getSquare(i+3, j+3) && getSquare(i+3, j+3) != null)
                    return true;
            }
        }

    }
    return false;
}

public boolean checkHighDiag(){
    for (int i=0; i<BOARD_HEIGHT; i++){
        for (int j=0; j<BOARD_WIDTH; j++){
            if (getSquare(i, j) != null && getSquare(i, j) == getToMove()){
                if (getSquare(i, j) == getSquare(i-1, j+1) && getSquare(i-1, j+1) != null &&
                        getSquare(i, j) == getSquare(i-2, j+2) && getSquare(i-2, j+2) != null &&
                        getSquare(i, j) == getSquare(i-3, j+3) && getSquare(i-3, j+3) != null)
                    return true;
            }
        }

    }
    return false;
}
public boolean isGameOver(){
如果(getWinner()==null)
返回false;

对于(int i=0;i首先if条件应该检查winner是否为null,然后返回true。因为如果已经有一个winner,游戏就结束了。但是如果没有winner,那么你应该通过检查顶部行中的所有单元格是否都已填充来检查玩家是否已填充所有列。如果至少有一个单元格未填充,则游戏结束未结束,因此返回false。否则返回true

if (winner != null) game is over
else {
   if (one of top row cell is null) game is not over
   else game is over.
}

在您当前的逻辑中,您必须检查是否没有赢家,如果没有赢家,则返回false,而不检查游戏板是否已填充。只有当有赢家时,您才检查游戏板是否已填充。因此,该逻辑不正确。正确的逻辑就是我上面提到的逻辑。

您可以发布“getToMove”的代码吗()“函数?我注意到的第一件事是,你总是使用检查函数,例如,一行中的4只能在第一列和最后第四列之间开始。如果你使用board[][],我想你会得到IndexOutOfBounds而不是getSquare。你说我的检查函数走得太远是什么意思?我应该在for循环中从我的BOARD_HEIGHT/BOARD_WIDTH中减去一些数字吗?在isGameOver函数中,在first for循环中,它返回true,如果第一列单元格中至少有一个不为null,这是预期的行为吗?可能是你需要至少检查的e第一列单元格为null并返回false(我实际上不知道这个游戏,所以我可能错了)。在checkColls、checkRows等函数中,我认为如果条件是冗余的,则在内部执行null检查,因为您已经检查了(I,j)不为null,然后在内部循环中检查其他三个单元格是否为null。是的,我只是假设如果所有列都已满(因为(0,0)是左上角),那么游戏就结束了。虽然null检查是多余的,但我删除了它。谢谢。但函数仍然有问题。
if (winner != null) game is over
else {
   if (one of top row cell is null) game is not over
   else game is over.
}