2017-04-15 234 views
-2

这个井字棋游戏是基于用户和计算机的。 对于这个任务,我应该填写缺失的部分,这只是完成主要和moveAI方法(其他方法已经预设,我只需要打电话给他们);有评论提供了我需要添加代码来完成这个tic tac toe游戏的工作。我相信我所拥有的主要方法几乎完成,除了评论中的两条空行之外,我不确定它们是什么意思,而且我目前仍然坚持让我的moveAI方法工作。这是我应该随机生成的地方,在我将X放在某处后,计算机将会移动。我不确定如何编写一些内容,以检查计算机移动的位置是否可用并且用户尚未使用。先谢谢您的帮助!Java二维阵列 - 井字游戏

import java.util.Random; 
import java.util.Scanner; 
public class TicTacToeGame 
{ 
    public static void main (String[] args) 
    { 
     Scanner in = new Scanner (System.in); 
     char[][] board = new char[ 3 ][ 3 ]; 
     int x, y = -1; 
     char winner = 'N'; 
      // Initialize the board to spaces 
      // boolean noWinner = true; 
     char player = 'X'; 
     for (int r = 0; x < board.length(); r++) 
     { 
      for (int c = 0; c < board.length(); c++) 
      { 
       board[r][c] = ' '; 
      } 
     } 

     // Print the game board   
     printBoard(board); 

     // Keep playing while the game isn't finished 
     while (winner == 'N') 
     { 
      while (x < 0 && x >2 && y <0 && y > 2) 
      { 
       System.out.println("Enter the row and column, separated by spaces: "); 
       x = in.nextInt(); 
       y = in.nextInt(); 
      } 


      // Get the location from the user and validate it 


      // Mark the position in the board according to the user's specified location 


      // Print the board after the user plays 
      printBoard(board); 
      // Check to see if the game is finished. If it is, break out of the loop. 

      // Have the AI make a move 
      moveAI(board); 
      // Print the board after the AI plays 
      printBoard(board); 

      // Check to see who the winner is 
      winner = checkWinner(board); 
     } 
     // If the winner is 'X' or 'O', print that, otherwise, it is a tie 
     if (winner == 'X') 
      System.out.println("X is the winner!"); 
     else if (winner == 'O') 
      System.out.println("O is the winner!"); 
     else 
      System.out.println("Tie"); 


    } 
    /** 
    * Makes a move for the AI, and marks the board with an 'O'. 
    * 
    * @param board The game board 
    */ 
public static void moveAI (char[][] board) 
    { 
     int x,y = -1; 
     Random r = new Random(); 
     x = r.nextInt(3); 
     y = r.nextInt(3); 
     boolean open = false; 

     // Validate that the random location generated is valid. 
     while (x < 0 && x >2 && y < 0 && y > 2) 
     { 
      x = r.nextInt(3); 
      y = r.nextInt(3); 
     } 
     while (open == false) 
     { 
      if (board[r][c] != ' ') 
      while (x < 0 && x >2 && y < 0 && y > 2) 
      { 
       x = r.nextInt(3); 
       y = r.nextInt(3); 
      } 
     } 
     } 

      // Keep recalculating the location if the one generated is not 
      // if (board[r][c] != ' ') 
      //{ 


      // an empty space. 
      System.out.print(" "); 

      // Be sure to mark the position in the board with an 'O' 
      board[][]=in.nextInt(3) + 'O'; 
     } 

     /** 
     * Prints out the tic-tac-toe board 
     * 
     * @param board The game board 
     */ 
