Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在TictoeJava应用程序中添加计算机播放器?_Java - Fatal编程技术网

在TictoeJava应用程序中添加计算机播放器?

在TictoeJava应用程序中添加计算机播放器?,java,Java,如何将播放器2转换为计算机生成的答案,而不是另一个输入。只要遵循游戏规则并选择一个开放空间,计算机的选择就可以是完全随机的 此外,我想保留我现有代码的基本结构…只需要将一个播放器转换为计算机生成的选择。选择不必是最佳选择,只要是有效的选择即可 我不希望答案只是一个开始,而不破坏我所拥有的…请任何帮助 package tictactoe; import java.util.Scanner; public class TicTacToe { private final int BOARDSIZ

如何将播放器2转换为计算机生成的答案,而不是另一个输入。只要遵循游戏规则并选择一个开放空间,计算机的选择就可以是完全随机的

此外,我想保留我现有代码的基本结构…只需要将一个播放器转换为计算机生成的选择。选择不必是最佳选择,只要是有效的选择即可

我不希望答案只是一个开始,而不破坏我所拥有的…请任何帮助

package tictactoe;


import java.util.Scanner;

public class TicTacToe
{
private final int BOARDSIZE = 3; // size of the board
private enum Status { WIN, DRAW, CONTINUE }; // game states
private char[][] board; // board representation
private boolean firstPlayer; // whether it's player 1's move
private boolean gameOver; // whether game is over

// Constructor
public TicTacToe()
{
  board = new char[ BOARDSIZE ][ BOARDSIZE ];
  firstPlayer = true;
  gameOver = false;
} // end Constructor

// start game
public void play()
{
  Scanner input = new Scanner( System.in );
  int row; // row for next move
  int column; // column for next move

  System.out.println( "Player X's turn." );

  while ( !gameOver )
  {
     char player = ( firstPlayer ? 'X' : 'O' );

     // player's turn
     do
     {
        System.out.printf(
           "Player %c: Enter row ( 0, 1 or 2 ): ", player );
        row = input.nextInt();
        System.out.printf(
           "Player %c: Enter column ( 0, 1 or 2 ): ", player );
        column = input.nextInt();
     } while ( !validMove( row, column ) );

     board[ row ][ column ] = player;

     firstPlayer = !firstPlayer;

     printBoard();
     printStatus( player );
  } // end while
} // end method play

// show game status in status bar
private void printStatus( int player )
{
  Status status = gameStatus();

  // check game status
  switch ( status )
  {
     case WIN:
        System.out.printf( "Player %c wins.", player );
        gameOver = true;
        break;
     case DRAW:  
        System.out.println( "Game is a draw." );
        gameOver = true;
        break;
     case CONTINUE:  
        if ( player == 'X' )
           System.out.println( "Player O's turn." );
        else
           System.out.println( "Player X's turn." );
        break;
  } // end switch
} // end method printStatus

// get game status
private Status gameStatus()
{   
  int a;

  // check for a win on diagonals
  if ( board[ 0 ][ 0 ] != 0 && board[ 0 ][ 0 ] == board[ 1 ][ 1 ] &&
     board[ 0 ][ 0 ] == board[ 2 ][ 2 ] )
     return Status.WIN;
  else if ( board[ 2 ][ 0 ] != 0 && board[ 2 ][ 0 ] == 
     board[ 1 ][ 1 ] && board[ 2 ][ 0 ] == board[ 0 ][ 2 ] )
     return Status.WIN;

  // check for win in rows
  for ( a = 0; a < 3; a++ )
     if ( board[ a ][ 0 ] != 0 && board[ a ][ 0 ] == 
          board[ a ][ 1 ] && board[ a ][ 0 ] == board[ a ][ 2 ] )
        return Status.WIN;

  // check for win in columns
  for ( a = 0; a < 3; a++ )
     if ( board[ 0 ][ a ] != 0 && board[ 0 ][ a ] == 
          board[ 1 ][ a ] && board[ 0 ][ a ] == board[ 2 ][ a ] )
        return Status.WIN;

  // check for a completed game
  for ( int r = 0; r < 3; r++ )
     for ( int c = 0; c < 3; c++ )
        if ( board[ r ][ c ] == 0 )
           return Status.CONTINUE; // game is not finished

  return Status.DRAW; // game is a draw
} // end method gameStatus

// display board
public void printBoard() 
{
  System.out.println( " _______________________ " );

  for ( int row = 0; row < BOARDSIZE; row++ )
  {
     System.out.println( "|       |       |       |" );

     for ( int column = 0; column < BOARDSIZE; column++ )
        printSymbol( column, board[ row ][ column ] );

     System.out.println( "|_______|_______|_______|" );
  } // end for
} // end method printBoard

// print moves
private void printSymbol( int column, char value )
{
  System.out.printf( "|   %c   ", value );

  if ( column == 2 )
     System.out.println( "|" );
} // end method printSymbol

// validate move
private boolean validMove( int row, int column )
{
  return row >= 0 && row < 3 && column >= 0 && column < 3 &&
     board[ row ][ column ] == 0;
} // end method validMove
 } // end class TicTacToe

首先,您将在游戏中修改do,在询问用户和为计算机选择移动之间切换

如果您只想随机移动,您会发现Java类random很有用。在循环外部创建一个实例

Random random = new Random();
现在,您可以要求在[0,2]范围内使用以下参数获得一个随机整数:

int row = random.nextInt(3);
int col = random.nextInt(3);
检查电路板,看那个点是否填满了。如果是,您需要选择另一个


如果你想找到最好的移动,你可以使用算法。它会搜索两名玩家可能采取的行动,并假定每个玩家都会发挥其最佳水平。

在您向用户询问其行动的行和列时,将其替换为调用另一个表示某个玩家的对象的方法,在这种情况下,它只会提示输入,然后将其返回给调用者或计算机播放器,在这种情况下,它将根据您确定的任何方式计算移动,并返回

该方法需要将董事会传递给它。玩家类可以忽略它,但是计算机玩家需要它来决定它的移动


您还需要创建某种Move类,以便将行和列的移动作为单个返回值传递回去。

如果这是我的代码,我会重新开始重构所有内容,并尝试创建各自负责的不同对象,包括游戏对象、玩家对象、计算机玩家对象。。。分而治之。我必须将这个基本结构用于我正在进行的项目。。。
  public int[] autoPlay()
    {
        Random rnd = new Random();
        int randomValue[] = new int[2];
        do{
            randomValue[0] = rnd.nextInt(3);
            randomValue[1] = rnd.nextInt(3);
        } while ( !validMove( randomValue[0], randomValue[1] ) );
        return randomValue;
    }

// start game
    public void play()
    {
        Scanner input = new Scanner( System.in );
        int row; // row for next move
        int column; // column for next move

        System.out.println( "Player X's turn." );

        while ( !gameOver )
        {
            char player = ( firstPlayer ? 'X' : 'O' );

            // player's turn
            do
            {
                if(player == 'X') {
                    System.out.printf(
                            "Player %c: Enter row ( 0, 1 or 2 ): ", player);
                    row = input.nextInt();
                    System.out.printf(
                            "Player %c: Enter column ( 0, 1 or 2 ): ", player);
                    column = input.nextInt();
                }else
                {
                    int array[] = autoPlay();
                    row = array[0];
                    column = array[1];
                }
            } while ( !validMove( row, column ) );

            board[ row ][ column ] = player;

            firstPlayer = !firstPlayer;

            printBoard();
            printStatus( player );
        } // end while
    } // end method play