2D阵列帮助(Tic Tac Toe)

时间:2015-02-05 00:12:25

标签: java arrays

   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 x 3 tic tac toe游戏中的胜利。我的问题是,如何更改内部数字以匹配任何大小的棋盘游戏,例如n x n?

目前它会检查第一行,第二行和第三行,以检查任何一个玩家是否在任何一行中获胜,然后是列和对角线。但是,当电路板尺寸改变为其他任何东西时,这不再成立,因为它不会检查每个可能的行/列/对角线。那么我如何才能为尺寸为n x n的电路板做到这一点。请不要编码,因为我不想抄袭,但如果有人能提供意见,我们将不胜感激吗?

4 个答案:

答案 0 :(得分:0)

如果你逐步完成数组,那么保证工作方法非常缓慢但是很强大,如果单元格不为空,请检查所有周围的单元格 - 如果找到由相同单元格类型组成的线条图案(圆形或x),然后你找到了胜利者。如果它没有找到线条图案,请移至下一个单元格并重复此过程,直到您覆盖整个板块或找到胜利者。

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

答案 1 :(得分:0)

我这样做的方法是编写一个单独的函数,它具有字段维度和播放器输入,例如:

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

一旦你完成了覆盖,将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!";

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

答案 2 :(得分:0)

你可以有四个循环 - 一个循环检查水平,垂直,NE-SW对角线和NW-SE对角线。

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

水平情况的示例:

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;
        }
    }
}

使用此概念,您还可以检查垂直和对角线的胜利。

答案 3 :(得分:0)

如果你被允许在你的任务中使用Java 8,那么这是一个非常好用的流。流解决方案看起来像:

  1. 生成代表最多n的数字的整数流(提示:IntStream.range
  2. 将其映射到2组值:相应行和col的内容(提示:Stream.flatMap
  3. 为两个对角线添加到该流集(提示:Stream.concat
  4. 过滤具有单个值的集合
  5. 如果您找到任何,您有一个胜利者(提示:Stream.findAny
  6. 如果你不知道溪流,那么这可能会有点令人困惑,但它最终会以一个非常优雅的方式表示获胜的棋盘(也就是说,让我排成一行并告诉我是否有任何一个一个值)。

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