2

所以我在java方面很新,我有一个任务来创建一个connect 4游戏。我创建了一个 6 行 7 列的板,其中充满了这样的字符->“-”,当用户输入所需的列时,它会用 B 或 R(红色或黑色检查器)替换“-”,无论这只是一个背景。一切正常,除了我检查对角线的代码非常长的部分,我想不出一种方法来遍历玩家可以获胜的所有可能的 4 组对角线,除非在不同的 for 循环中执行每组。 ..我知道这是可怕的希望你能帮我做的更短:(

这是对角线检查的代码:(大声笑只看着它让我感到难过)

    public class Connect4 {
          public static void main(String[] args) {

      //Create board

    Scanner input = new Scanner(System.in);
    char[][] grid = new char[6][7];

    for (int i = 0; i < grid.length; i++) {
      for (int j = 0; j < grid[0].length; j++) {
        grid[i][j] = '-';
      }
    }

 public static void checkWinner(char[][] grid) {      
try{

  //A LOT OF FOR LOOPS FOR DIAGONAL CHECKS
    for (int i = 5; i > 1; i-- ) {
     for(int j = 0; j < 4; j++) {
           if (   grid[i][j] == 'R' &&
                  grid[i-1][j+1] == 'R' &&
                  grid[i-2][j+2] == 'R' &&
                  grid[i-3][j+3] == 'R') {
                  System.out.println("Player 1 Wins!");
                  System.exit(0);
           }
           else if (  grid[i][j] == 'B' &&
                      grid[i-1][j+1] == 'B' &&
                      grid[i-2][j+2] == 'B' &&
                      grid[i-3][j+3] == 'B') {
                      System.out.println("Player 2 Wins!");
                      System.exit(0);
           }
         }
     }


     for (int i = 5; i > 1; i--) {
         for (int j = 1; j < 4; j++) {
                  if (grid[i][j] == 'R' &&
                      grid[i-1][j+1] == 'R' &&
                      grid[i-2][j+2] == 'R' &&
                      grid[i-3][j+3] == 'R') {
                      System.out.println("Player 1 Wins!");
                      System.exit(0);
              }
             else if (grid[i][j] == 'B' &&
                      grid[i-1][j+1] == 'B' &&
                      grid[i-2][j+2] == 'B' &&
                      grid[i-3][j+3] == 'B') {
                      System.out.println("Player 2 Wins!");
                      System.exit(0);
         }
     }
   }

     for (int i = 0; i < 4; i++) {
         for (int j = 4; j < 7; j++) {
             if (   grid[i][j] == 'R' &&
                      grid[i+1][j-1] == 'R' &&
                      grid[i+2][j-2] == 'R' &&
                      grid[i+3][j-3] == 'R') {
                      System.out.println("Player 1 Wins!");
                      System.exit(0);
         }
             else if (grid[i][j] == 'B' &&
                      grid[i+1][j-1] == 'B' &&
                      grid[i+2][j-2] == 'B' &&
                      grid[i+3][j-3] == 'B') {
                      System.out.println("Player 2 Wins!");
                      System.exit(0);
         }
     }
   }

     for (int i = 1; i < 2; i++) {
         for (int j = 6; j > 5; j--) {
             if (   grid[i][j] == 'R' &&
                      grid[i+1][j-1] == 'R' &&
                      grid[i+2][j-2] == 'R' &&
                      grid[i+3][j-3] == 'R') {
                      System.out.println("Player 1 Wins!");
                      System.exit(0);
                        }
             else if (grid[i][j] == 'B' &&
                      grid[i+1][j-1] == 'B' &&
                      grid[i+2][j-2] == 'B' &&
                      grid[i+3][j-3] == 'B') {
                      System.out.println("Player 2 Wins!");
                      System.exit(0);
         }
        }
     }

     for (int i = 4; i < 5; i++){
         for (int j = 2; j < 3; j++){
                  if (grid[i][j] == 'R' &&
                      grid[i-1][j+1] == 'R' &&
                      grid[i-2][j+2] == 'R' &&
                      grid[i-3][j+3] == 'R') {
                      System.out.println("Player 1 Wins!");
                      System.exit(0);
                  }
                  else if (grid[i][j] == 'B' &&
                          grid[i-1][j+1] == 'B' &&
                          grid[i-2][j+2] == 'B' &&
                          grid[i-3][j+3] == 'B') {
                          System.out.println("Player 2 Wins!");
                          System.exit(0);
                      }
        }
     }

     for (int i = 0; i < 4; i++) {
         for (int j = 3; j > 0; j--) {
                  if (grid[i][j] == 'R' &&
                      grid[i+1][j+1] == 'R' &&
                      grid[i+2][j+2] == 'R' &&
                      grid[i+3][j+3] == 'R') {
                      System.out.println("Player 1 Wins!");
                      System.exit(0);
                  }
                  else if (grid[i][j] == 'B' &&
                          grid[i+1][j+1] == 'B' &&
                          grid[i+2][j+2] == 'B' &&
                          grid[i+3][j+3] == 'B') {
                          System.out.println("Player 2 Wins!");
                          System.exit(0);
                      }
     }
   }

     for(int i =0; i < 1; i++) {
         for (int j = 0; j <1; j++) {
                  if (grid[i][j] == 'R' &&
                      grid[i+1][j+1] == 'R' &&
                      grid[i+2][j+2] == 'R' &&
                      grid[i+3][j+3] == 'R') {
                      System.out.println("Player 1 Wins!");
                      System.exit(0);
             }
                  else if (grid[i][j] == 'B' &&
                          grid[i+1][j+1] == 'B' &&
                          grid[i+2][j+2] == 'B' &&
                          grid[i+3][j+3] == 'B') {
                          System.out.println("Player 2 Wins!");
                          System.exit(0);
                 }
         }
     }

     for (int j = 0; j < 1; j++) {
         for(int i =1 ; i < 3; i++) {
                  if (grid[i][j] == 'R' &&
                      grid[i+1][j+1] == 'R' &&
                      grid[i+2][j+2] == 'R' &&
                      grid[i+3][j+3] == 'R') {
                      System.out.println("Player 1 Wins!");
                      System.exit(0);
                  }
                  else if (grid[i][j] == 'B' &&
                          grid[i+1][j+1] == 'B' &&
                          grid[i+2][j+2] == 'B' &&
                          grid[i+3][j+3] == 'B') {
                          System.out.println("Player 2 Wins!");
                          System.exit(0);
                      }
        }
     }

     for (int j = 3; j < 4; j++) {
     for (int i = 0; i < 3; i++) {
                  if (grid[i][j] == 'R' &&
                      grid[i+1][j+1] == 'R' &&
                      grid[i+2][j+2] == 'R' &&
                      grid[i+3][j+3] == 'R') {
                      System.out.println("Player 1 Wins!");
                      System.exit(0);
                  }
                  else if (grid[i][j] == 'B' &&
                          grid[i+1][j+1] == 'B' &&
                          grid[i+2][j+2] == 'B' &&
                          grid[i+3][j+3] == 'B') {
                          System.out.println("Player 2 Wins!");
                          System.exit(0);
                      }
         }
     }

     for (int i = 2; i < 3; i++) {
         for (int j = 2; j > 0; j--) {
                  if (grid[i][j] == 'R' &&
                      grid[i+1][j+1] == 'R' &&
                      grid[i+2][j+2] == 'R' &&
                      grid[i+3][j+3] == 'R') {
                      System.out.println("Player 1 Wins!");
                      System.exit(0);
                  }
                  else if (grid[i][j] == 'B' &&
                          grid[i+1][j+1] == 'B' &&
                          grid[i+2][j+2] == 'B' &&
                          grid[i+3][j+3] == 'B') {
                          System.out.println("Player 2 Wins!");
                          System.exit(0);
                     }
         }
     }

     for (int i = 1; i < 2; i++) {
         for (int j = 2; j < 3; j++){
                  if (grid[i][j] == 'R' &&
                      grid[i+1][j+1] == 'R' &&
                      grid[i+2][j+2] == 'R' &&
                      grid[i+3][j+3] == 'R') {
                      System.out.println("Player 1 Wins!");
                      System.exit(0);
                  }
                  else if (grid[i][j] == 'B' &&
                          grid[i+1][j+1] == 'B' &&
                          grid[i+2][j+2] == 'B' &&
                          grid[i+3][j+3] == 'B') {
                          System.out.println("Player 2 Wins!");
                          System.exit(0);
                   }
         }
     }

     for (int i = 1; i < 2; i++) {
         for (int j = 1; j < 2; j++){
                  if (grid[i][j] == 'R' &&
                      grid[i+1][j+1] == 'R' &&
                      grid[i+2][j+2] == 'R' &&
                      grid[i+3][j+3] == 'R') {
                      System.out.println("Player 1 Wins!");
                      System.exit(0);
                   }
                  else if (grid[i][j] == 'B' &&
                          grid[i+1][j+1] == 'B' &&
                          grid[i+2][j+2] == 'B' &&
                          grid[i+3][j+3] == 'B') {
                          System.out.println("Player 2 Wins!");
                          System.exit(0);
                   }
         }
     }
 }
catch(ArrayIndexOutOfBoundsException e){
    System.out.println("Exception thrown  :" + e);
 }
}
4

2 回答 2

3

与其检查棋盘上的每一个可能位,不如根据人类的游戏方式来玩游戏——只有当有人掉入一块棋子,然后形成一排四块瓷砖时,它才会连接 4。所以:不要检查所有可能的图块,使用刚刚放入的图块,只检查涉及该图块的行:

  • 这个新瓷砖是否形成水平?这意味着检查第 3 列到第 3 列以覆盖所有可能的水平。
  • 这个新瓷砖是否形成垂直?这意味着只检查它下面的三个瓷砖。
  • 这个新瓷砖是否形成对角线?这意味着检查 {column-3, row-2} 到 {column+3, row+3} 以覆盖所有可能的对角线。我们甚至可以在检查水平线的同时检查这一点,因为它遍历相同的第 3 列到第 3 列范围。

您已经知道瓷砖具有什么“颜色”,因此您的检查(在假代码中)将只是以下形式:

int stretch = 0;
if( <THE CHECK TILE COLOR>.equals(<DROPPED TILE COLOR>)) {
  // check the next possible tile
  stretch++;
} else { stretch = 0; }

如果您找到的具有相同颜色的最大瓷砖长度为 4,则完成。如果没有,则没有connect-4。

也就是说,这是一项家庭作业:当您在编程时遇到问题时,SO 会在这里为您服务,但我们不是来为您做作业的。如果您遇到困难,请询问您的同学甚至您的老师。互联网并不是唯一寻求帮助的地方,尤其是在你上课的时候。

于 2013-09-19T16:09:22.557 回答
1

我不会在 if 语句中对其进行编码,例如,对于 \ 对角线,我会简单地从硬币的位置开始并沿右下方向计数,在颜色改变或边框变为之前,有多少相同的颜色到达。左上方向也一样。

最后,我将简单地检查两个计数的总和加一是否大于或等于 4。

/对角线的方法相同。

警告:您对 - 和 | 的实现 还没有数组边界检查。我也会为他们推荐计数方法。

Ps 为了使您的代码更清晰,请将每个检查放在一个单独的方法中:

isHorizonallWin(x,y,color,grid)
isVerticalWin(x,y,color,grid)
isLdiagonalLeftUpper2RightLowerWin(x,y,color,grid)
isLdiagonalRightUpper2leftLowerWin(x,y,color,grid)
于 2013-09-19T16:09:24.543 回答