0

このメソッドは、最初といくつかの動きの後にゲームが終了したかどうかを判断する必要があります。

public boolean isGameOver() {
    Point[] player1 = new Point[12];
    int p1 = 0;
    Point[] player2 = new Point[12];
    int p2 = 0;
    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < 7; j++) {
            if (board[i][j] == 1) {
                Point p = new Point(i, j);
                player1[p1] = p;
                p1++;
                //System.out.println(p.getX()+ " 1 " + p.getY());
            } else if (board[i][j] == 2) {
                Point p = new Point(i, j);
                player2[p2] = p;
                p2++;
                //System.out.println(p.getX()+ " 2 " + p.getY());
            }
        }
    }
    for(int i1=0;i1<player1.length;i1++) {
        ArrayList<Point> temp = getPossibleMoves(player1[i1]);
        if(temp.isEmpty())
            return true;
    }
    for(int i1=0;i1<player1.length;i1++) {
        ArrayList<Point> temp = getPossibleMoves(player2[i1]);
        if(temp.isEmpty())
            return true;
    }
    return false;
} 

問題は、これらのテストを実行すると、両方とも配列インデックスが範囲外であるというエラーが発生することです。これらはテストです

最初に:

  @Test(timeout=1000)
public void testGameOverInitial() {
    assertFalse(board.isGameOver());
}

いくつかの動きの後:

 @Test(timeout=1000)

public void testGameOverAfterSomeMoves() {
    board.move(new Point(1, 0), new Point(3, 2)); // White's turn
    board.move(new Point(0, 5), new Point(2, 5)); // Black's turn
    assertFalse(board.isGameOver());
}
4

2 に答える 2

1

p1および変数の値を制御していないp2ため、配列の長さよりも大きくなる可能性があります。

エラーのある行:

player1[p1]
p1++;

player2[p2]
p2++;

考えられる解決策は、これらの変数の値を増やすタイミングを制御することです。

//similar for player2 and p2
if (p1 < player1.length) {
    p1++;
}
于 2013-04-26T19:53:20.730 に答える
1

p1p2はループにネストされているためfor、両方のプレーヤー配列のサイズである 12 ではなく、最大 49 まで増やすことができます。

@LuiggiMendozaが提案するp1よりも小さい場合は、長さを確認できます。または、ループと配列player1.lengthの長さを修正できます。player

あなたが何をしようとしているのかわからない。解決しようとしている問題に最適なソリューションを選択する必要があります。

于 2013-04-26T19:59:39.203 に答える