Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java tic tac toe水平/垂直和对角检查非沃克林-爪哇_Java_Tic Tac Toe - Fatal编程技术网

Java 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

我正在写一个tic-tac-toe游戏,除了检查(水平/垂直和对角线)之外,其他一切似乎都正常。我正在使用一个数组(
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可以与对角线一起使用。