连接四个对角线胜利

时间:2016-11-30 22:07:10

标签: java arrays

我试图检查一名球员是否对角赢了(从左上角到右下角)。网格的左上部分是(0,0)。我没有根据放置的最后一个牌来核对玩家是否赢了。相反,我检查网格上的所有点以检查是否有人对角赢了。这就是我提出的。

public class TestWin {
private int count_piece;
private char[][] board;

public void myBoard(char[][] x){
    this.board = x;
    //vertWin();
    //horizontalWin();
    diagDownWin();
}

public boolean diagDownWin(){
    for(int row = 0; row < board.length; row++){
        for(int col = 0; col < board[0].length; col++){
            if(board[row][col] == board[row+1][col+1]){
                count_piece++;
                if(count_piece >= 4){
                    System.out.println("You win");
                    return true;
                }
            }else{
                count_piece = 0;
            }
        }
    }
    System.out.println("No win");
    return false;
}
public static void main(String[] args) {

    char[][] myGrid = { 
            { 'X', 'O', 'O', 'O'}, 
            { 'X', 'X', 'O', 'O'}, 
            { 'O', 'X', 'X', 'O'},
            { 'O', 'O', 'X', 'X'},
            { 'O', 'O', 'O', 'O'}
    };

    TestWin m1 = new TestWin();

    m1.myBoard(myGrid);

}

}

因为有两种方法可以从对角线中获胜 - 我会检查从左上角到右下角的移动。我想要一个接一个(行+ 1和列+1),但是我在写行的地方遇到一个数组超出边界错误:

if(board[row][col] == board[row+1][col+1])

我认为这是因为当我到达最后一行和最后一行时,我添加了一个更大的board.length和board [0] .length

我该怎么做才能防止错误?

2 个答案:

答案 0 :(得分:1)

在你的循环中,只迭代可以有效成为右下四行的左上角位置的位数(因此,对于你的例子)网格,位置(0, 0)(0, 1))。然后,评估从那一点开始是否发生了四行。有点像:

for(int row = 0; row < grid .length - 3; row++){
    for(int col = 0; col < grid [row].length - 3; col++){
        if((grid [row][col] == grid [row+1][col+1]) &&
                (grid [row+1][col+1] == grid [row+2][col+2]) &&
                (grid [row+2][col+2] == grid [row+3][col+3])){
            System.out.println("Someone won down-right!");
        }
    }
}

这是相对蛮力的,但应该用于简单的目的。

请注意,由于您没有在提议的示例中对角迭代(而是按行中的列,然后按行),您的count_piece将无法按预期执行。如果你坚持迭代:

for(int row = 0; row < grid .length - 3; row++){
    for(int col = 0; col < grid [row].length - 3; col++){
        int solution = true;
        for (int index = 0; index <= 2; ++index) {
            int rowIndex = row + index;
            int colIndex = col + index;
            if (grid [rowIndex][colIndex] != grid [rowIndex+1][colIndex+1]) {
                solution = false;
                break;
            }
        }
        if (solution) {
            System.out.println("Someone won down-right!");
        }
    }
}

似乎没必要。

答案 1 :(得分:0)

我会修改行的边界,将col循环修改为

for(int row = 0; row < board.length-1; row++){
    for(int col = 0; col < board[0].length-1; col++){

然后将成功条件修改为

                if(count_piece >= 3){

然后您可能需要手动检查“边缘”处的值。