1

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

"为玩家 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;
      }
   }
}
4

5 回答 5

1

您将值存储在变量行/列中。超出范围,您声明另一个变量 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
   }
于 2013-10-24T05:31:42.473 回答
1

您需要删除-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);  
于 2013-10-24T05:32:42.897 回答
1
   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。
于 2013-10-24T05:32:57.413 回答
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. 因此,在此代码块的末尾,row并且col始终等于 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;
      }
   }
}
于 2013-10-24T05:34:44.497 回答
1

一切都是正确的,除了 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,因为最终用户不知道数组如何操作。

于 2013-10-24T05:52:59.880 回答