-1

这是我的代码:

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;
}

出于某种原因,我的游戏结束功能无法正常工作。我不确定为什么。它在游戏仍在进行时返回 true,在游戏结束时返回 false。顺便说一句,这是一个连接四游戏。提前致谢!

编辑: getToMove 给即将移动的玩家。它只是给出变量 Player toMove,其中 toMove 首先被确定为“x”。在 makeMove 函数中,我更改为移动到下一个玩家。以下是相关方法。

    public boolean makeMove(int col) {
    if (board[0][col] != null){
        return false;
    }
    else {
        for (int i=BOARD_HEIGHT-1; i>=0; i--){
            if (board[i][col] == null){
                board[i][col] = getToMove();
                saveRow.add(i);
                saveCol.add(col);
                if (getToMove() == x)
                    toMove = o;
                else if (getToMove() == o)
                    toMove = x;
                return true;
            }
        }
    }
    return false;
}

    public Player getSquare(int row, int col) {
    if (row > BOARD_HEIGHT-1 || row < 0 || col > BOARD_WIDTH-1 || col < 0)
        return null;
    else return board[row][col];
}


    public Player getToMove() {
    return toMove;
}
4

1 回答 1

0

首先 if 条件应该检查​​获胜者是否不为空,然后返回 true。因为如果已经有赢家,那么游戏就结束了。但是如果没有获胜者,那么您应该通过检查顶行中的所有单元格是否已填满来检查玩家是否已填满所有列。如果至少有一个单元格没有被填满,则游戏还没有结束,所以返回 false。否则返回真。

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

在您当前的逻辑中,您检查是否没有获胜者,如果没有获胜者,则返回 false 而不检查游戏板是否已填满。仅当有赢家时,您才检查游戏板是否已填满。所以这个逻辑是不正确的。正确的逻辑就是我上面提到的。

于 2012-11-09T05:48:31.507 回答