井字游戏 horizontal/vertical 和对角线检查不起作用 - java
tic tac toe horizontal/vertical and diagonal check not wokring - java
我正在写一个井字游戏,除了检查(horizontal/vertical 和对角线)外,一切似乎都正常。我正在使用数组 (int [3][3]
) 制作电路板。
这些是我的支票:
private boolean wonStraightLines( int player)
{
boolean answer = false;
if (
((board[0][0] & board[0][1] & board[0][2]) == (player * 3)) ||
((board[1][0] & board[1][1] & board[1][2]) == (player * 3)) ||
((board[2][0] & board[2][1] & board[2][2]) == (player * 3)) ||
((board[0][0] & board[1][0] & board[2][0]) == (player * 3)) ||
((board[0][1] & board[1][1] & board[2][1]) == (player * 3)) ||
((board[0][2] & board[1][2] & board[2][2]) == (player * 3))
)
{
answer = true;
}
else {
answer = false;
}
return answer;
}
对角线:
private boolean wonDiagonal( int player)
{
boolean answer = false;
if (
((board[0][0] & board[1][1] & board[2][2]) == (player * 3)) || ((board[0][2] & board[1][1] & board[2][0]) == (player * 3))
)
{
answer = true;
}
else {
answer = false;
}
return answer;
}
当我 运行 程序每当 X 或 O 从任何方向获得 3 时,游戏保持 运行ning 而不是抛出 "you win" 消息。任何帮助,将不胜感激。不确定是否需要代码的任何其他部分。
编辑:我也尝试在板数组值之间使用 + 而不是 & 但效果不佳。
我假设每个元素的状态有 3 个唯一值,例如:
board[row][col] = 0 // no entry
board[row][col] = 1 // player 1
board[row][col] = 2 // player 2
player
的水平检查(使用行优先结构)看起来像这样:
(board[0][0] == player && board[0][1] == player && board[0][2] == player)
并为每一行重复。
垂直方向类似,每列重复:
(board[0][0] == player && board[1][0] == player && board[2][0] == player)
还有一个对角线:
(board[0][0] == player && board[1][1] == player && board[2][2] == player)
如果您决定使用算术运算,那么您必须更改 "player" 值以避免重叠,例如玩家 1 == 1 和玩家 2 == 4,例如:
board[row][col] = 0 // no entry
board[row][col] = 1 // player 1
board[row][col] = 4 // player 2
然后你可以对水平行做类似的事情:
((board[0][0] + board[0][1] + board[0][2]) == (player * 3))
注意 Java 8 和以后添加一个 int 数组(在你的情况下是一行或一列)可以稍微更简洁:
// sum the first row
(IntStream.of(board[0]).sum() == (player * 3))
现在,如果您真的想使用按位 "and" 操作,那么这是您的检查,假设初始元素值 (0,1,2) 如顶部所述:
// check if the player's "bit" is set in all elements of first row.
(board[0][0] & board[0][1] & board[0][2]) == player
我正在写一个井字游戏,除了检查(horizontal/vertical 和对角线)外,一切似乎都正常。我正在使用数组 (int [3][3]
) 制作电路板。
这些是我的支票:
private boolean wonStraightLines( int player)
{
boolean answer = false;
if (
((board[0][0] & board[0][1] & board[0][2]) == (player * 3)) ||
((board[1][0] & board[1][1] & board[1][2]) == (player * 3)) ||
((board[2][0] & board[2][1] & board[2][2]) == (player * 3)) ||
((board[0][0] & board[1][0] & board[2][0]) == (player * 3)) ||
((board[0][1] & board[1][1] & board[2][1]) == (player * 3)) ||
((board[0][2] & board[1][2] & board[2][2]) == (player * 3))
)
{
answer = true;
}
else {
answer = false;
}
return answer;
}
对角线:
private boolean wonDiagonal( int player)
{
boolean answer = false;
if (
((board[0][0] & board[1][1] & board[2][2]) == (player * 3)) || ((board[0][2] & board[1][1] & board[2][0]) == (player * 3))
)
{
answer = true;
}
else {
answer = false;
}
return answer;
}
当我 运行 程序每当 X 或 O 从任何方向获得 3 时,游戏保持 运行ning 而不是抛出 "you win" 消息。任何帮助,将不胜感激。不确定是否需要代码的任何其他部分。
编辑:我也尝试在板数组值之间使用 + 而不是 & 但效果不佳。
我假设每个元素的状态有 3 个唯一值,例如:
board[row][col] = 0 // no entry
board[row][col] = 1 // player 1
board[row][col] = 2 // player 2
player
的水平检查(使用行优先结构)看起来像这样:
(board[0][0] == player && board[0][1] == player && board[0][2] == player)
并为每一行重复。
垂直方向类似,每列重复:
(board[0][0] == player && board[1][0] == player && board[2][0] == player)
还有一个对角线:
(board[0][0] == player && board[1][1] == player && board[2][2] == player)
如果您决定使用算术运算,那么您必须更改 "player" 值以避免重叠,例如玩家 1 == 1 和玩家 2 == 4,例如:
board[row][col] = 0 // no entry
board[row][col] = 1 // player 1
board[row][col] = 4 // player 2
然后你可以对水平行做类似的事情:
((board[0][0] + board[0][1] + board[0][2]) == (player * 3))
注意 Java 8 和以后添加一个 int 数组(在你的情况下是一行或一列)可以稍微更简洁:
// sum the first row
(IntStream.of(board[0]).sum() == (player * 3))
现在,如果您真的想使用按位 "and" 操作,那么这是您的检查,假设初始元素值 (0,1,2) 如顶部所述:
// check if the player's "bit" is set in all elements of first row.
(board[0][0] & board[0][1] & board[0][2]) == player