Java 二维阵列帮助(Tic Tac Toe)

Java 二维阵列帮助(Tic Tac Toe),java,arrays,Java,Arrays,此代码测试标准3 x 3井字游戏中的胜利。我的问题是,我如何改变里面的数字来匹配任何大小的棋盘,比如nxn 目前,它检查第一行、第二行和第三行,以检查任一玩家是否在任何一行中获胜,接下来是列和对角线。但是,当线路板大小更改为任何其他大小时,这不再适用,因为它不会检查所有可能的行/列/对角线。那么,我怎样才能让它对一块大小为nxn的板这样做呢。请不要编写代码,因为我不想剽窃,但如果有人能提供输入,我将不胜感激。如果你通过数组,并且单元格不是空的,那么一种非常缓慢但可以保证有效的方法就是,检查所有周

此代码测试标准3 x 3井字游戏中的胜利。我的问题是,我如何改变里面的数字来匹配任何大小的棋盘,比如nxn


目前,它检查第一行、第二行和第三行,以检查任一玩家是否在任何一行中获胜,接下来是列和对角线。但是,当线路板大小更改为任何其他大小时,这不再适用,因为它不会检查所有可能的行/列/对角线。那么,我怎样才能让它对一块大小为nxn的板这样做呢。请不要编写代码,因为我不想剽窃,但如果有人能提供输入,我将不胜感激。

如果你通过数组,并且单元格不是空的,那么一种非常缓慢但可以保证有效的方法就是,检查所有周围的单元格-如果您发现由相同单元格类型圆圈或x组成的线型,则您找到了一个赢家。如果找不到线条图案,请移动到下一个单元格并重复此过程,直到覆盖整个棋盘或找到赢家为止


例如,从单元格0开始,0找到一个x。0,0检查0,1;1, 0; 1, 1. 找不到获胜模式,因此请转到0、1并再次检查所有相邻单元格。

我的方法是编写一个单独的函数,该函数具有字段尺寸和玩家输入,例如:

   public boolean isWin()
    {


       boolean winner= false;
       //checks rows first
       if(gameBoard[currentRow][0]==playerOne&&gameBoard[currentRow][1]==playerOne&&gameBoard[currentRow][2]==playerOne)
       {
           winner= true;
       }
       else if(gameBoard[currentRow][0]==playerTwo&&gameBoard[currentRow][1]==playerTwo&&gameBoard[currentRow][2]==playerTwo)
       {
           winner= true;
       }

       //checks columns next
       if(gameBoard[0][currentCol]==playerOne&&gameBoard[1][currentCol]==playerOne&&gameBoard[2][currentCol]==playerOne)
       {
           winner=true;
       }
       else if(gameBoard[0][currentCol]==playerTwo&&gameBoard[1][currentCol]==playerTwo&&gameBoard[2][currentCol]==playerTwo)
       {
           winner=true;
       }

       //checks one diagonal
       if(gameBoard[0][0]==playerOne&&gameBoard[1][1]==playerOne&&gameBoard[2][2]==playerOne)
       {
           winner=true;
       }
       else if(gameBoard[0][0]==playerTwo&&gameBoard[1][1]==playerTwo&&gameBoard[2][2]==playerTwo)
       {
           winner=true;
       }

       //checks other diagonal
       if(gameBoard[2][0]==playerOne&&gameBoard[1][1]==playerOne&&gameBoard[0][2]==playerOne)
       {
           winner=true;
       }
       else if(gameBoard[2][0]==playerTwo&&gameBoard[1][1]==playerTwo&&gameBoard[0][2]==playerTwo)
       {
           winner=true;
       }
       return winner;
   }
一旦你覆盖了,放置3个嵌套的水平、垂直、对角循环,并检查每个玩家的获胜条件:

String whoWinner(int d, int p1, int p2)

这是一种缓慢的方法,但如果场尺寸达到,我不知道,1000,我认为你不应该有任何问题。

你可以有四个循环-一个循环检查水平、垂直、东北-西南对角线和西北-东南对角线

考虑横向情况:假设你仍然只需要三个连续赢,你需要检查每一行是否可能赢,即检查同一玩家是否有三个连续赢。一个水平的三合一行需要在第n-3列之前开始,否则它将超过电路板的边界。因此,通过检查从第0列到第n-3列开始的每个可能的水平三合一行,对于每一行,将找到任何水平赢

水平情况的示例:

if (arr[i][j]='x') p1+=1;
if (arr[i][j]='o') p2+=1;

if (p1==d) return "P1 wins!";
if (p2==d) return "P2 wins!";

使用这个概念,你可以检查垂直和对角线的胜利以及

如果允许您在作业中使用Java 8,那么这是流的一个非常好的使用。流解决方案如下所示:

生成表示最多n个数字的整数流提示:IntStream.range 将其映射到两组值:对应行和列的内容提示:Stream.flatMap 添加到两条对角线的流集提示:stream.concat 筛选具有单个值的集合 如果你找到了,你会得到一个赢家提示:Stream.findAny 如果您不知道streams,那么这可能会有点混乱,但它最终会非常优雅地表示一个获胜的棋盘,也就是说,让我把所有的组都排成一行,并告诉我是否有任何组只有一个值


这样做的一个很好的特点是,如果非常大的电路板需要,它可以简单地转换为并行流。

不知道如何做到这一点。但我有个主意。如果对于行和列,我运行了一个从0开始的for循环,该循环在0不再小于n时结束,当然每次递增0。然后说ifgameBoard[i]==playeron&&gameBoard[i+1]回答=true;当然,对角for循环不会在整个过程中迭代,因为您只需要检查[1][1]、[2][2]等,然后反转一个
for (int j = 0; j < n; j++) {
    for (int i = 0; i < n-3; i++) {
        if (gameBoard[i][j] == gameBoard[i+1][j] && gameBoard[i][j] == gameBoard[i+2][j]) {
            return true;
        }
    }
}