【问题标题】:Tic Tac Toe Java Almost Done except for slight display errorTic Tac Toe Java 几乎完成,除了轻微的显示错误
【发布时间】:2013-10-24 05:27:13
【问题描述】:

更新* 好的,我的代码工作得很好,除了分配的参数让我这样打印语句:

"为玩家 X 输入一行 (0,1,2):"

然后输入一个数字。

"输入玩家 X 的 col (0,1,2):"

然后输入一个数字。

现在我的代码把事情放在了正确的位置,但这就是我的输出的样子:

Who wants to go first (X or O)? 
X
Enter a row (0,1,2) for player X: 
Enter a column (0,1,2) for player X: 
0
1
-------------
|   | X |   |
-------------
|   |   |   |
-------------
|   |   |   |
-------------

我需要我的代码在这样的每个语句之后选择:

Who wants to go first (X or O)? 
X
Enter a row (0,1,2) for player X:
0 
Enter a column (0,1,2) for player X: 
1
-------------
|   | X |   |
-------------
|   |   |   |
-------------
|   |   |   |
-------------

这是我的代码更新!如何解决这个小错误?我一直在这方面来回走动。

import java.util.*;

public class TicTacMessAroundCode {

   //declare constants
   public static final int BLANK = 0;
   public static final int EX = 1;
   public static final int CIRCLE = 2;

   // Name-constants to represent the various states of the game
   public static final int PLAYING = 0;
   public static final int DRAW = 1;
   public static final int EX_WON = 2;
   public static final int CIRCLE_WON = 3;

   // The game board and the game status
   public static final int SIZE = 3; //size of each row and each column
   public static int[][] board = new int[SIZE][SIZE]; // game board

   public static int currentState;  // the current state of the game
                                    // (PLAYING, DRAW, EX_WON, CIRCLE_WON)
   public static int currentPlayer; // the current player (EX or CIRCLE)
   public static int currentRow, currentCol; // current seed's row and column

   public static Scanner in = new Scanner(System.in); 

   /** The entry main method (the program starts here) */
   public static void main(String[] args) {
      // Initialize the game-board and current status
      initializeBoard();
      //Start playing game
      do {
         getMove(currentPlayer); // update currentRow and currentCol
         updateGame(currentPlayer, currentRow, currentCol); // update currentState
         displayBoard();
         // Print message if game-over
         if (currentState == EX_WON) {
            System.out.println("'X' player won!");
         } else if (currentState == CIRCLE_WON) {
            System.out.println("'O' player won!");
         } else if (currentState == DRAW) {
            System.out.println("It's a Draw!!");
         }
         // Switch player
         currentPlayer = (currentPlayer == EX) ? CIRCLE : EX;
      } while (currentState == PLAYING); // repeat if not game-over
   }

   //initializeBoard method
   public static void initializeBoard() {
      for (int row = 0; row < SIZE; ++row) {
         for (int col = 0; col < SIZE; ++col) {
            board[row][col] = BLANK;  // all cells empty
         }
      }
      currentState = PLAYING; // ready to play

      System.out.println("Who wants to go first (X or O)? ");
      Scanner xOrO = new Scanner(System.in);
      String entOp = xOrO.nextLine();
      char enterOp = entOp.charAt(0);

      if (enterOp == 'X'){  
         currentPlayer = EX;  // X plays first
      } else {
         currentPlayer = CIRCLE;
      }
   }

   //getMove method: to prompt the current player for target position. 
   public static void getMove(int theSeed) {    
      boolean validInput = false;  // for input validation
      do {
      if (theSeed == EX){
           System.out.println("Enter a row (0,1,2) for player X: ");
           Scanner enterRow = new Scanner(System.in); 

           System.out.println("Enter a column (0,1,2) for player X: ");
           Scanner enterCol = new Scanner(System.in);       
      }  else {
           System.out.println("Enter a row (0,1,2) for player O: ");
           Scanner enterRow = new Scanner(System.in);         

           System.out.println("Enter a column (0,1,2) for player O: ");
           Scanner enterCol = new Scanner(System.in);

      }    
         int row = in.nextInt();
         int col = in.nextInt();            
         if (row >= 0 && row < SIZE && col >= 0 && col < SIZE && board[row][col] == BLANK) {
            currentRow = row;
            currentCol = col;
            board[currentRow][currentCol] = theSeed;  // update game-board content
            validInput = true;  // input okay, exit loop
         } else {
            System.out.println("This move at (" + (row) + "," + (col) // column adjustment
                  + ") is not valid. Try again...");
         }
      } while (!validInput);  // repeat until input is valid
   }

