gpt4 book ai didi

java - 检查 2D 数组中的 4 个连续相同的对角线元素(Connect 4 游戏)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:27:08 25 4
gpt4 key购买 nike

我正致力于在 Java 上实现 connect 4 Game。我差不多完成了模拟游戏的程序。

我使用二维字符数组 char [][] board = new char[6][7]; 来表示游戏的网格。

我已经实现了 checkHorizo​​ntal 方法来查找是否有 4 个连续的相同水平元素来检查获胜条件。我还实现了 checkVertical 方法来查找是否有 4 个连续的相同垂直元素来检查获胜条件。

我在编写 checkDiagonal 方法的算法时有点困惑,该方法检查二维数组中 4 个连续相同对角线元素的所有可能性。

以下是游戏中对角线获胜案例的 2 个示例

案例一:

 * * * * * * *
* * * * * * *
Y * * * * * *
R Y * * Y * *
Y R Y R Y R R
R Y R Y R Y R

案例二:

 * * * * * * *
* * * * * * *
* * * * * R *
* * * * R Y *
* * * R Y R *
Y Y R Y R Y R

如何检查来解决这些情况?

最佳答案

您只需要检查新类型 type 的放置位置,因为游戏区域的其余部分保持不变。在那里,你可以做这样的事情:

/** 
* Counts pieces of the given type, starting at (y, x),
* in the direction denoted by (dy, dx).
* Stops at field boundaries or when a different field type is encountered.
*/
int count(char type, int x, int y, int dx, int dy) {
int count = 0;
x += dx; // Skip the piece at (y, x) to avoid counting it twice
y += dy; // when looking in both directions on a line.
while (x >= 0 && x < 7 && y >= 0 && y < 6 && board[x][y] == type) {
count++;
x += dx; // Move in the direction denoted by (dy, dx)
y += dy;
}
return count;
}

/**
* Main entry point after a new piece of type `type` was added at (y, x).
* Returns true if this connects 4 or more in any direction.
*/
boolean check(char type, int x, int y) {
return count(type, x, y, -1, 0) + 1 + count(type, x, y, 1, 0) >= 4 // horizontal
|| count(type, x, y, 0, -1) + 1 + count(type, x, y, 0, 1) >= 4 // vertical
|| count(type, x, y, -1, -1) + 1 + count(type, x, y, 1, 1) >= 4 // diagonal
|| count(type, x, y, -1, 1) + 1 + count(type, x, y, 1, -1) >= 4);
}

dx 和 dy 检查参数用于在不同的方向上移动,而无需为每个方向设置单独的方法。

在您的水平检查代码中,您可能通过在循环中将 1 加到 x(保持 y 不变,即,将 0 加到 y)来移动到下一段。在您的垂直检查代码中,您通过将 1 加到 y(以及将 0 加到 x)来移动到下一 block 。要沿对角线移动,您需要将 x 和 y 坐标都加 1。

为了能够使用单一方法检查所有方向,check() 使用参数作为移动方向:dx = 1 和 dy = 0 在每一步中将 1 加到 x 并将 0 加到 y,所以你做一个横向检查。当 dx = 0 和 dy = 1 时,您进行垂直检查。

编辑:去掉了检查助手,因为它只在一个地方真正需要

关于java - 检查 2D 数组中的 4 个连续相同的对角线元素(Connect 4 游戏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41623032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com