Java tic tac toe水平/垂直和对角检查非沃克林-爪哇
我正在写一个tic-tac-toe游戏,除了检查(水平/垂直和对角线)之外,其他一切似乎都正常。我正在使用一个数组(Java tic tac toe水平/垂直和对角检查非沃克林-爪哇,java,tic-tac-toe,Java,Tic Tac Toe,我正在写一个tic-tac-toe游戏,除了检查(水平/垂直和对角线)之外,其他一切似乎都正常。我正在使用一个数组(int[3][3])来制作电路板 这是我的支票: private boolean wonStraightLines( int player) { boolean answer = false; if ( ((board[0][0] & board[0][1] & board[0][2]) == (playe
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;
}
(board[0][0] == player && board[1][1] == player && board[2][2] == player)
当我运行程序时,无论X或O从任何方向得到3,游戏都会继续运行,而不是抛出“你赢了”的消息。任何帮助都将不胜感激。不确定是否需要代码的任何其他部分
编辑:我还尝试在线路板阵列值之间使用+而不是&,但效果不好。我假设每个元素的状态有3个唯一的值,例如:
board[row][col] = 0 // no entry
board[row][col] = 1 // player 1
board[row][col] = 2 // player 2
如果不聪明的话,播放器的水平检查(使用行主结构)将如下所示:
(board[0][0] == player && board[0][1] == player && board[0][2] == player)
然后每行重复一次
垂直方向也类似,每列重复:
(board[0][0] == player && board[1][0] == player && board[2][0] == player)
和一条对角线:
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;
}
(board[0][0] == player && board[1][1] == player && board[2][2] == player)
如果决定使用算术运算,则必须更改“player”值以避免重叠,如player 1==1和player 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
你确定你的直线运行正常吗?你保留了什么值?可能是0,1或2?甚至现在都不能假设。player
的可能变量是什么?将&
更改为+
是HUUUGE逻辑更改。。。我认为您应该使用&
逻辑运算符,而不是&
位运算符。使用&
时,需要将每个操作数与播放器*3
进行比较,为什么要使用位运算符(&
)?我假设您知道和/&
按位运算符根据每个操作数的位到位副本返回值,仅当每个操作数在该位中有1时,才将该位设为1,否则为0。按位表达式计算为int,并将其与player*3
进行比较。我不打算讨论这种可能性,因为我认为您希望使用逻辑&
而不是&
按位。在Java中,没有简单的简写法可以将多个变量与另一个变量进行比较。它必须是a==X&&b==X&&c==X
。这就是@user7的问题,它们都不工作,这就是我的问题所在,我尝试使用&和+但都没有work@itwasntme我认为我没有保留任何值,player的变量是一个player(定义为int)我尝试使用&&但显然不适用于整数和数组类型looks好的,我只是想要求某人做更多的研究,或者简单地问更多的问题(或者至少有更多的细节)。这里可能需要按位运算(无论使用它们的原因如何),也可能保留等式,但需要所有其他使用的值(并且可能将0
更改为更大的值以避免错误结果)。不管怎样,你的看起来不错,在和之间做一个小小的解释就好了。有(prbbly)标准API方法用于矩阵的变形,因此IntStream可以与对角线一起使用。