   /** Update the "currentState" after the player with "theSeed" has placed on
       (currentRow, currentCol). */
   public static void updateGame(int theSeed, int currentRow, int currentCol) {
      if (findWinner(theSeed, currentRow, currentCol)) {  // check if winning move
         currentState = (theSeed == EX) ? EX_WON : CIRCLE_WON;
      } else if (isDraw()) {  // check for draw
         currentState = DRAW;
      }
      // Otherwise, no change to currentState (still PLAYING).
   }

   /** Return true if it is a draw (no more empty cell) */
   // TODO: Shall declare draw if no player can "possibly" win
   public static boolean isDraw() {
      for (int row = 0; row < SIZE; ++row) {
         for (int col = 0; col < SIZE; ++col) {
            if (board[row][col] == BLANK) {
               return false;  // an empty cell found, not draw, exit
            }
         }
      }
      return true;  // no empty cell, it's a draw
   }

   /** Return true if the player with "theSeed" has won after placing at
       (currentRow, currentCol) */
   public static boolean findWinner(int theSeed, int currentRow, int currentCol) {
      return (board[currentRow][0] == theSeed         // 3-in-the-row
                   && board[currentRow][1] == theSeed
                   && board[currentRow][2] == theSeed
              || board[0][currentCol] == theSeed      // 3-in-the-column
                   && board[1][currentCol] == theSeed
                   && board[2][currentCol] == theSeed
              || currentRow == currentCol            // 3-in-the-diagonal
                   && board[0][0] == theSeed
                   && board[1][1] == theSeed
                   && board[2][2] == theSeed
              || currentRow + currentCol == 2  // 3-in-the-opposite-diagonal
                   && board[0][2] == theSeed
                   && board[1][1] == theSeed
                   && board[2][0] == theSeed);
   }

   //displayBoard method/ 
   public static void displayBoard() {
      System.out.println("-------------");
      for (int row = 0; row < SIZE; ++row) {
      System.out.print("|");
         for (int col = 0; col < SIZE; ++col) {
            printCell(board[row][col]); 
            if (col != SIZE) {
               System.out.print("|");   
            }
         }
         System.out.println();
         if (row != SIZE) {
            System.out.println("-------------"); 
         }
      }
      System.out.println();
   }

   /** Print a cell with the specified "content" */
   public static void printCell(int content) {
      switch (content) {
         case BLANK:  System.out.print("   "); break;
         case CIRCLE: System.out.print(" O "); break;
         case EX:  System.out.print(" X "); break;
      }
   }
}