public static void printBoard (char[][] board) 
     { 
      // Box drawing unicode characters: 

      char a = '\u250c';    // U+250C : top-left 
      char b = '\u2510';    // U+2510 : top-right 
      char c = '\u2514';    // U+2514 : bottom-left 
      char d = '\u2518';    // U+2518 : bottom-right 
      char e = '\u252c';    // U+252C : top-vertical-connector 
      char f = '\u2534';    // U+2534 : bottom-vertical-connector 
      char g = '\u251c';    // U+251C : left-horizontal-connector 
      char h = '\u2524';    // U+2524 : right-horizontal-connector 
      char i = '\u253c';    // U+253C : center plus sign connector 
      char j = '\u2500';    // U+2500 : horizontal 
      char k = '\u2502';    // U+2502 : vertical 
      String l = j + "" + j + "" + j; // Three horizontals 

      // Print out the game board 

      System.out.printf ("\n 0 1 2\n" + 
        " %c%s%c%s%c%s%c\n" + 
        "0 %c %c %c %c %c %c %c\n" + 
        " %c%s%c%s%c%s%c\n" + 
        "1 %c %c %c %c %c %c %c\n" + 
        " %c%s%c%s%c%s%c\n" + 
        "2 %c %c %c %c %c %c %c\n" + 
        " %c%s%c%s%c%s%c\n\n", 
        a, l, e, l, e, l, b, 
        k, board[0][0], k, board[0][1], k, board[0][2], k, 
        g, l, i, l, i, l, h, 
        k, board[1][0], k, board[1][1], k, board[1][2], k, 
        g, l, i, l, i, l, h, 
        k, board[2][0], k, board[2][1], k, board[2][2], k, 
        c, l, f, l, f, l, d); 

     } 

     /** 
     * Checks the result of the game 
     * 
     * @param board The game board 
     * @return   'X' if 'X' is the winner 
     *     'O' if 'O' is the winner 
     *     'T' if the game is a tie 
     *     'N' if the game isn't finished 
     */ 
public static char checkWinner(char[][] board) 
     { 
      if (board[0][0] == 'X' && board[0][1] == 'X' && board[0][2] == 'X' ||  // Check row 0 
        board[1][0] == 'X' && board[1][1] == 'X' && board[1][2] == 'X' || // Check row 1 
        board[2][0] == 'X' && board[2][1] == 'X' && board[2][2] == 'X' || // Check row 2 
        board[0][0] == 'X' && board[1][0] == 'X' && board[2][0] == 'X' || // Check col 0 
        board[0][1] == 'X' && board[1][1] == 'X' && board[2][1] == 'X' || // Check col 1 
        board[0][2] == 'X' && board[1][2] == 'X' && board[2][2] == 'X' || // Check col 2 
        board[0][0] == 'X' && board[1][1] == 'X' && board[2][2] == 'X' || // Check diag \ 
        board[0][2] == 'X' && board[1][1] == 'X' && board[2][0] == 'X' || // Check diag/

        board[0][0] == 'x' && board[0][1] == 'x' && board[0][2] == 'x' || // Check row 0 
        board[1][0] == 'x' && board[1][1] == 'x' && board[1][2] == 'x' || // Check row 1 
        board[2][0] == 'x' && board[2][1] == 'x' && board[2][2] == 'x' || // Check row 2 
        board[0][0] == 'x' && board[1][0] == 'x' && board[2][0] == 'x' || // Check col 0 
        board[0][1] == 'x' && board[1][1] == 'x' && board[2][1] == 'x' || // Check col 1 
        board[0][2] == 'x' && board[1][2] == 'x' && board[2][2] == 'x' || // Check col 2 
        board[0][0] == 'x' && board[1][1] == 'x' && board[2][2] == 'x' || // Check diag \ 
        board[0][2] == 'x' && board[1][1] == 'x' && board[2][0] == 'x')  // Check diag/


      { 
       return 'X'; 
      } 
      else if (board[0][0] == 'O' && board[0][1] == 'O' && board[0][2] == 'O' || // Check row 0 
        board[1][0] == 'O' && board[1][1] == 'O' && board[1][2] == 'O' || // Check row 1 
        board[2][0] == 'O' && board[2][1] == 'O' && board[2][2] == 'O' || // Check row 2 
        board[0][0] == 'O' && board[1][0] == 'O' && board[2][0] == 'O' || // Check col 0 
        board[0][1] == 'O' && board[1][1] == 'O' && board[2][1] == 'O' || // Check col 1 
        board[0][2] == 'O' && board[1][2] == 'O' && board[2][2] == 'O' || // Check col 2 
        board[0][0] == 'O' && board[1][1] == 'O' && board[2][2] == 'O' || // Check diag \ 
        board[0][2] == 'O' && board[1][1] == 'O' && board[2][0] == 'O' || // Check diag/

        board[0][0] == 'o' && board[0][1] == 'o' && board[0][2] == 'o' || // Check row 0 
        board[1][0] == 'o' && board[1][1] == 'o' && board[1][2] == 'o' || // Check row 1 
        board[2][0] == 'o' && board[2][1] == 'o' && board[2][2] == 'o' || // Check row 2 
        board[0][0] == 'o' && board[1][0] == 'o' && board[2][0] == 'o' || // Check col 0 
        board[0][1] == 'o' && board[1][1] == 'o' && board[2][1] == 'o' || // Check col 1 
        board[0][2] == 'o' && board[1][2] == 'o' && board[2][2] == 'o' || // Check col 2 
        board[0][0] == 'o' && board[1][1] == 'o' && board[2][2] == 'o' || // Check diag \ 
        board[0][2] == 'o' && board[1][1] == 'o' && board[2][0] == 'o')  // Check diag/

      { 
       return 'O'; 
      } 

      boolean finished = true; 

      // If there is a blank space in the board, the game isn't finished yet 
      for (int i = 0; i < board.length; i++) 
       for (int j = 0; j < board[ i ].length; j++) 
        if (board[ i ][ j ] == ' ') 
         finished = false; 

      // If the board is finished and 'X' or 'O' wasn't returned, then it is a tie 
      // Otherwise, the game is not finished yet 
      if (finished) 
       return 'T'; 
      else 
       return 'N'; 
     } 
    } 
