【问题标题】:2D Array Help(Tic Tac Toe)2D 阵列帮助(井字游戏)
【发布时间】:2015-04-04 17:16:02
【问题描述】:
   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 井字游戏中的胜利。我的问题是,我将如何更改里面的数字以匹配任何大小的棋盘游戏,例如 n x n?

目前,它会检查第一行、第二行和第三行,以检查是否有玩家在任何一行中获胜,然后是列和对角线。但是,当电路板大小更改为其他任何值时,这不再适用,因为它不会检查每个可能的行/列/对角线。那么我将如何让它为大小为 n x n 的板做到这一点。请不要代码,因为我不想抄袭,但如果有人能提供意见,将不胜感激?

【问题讨论】:

    标签: java arrays


    【解决方案1】:

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

    1. 生成一个整数流,表示不超过n 的数字(提示:IntStream.range
    2. 将其映射到两组值:对应行和列的内容(提示:Stream.flatMap
    3. 为两条对角线添加到该流集(提示:Stream.concat
    4. 过滤具有单个值的集合
    5. 如果你找到了,你就有了赢家(提示:Stream.findAny

    如果您不了解流,那么这可能会有点令人困惑,但它最终会以非常优雅的方式表示获胜板(即让我将所有组排成一行并告诉我是否只有一个值)。

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

    【讨论】:

      【解决方案2】:

      您可以有四个循环 - 一个循环检查水平、垂直、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】:

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

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

        一旦你知道了,放置 3 个嵌套的 for 循环(水平、垂直、对角线)并检查每个玩家的获胜条件:

        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,我认为你应该没有任何问题。

        【讨论】:

        • 当然,对角 for 循环不会一直迭代,因为您只需要检查 [1][1]、[2][2] 等(并反转一个)
        【解决方案4】:

        如果您逐步遍历数组,并且如果单元格不为空,请检查所有周围的单元格 - 如果您发现由相同单元格类型(圆形或x),那么你找到了一个赢家。如果没有找到线条图案,请移至下一个单元格并重复该过程,直到您覆盖整个板或找到获胜者。

        例如,从单元格0, 0 开始并找到一个 x。 0, 0 检查0, 1; 1, 0; 1, 1。未找到中奖模式,请转至0, 1 并再次检查所有相邻单元格。

        【讨论】:

        • 不知道该怎么做。但我有一个想法。如果对于行和列,我从 0 开始运行一个 for 循环,当 0 不再小于 n 时结束,当然每次都递增 0。然后说 if(gameBoard[i]==playerOne&&gameBoard[i+1]) answer=true;
        猜你喜欢
        • 2013-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-31
        • 1970-01-01
        • 2015-07-09
        • 1970-01-01
        相关资源
        最近更新 更多