【问题讨论】:

    标签: java arrays multidimensional-array tic-tac-toe


    【解决方案1】:

    更新:您的输入打印异常,因为您正在为每个输入提示声明新的 Scanner 对象。您之前的代码很好。

    您的代码几乎是正确的。但是,您的 rowcol 变量出错了。

    您的原始代码在不同的范围内多次声明它们:

    if (theSeed == EX){
           System.out.println("Enter a row (0,1,2) for player X: ");
         int row = in.nextInt() - 1; 
          System.out.println("Enter a column (0,1,2) for player X: ");
         int col = in.nextInt() - 1;        
      }  else {
           System.out.println("Enter a row (0,1,2) for player O: ");
         int row = in.nextInt() - 1;          
           System.out.println("Enter a column (0,1,2) for player O: ");
         int col = in.nextInt() - 1;
      }  
         int row = 0;
         int col = 0;
    

    这是不正确的,因为它们首先仅在 if 语句的范围内声明,然后又在 if 之外声明。因此,在此代码块的末尾,rowcol 始终等于 0。

    顺便说一句,您还不必要地从用户输入中减去了 1。

    您的代码如下所示,稍作修改并进行了更正。

    import java.util.*;
    
    public class TicTacMessAroundCode {
    
       //declare constants
       public static final int BLANK = 0;
       public static final int EX = 1;
       public static final int CIRCLE = 2;
    
       // Name-constants to represent the various states of the game
       public static final int PLAYING = 0;
       public static final int DRAW = 1;
       public static final int EX_WON = 2;
       public static final int CIRCLE_WON = 3;
    
       // The game board and the game status
       public static final int SIZE = 3; //size of each row and each column
       public static int[][] board = new int[SIZE][SIZE]; // game board
    
       public static int currentState;  // the current state of the game
                                        // (PLAYING, DRAW, EX_WON, CIRCLE_WON)
       public static int currentPlayer; // the current player (EX or CIRCLE)
       public static int currentRow, currentCol; // current seed's row and column
    
       public static Scanner in = new Scanner(System.in); 
    
       /** The entry main method (the program starts here) */
       public static void main(String[] args) {
          // Initialize the game-board and current status
          initializeBoard();
          //Start playing game
          do {
             getMove(currentPlayer); // update currentRow and currentCol
             updateGame(currentPlayer, currentRow, currentCol); // update currentState
             displayBoard();
             // Print message if game-over
             if (currentState == EX_WON) {
                System.out.println("'X' player won!");
             } else if (currentState == CIRCLE_WON) {
                System.out.println("'O' player won!");
             } else if (currentState == DRAW) {
                System.out.println("It's a Draw!!");
             }
             // Switch player
             currentPlayer = (currentPlayer == EX) ? CIRCLE : EX;
          } while (currentState == PLAYING); // repeat if not game-over
       }
    
       //initializeBoard method
       public static void initializeBoard() {
          for (int row = 0; row < SIZE; ++row) {
             for (int col = 0; col < SIZE; ++col) {
                board[row][col] = BLANK;  // all cells empty
             }
          }
          currentState = PLAYING; // ready to play
    
          System.out.println("Who wants to go first (X or O)? ");
          Scanner xOrO = new Scanner(System.in);
          String entOp = xOrO.nextLine();
          char enterOp = entOp.charAt(0);
    
          if (enterOp == 'X'){  
             currentPlayer = EX;  // X plays first
          } else {
             currentPlayer = CIRCLE;
          }
       }
    
       //getMove method: to prompt the current player for target position. 
       public static void getMove(int theSeed) {    
          boolean validInput = false;  // for input validation
          do {
    
              int row = 0;   // Changed scope of these variables.
              int col = 0;   // Changed scope of these variables.
    
          if (theSeed == EX){
               System.out.println("Enter a row (0,1,2) for player X: ");
             row = in.nextInt(); // Removed "- 1"
              System.out.println("Enter a column (0,1,2) for player X: ");
             col = in.nextInt(); // Removed "- 1" 
          }  else {
               System.out.println("Enter a row (0,1,2) for player O: ");
             row = in.nextInt(); // Removed "- 1"      
               System.out.println("Enter a column (0,1,2) for player O: ");
             col = in.nextInt(); // Removed "- 1"
          }            
             if (row >= 0 && row < SIZE && col >= 0 && col < SIZE && board[row][col] == BLANK) {
                currentRow = row;
                currentCol = col;
                board[currentRow][currentCol] = theSeed;  // update game-board content
                validInput = true;  // input okay, exit loop
             } else {
                System.out.println("This move at (" + (row) + "," + (col) // column adjustment
                      + ") is not valid. Try again...");
             }
          } while (!validInput);  // repeat until input is valid
       }
    
       /** Update the "currentState" after the player with "theSeed" has placed on
           (currentRow, currentCol). */
       public static void updateGame(int theSeed, int currentRow, int currentCol) {
          if (findWinner(theSeed, currentRow, currentCol)) {  // check if winning move
             currentState = (theSeed == EX) ? EX_WON : CIRCLE_WON;
          } else if (isDraw()) {  // check for draw
             currentState = DRAW;
          }
          // Otherwise, no change to currentState (still PLAYING).
       }
    
       /** Return true if it is a draw (no more empty cell) */
       // TODO: Shall declare draw if no player can "possibly" win
       public static boolean isDraw() {
          for (int row = 0; row < SIZE; ++row) {
             for (int col = 0; col < SIZE; ++col) {
                if (board[row][col] == BLANK) {
                   return false;  // an empty cell found, not draw, exit
                }
             }
          }
          return true;  // no empty cell, it's a draw
       }
    
       /** Return true if the player with "theSeed" has won after placing at
           (currentRow, currentCol) */
       public static boolean findWinner(int theSeed, int currentRow, int currentCol) {
          return (board[currentRow][0] == theSeed         // 3-in-the-row
                       && board[currentRow][1] == theSeed
                       && board[currentRow][2] == theSeed
                  || board[0][currentCol] == theSeed      // 3-in-the-column
                       && board[1][currentCol] == theSeed
                       && board[2][currentCol] == theSeed
                  || currentRow == currentCol            // 3-in-the-diagonal
                       && board[0][0] == theSeed
                       && board[1][1] == theSeed
                       && board[2][2] == theSeed
                  || currentRow + currentCol == 2  // 3-in-the-opposite-diagonal
                       && board[0][2] == theSeed
                       && board[1][1] == theSeed
                       && board[2][0] == theSeed);
       }
    
       //displayBoard method/ 
       public static void displayBoard() {
          System.out.println("-------------");
          for (int row = 0; row < SIZE; ++row) {
          System.out.print("|");
             for (int col = 0; col < SIZE; ++col) {
                printCell(board[row][col]); 
                if (col != SIZE) {
                   System.out.print("|");   
                }
             }
             System.out.println();
             if (row != SIZE) {
                System.out.println("-------------"); 
             }
          }
          System.out.println();
       }
    
       /** Print a cell with the specified "content" */
       public static void printCell(int content) {
          switch (content) {
             case BLANK:  System.out.print("   "); break;
             case CIRCLE: System.out.print(" O "); break;
             case EX:  System.out.print(" X "); break;
          }
       }
    }
    

    【讨论】:

    • 你先生,赢得生活!
    【解决方案2】:

    您将值存储在变量行/列中。超出范围,您声明另一个变量 row/col 并将 0 分配给它们。它不能工作!

    尝试这样的事情(未经测试,可能需要一些调整):

       public static void getMove(int theSeed) {    
          int row = 0;
          int col = 0;   
          boolean validInput = false;  // for input validation
          do {
          if (theSeed == EX){
               System.out.println("Enter a row (0,1,2) for player X: ");
             row = in.nextInt(); 
              System.out.println("Enter a column (0,1,2) for player X: ");
             col = in.nextInt();        
          }  else {
               System.out.println("Enter a row (0,1,2) for player O: ");
             row = in.nextInt();          
               System.out.println("Enter a column (0,1,2) for player O: ");
             col = in.nextInt();
          }  
    
             if (row >= 0 && row < SIZE && col >= 0 && col < SIZE && board[row][col] == BLANK) {
                currentRow = row;
                currentCol = col;
                board[currentRow][currentCol] = theSeed;  // update game-board content
                validInput = true;  // input okay, exit loop
             } else {
                System.out.println("This move at (" + (row) + "," + (col) // column adjustment
                      + ") is not valid. Try again...");
             }
          } while (!validInput);  // repeat until input is valid
       }
    

    【讨论】:

      【解决方案3】:
         int row = in.nextInt() - 1; 
                System.out.println("Enter a column (0,1,2) for player X: ");
               int col = in.nextInt() - 1;        
            }  else {
                 System.out.println("Enter a row (0,1,2) for player O: ");
               int row = in.nextInt() - 1;          
                 System.out.println("Enter a column (0,1,2) for player O: ");
               int col = in.nextInt() - 1;
            }  
               int row = 0;
               int col = 0;   
      
      1. 为什么要减去 1?您已经要求用户输入 0/1/2。
      2. 删除int row/col=0。这往往会将 row/col 设置为 0。

      【讨论】:

        【解决方案4】:

        您需要在此处删除-1

        int col = in.nextInt() - 1;int col = in.nextInt() - 1;

        并在上面声明rowcolumn做while循环。

         int row = 0;
         int col = 0; 
         do {
              if (theSeed == EX){          
                  row = in.nextInt() ;        
                 int col = in.nextInt();        
              }  else {
        
                  row = in.nextInt() ;          
        
                  col = in.nextInt() ;
              } 
        
           }while (!validInput);  
        

        【讨论】:

          【解决方案5】:

          除了 getMove() 方法中的一些小问题外,一切都是正确的。请查找更新:

           public static void getMove(int theSeed) {    
                    boolean validInput = false;  // for input validation
                    int row = 0;
                    int col = 0;   
                    do {
                    if (theSeed == EX){
                         System.out.println("Enter a row (1,2,3) for player X: ");
                        row = in.nextInt() - 1; 
                        System.out.println("Enter a column (1,2,3) for player X: ");
                        col = in.nextInt() - 1;        
                    }  else {
                         System.out.println("Enter a row (1,2,3) for player O: ");
                        row = in.nextInt() - 1;          
                         System.out.println("Enter a column (1,2,3) for player O: ");
                        col = in.nextInt() - 1;
                    }  
          
                       if (row >= 0 && row < SIZE && col >= 0 && col < SIZE && board[row][col] == BLANK) {
                          currentRow = row;
                          currentCol = col;
                          board[currentRow][currentCol] = theSeed;  // update game-board content
                          validInput = true;  // input okay, exit loop
                       } else {
                          System.out.println("This move at (" + (row) + "," + (col) // column adjustment
                                + ") is not valid. Try again...");
                       }
                    } while (!validInput);  // repeat until input is valid
                 }
          

          也将输入作为 1,2,3 而不是 0,1,2,因为最终用户不知道数组如何操作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多