+0

看起来你希望我们为你写一些代码。尽管许多用户愿意为遇险的编码人员编写代码,但他们通常只在海报已尝试自行解决问题时才提供帮助。证明这一努力的一个好方法是包含迄今为止编写的代码,示例输入(如果有的话),期望的输出以及实际获得的输出(控制台输出,回溯等)。您提供的细节越多,您可能会收到的答案就越多。检查[FAQ]和[问]。 –

回答

0

//获取该用户的位置,并验证它

看起来你已经这样做在前面行:

// you're validating the input here 
while (x < 0 && x >2 && y <0 && y > 2) 
{ 
    System.out.println("Enter the row and column, separated by spaces: "); 
    // you're getting the location from the user here 
    x = in.nextInt(); 
    y = in.nextInt(); 
} 

你可能还需要检查用户输入的位置是否已经被填充。​​您需要查看数组。 moveAI有一个评论给你一个提示。您检查是否board[x][y]是一个空间。

另外,我认为你有一个bug,因为你永远不会重置xy的值,所以下一次玩家轮到来时,循环将不会进入。 xy仍然具有最后一个回合的值,因此回路条件评估为false。我认为你可以通过使用do{...}while(...);循环代替while(...){...}循环来解决这个问题。

//马克根据用户的指定位置

在基板上的位置,这只是意味着把一个'O'board[x][y]

//检查游戏是否结束。如果是,跳出循环。

它看起来像checkWinner这样做。如果游戏完成,它将返回'T',如果还在继续,则返回'N'


对于AI代码,这里是什么,我认为你应该做一些伪代码:

1. generate random x, y coordinates 
2. check if board[x][y] is already used (there's a comment that tells how) 
3. if it's used, go back to 1, otherwise put an 'X' in that space and return

而且,你并不需要,在AI代码while (x < 0 && x >2 && y < 0 && y > 2)检查循环。 Random.nextInt(3)已经返回0-2范围内的一个数字。