-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 条件で勝者が null でないかどうかを確認し、次に true を返す必要があります。すでに勝者がいる場合、ゲームは終了します。ただし、勝者がいない場合は、一番上の行のセルがすべて埋まっているかどうかをチェックして、プレイヤーがすべての列を埋めたかどうかを確認する必要があります。少なくとも 1 つのセルが満たされていない場合、ゲームは終了していないため、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 を返します。勝者がいる場合にのみ、ゲームボードがすでにいっぱいになっているかどうかを確認します。そのため、ロジックが正しくありません。正しいロジックは、私が上で述べたものです。

于 2012-11-09T05:48:31.507 に答える