在Gomoku的一场比赛中,一个玩家必须连续5次获胜。检测对角线赢是个问题。
我试过下面的代码,从右上角搜索一个2d矩阵,直到找到一个我们正在寻找的玩家标记,例如1,然后从该点开始对角搜索,找到一个获胜的行如果算法遇到的第一个“1”是获胜行的一部分,则此操作很有效如果不是,而且只是一个随机片段,则算法返回false,因为它不会继续搜索。
我该怎么做游戏的最后一步,只搜索与该步相关的对角线或者可能编辑提供的代码来搜索整个电路板。

public boolean is_diagonal_win_left(int player) {
    int i = 0;
    for (int col = board_size-1; col > (win_length - 2); col--) {
        for (int row = 0; row < board_size-(win_length-1); row++) {
            while (board_matrix[row][col] == player) {
                i++;
                row++;
                col--;
                if (i == win_length) return true;
            }
            i = 0;
        }
    }
    return false;
}

//solved

public boolean is_diagonal_win_right(int player, int r, int c) {

        int count = 0;
        int row = r;
        int col = c;

        while ((row != 0) && (col != 0)) {
            row--;
            col--;
        }

        while ((row <= board_size - 1) && (col <= board_size - 1)) {
            if (board_matrix[row][col] == player) count++;
            row++;
            col++;
        }

        return count == win_length;
    }

最佳答案

你说得对:在电路板上搜索第一个计数器是无效的;搜索整个电路板是浪费时间从最近的动作开始。让我们调用那个位置;玩家的标记仍然是。检查八个功能方向中的每一个,查看(r, c)字符串的长度例如,检查nw-se对角线如下:

count = 1     // We just placed one counter
row = r-1; col = c-1
while ( (row >= 0) and (col >= 0) and
        (board_matrix[row][col] == player) )
    count += 1

row = r+1; col = c+1
while ( (row < board_size) and (col < board_size) and
        (board_matrix[row][col] == player) )
    count += 1

// Note: gomoku rules require exactly 5 in a row;
//   if you're playing with a"at least 5", then adjust this to >=
if (count == win_length) {
    // Process the win
}

关于java - 连续检测对角线胜利-井字游戏,五子棋,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57616181/

10-13 04:37