1

我正在分配使用多维数组创建一个tictactoe 游戏的任务,该数组是一个单独的类,其中包含由主类调用的方法。

数组为 3 X 3 并初始化为零。当玩家 1 在棋盘上选择一个位置时,将在该特定索引中放入 1。然后提示允许玩家 2 进行选择。每次轮到玩家时,都会调用一个方法来检查棋盘是否完整,如果棋盘完整(填充 1 和 2'),则游戏称为平局。这种方法不能正常工作,它有时会在第二步时称游戏为平局。这是我正在使用的方法。

public boolean isBoardComplete()
{
    // sets complete to true
    boolean complete = true;

    //will change complete to false
    for (int i = 0; i < 3; i++)
    {
        for(int j =0; j < 3; j++)
        {
            if (_board[i][j] == 0)
            {
                complete = false;
            }
        }
    }
    return complete;
}
4

6 回答 6

1

看起来问题出在 makeMove() 方法中。移动后代码返回“false”,从代码流中可以清楚地看出,该方法应该返回“true”以表示有效移动。

尝试这个

    public boolean makeMove( int row, int col) { 
        row = row - 1; col = col - 1;

        // Checks to see if board location is occupied and a move can be made
        if (_board[row][col] == 0)
        {
            _board[row][col] = _player;
            return true;
        }
        return false;

    }
于 2009-06-23T03:40:20.227 回答
1

此代码不会产生问题。在开始游戏之前,您需要确保棋盘最初填充为零。我会打印出董事会状态以确保是这种情况。否则,请确保在从此方法返回布尔值时正确使用它。

于 2009-06-22T14:51:00.953 回答
1

尝试这个:

 public boolean isBoardComplete()
 {
   //will change complete to false
   for (int i = 0; i < 3; i++)
   {
     for(int j =0; j < 3; j++)
     {
        if (_board[i][j] == 0)
        {
            return false;
        }
     }
   }
  return true;
 }
于 2009-06-22T14:59:53.183 回答
0

数组是声明为 Integer 数组还是 int 数组?如果您使用 == 和自动拆箱(即使数量很少,它们应该被缓存),这将有所不同。

除此之外,我会说您的数组未正确初始化。贴出调用此方法的代码以及初始化数组的代码。问题很可能出在这两个地方之一。

于 2009-06-22T14:52:42.043 回答
0

如果您使用的是 JAVA 5 或更高版本,则可以使用Arrays.deepEquals方法。来自 javadocs,“此方法适用于任意深度的嵌套数组。”

例子:-

  String[][] ticTacToe = { {"X", "O", "O"},
                             {"O", "X", "X"},
                             {"X", "O", "X"}};
    System.out.println(Arrays.deepToString(ticTacToe));

    String[][] ticTacToe2 = { {"O", "O", "X"},
                              {"O", "X", "X"},
                              {"X", "O", "X"}};

    String[][] ticTacToe3 = { {"X", "O", "O"},
                              {"O", "X", "X"},
                              {"X", "O", "X"}};

    if (Arrays.deepEquals(ticTacToe, ticTacToe2)) {
      System.out.println("Boards 1 and 2 are equal.");
    } else {
      System.out.println("Boards 1 and 2 are not equal.");
    }

    if (Arrays.deepEquals(ticTacToe, ticTacToe3)) {
      System.out.println("Boards 1 and 3 are equal.");
    } else {
      System.out.println("Boards 1 and 3 are not equal.");
    }
  }
于 2009-06-22T15:09:08.890 回答
0

这是我的代码。我有主类(TicTacToeApplication)和TTTboard类。

import java.util.Scanner;

public class TicTacToeApplication {

    public static void main(String[] args)
    {
        // declare variables including our TTT board

        TTTBoard myGame = new TTTBoard();
        Scanner input = new Scanner(System.in);
        int row;
        int col;


        while(myGame.determineWinner() == 0 && !myGame.isBoardComplete())
        {

            myGame.displayBoard();


            System.out.println("Player " + myGame.getCurrentPlayer());
            System.out.println("Make your move.");
            System.out.print("Row please (1-3):");
            row = input.nextInt();


            while(row < 1 || row > 3)
            {
                System.out.println("Invalid Row.");
                System.out.print("Try again (1-3):");
                row = input.nextInt();
            }

            System.out.print("Col please (1-3):");
            col = input.nextInt();


            while(col < 1 || col > 3)
            {
                System.out.println("Invalid Col.");
                System.out.print("Try again (1-3):");
                col = input.nextInt();
            }

            // while the move is invalid make them make another move
            while(!myGame.makeMove(row, col))
            {
                System.out.println("Invalid Move... Try Again.");
                System.out.print("Row please (1-3):");
                row = input.nextInt();

                // error trap for valid row
                while(row < 1 || row > 3)
                {
                    System.out.println("Invalid Row.");
                    System.out.print("Try again (1-3):");
                    row = input.nextInt();
                }

                System.out.print("Col please (1-3):");
                col = input.nextInt();

                // error trap for valid col
                while(col < 1 || col > 3)
                {
                    System.out.println("Invalid Col.");
                    System.out.print("Try again (1-3):");
                    col = input.nextInt();
                }
            }
        }

        // if we left the loop because the boards full and there's no winner
        // it must be a cats game
        if (myGame.determineWinner() == 0)
        {
            System.out.println("Sorry - Cat's Game");
        }
        else
        {
            System.out.print("The Winner is Player ");
            if (myGame.getCurrentPlayer() == 1)
            {
                System.out.println("2");
            }
            else
            {
                System.out.println("1");
            }
        }
    }

}

public class TTTBoard
{

   private int [][] _board;
   private int _player;


   public TTTBoard ()
   {
       _player = 0;
       _board = new int [3][3];

       for (int row = 0; row < 3; row++)
       {    
           for(int column = 0; column < 3; column++)
           {
              _board[row][column] = 0;
           }
       }
    }


   public boolean makeMove( int row, int col)
   {
        row = row - 1;
        col = col - 1;

        // Checks to see if board location is occupied and a move can be made

        if (_board[row][col] == 0)
        {
            _board[row][col] = _player;
            return false;
        }
        else
        {
            return true;
        }
   }


   public boolean isBoardComplete ()
   {
       for (int row = 0; row < 3; row++)
       {
           for (int column = 0; column <3; column++)
           {
               if (_board [row][column] == 0)
               {
                   return false;
               }

           }
       }

       return true;
   }


   public int determineWinner ()
   {
        // First check rows and columns
          int winner = 0;

        // Check for winner in row 1
        if (_board[0][0] == _board[0][1] && _board[0][0] == _board[0][2] &&
                _board[0][0] != 0)
        {
            winner = _board[0][0];
        }

        // Check for winner in row 2
        if (_board[1][0] == _board[1][1] && _board[1][0] == _board[1][2] &&
                _board[1][0] != 0)
        {
            winner = _board[1][0];
        }

        // Check for winner in row 3
        if (_board[2][0] == _board[2][1] && _board[2][0] == _board[2][2] &&
                _board[2][0] != 0)
        {
            winner = _board[2][0];
        }

        // Check for winner in col 1
        if (_board[0][0] == _board[1][0] && _board[0][0] == _board[2][0] &&
                _board[0][0] != 0)
        {
            winner = _board[0][0];
        }

        // Check for winner in col 2
        if (_board[0][1] == _board[1][1] && _board[0][1] == _board[2][1] &&
                _board[0][1] != 0)
        {
            winner = _board[0][1];
        }

        // Check for winner in col 3
        if (_board[0][2] == _board[1][2] && _board[0][2] == _board[2][2] &&
                _board[0][2] != 0)
        {
            winner = _board[0][2];
        }

        // Check for winner in first diagonal
        if (_board[0][0] == _board[1][1] && _board[0][0] == _board[2][2] &&
                _board[0][0] != 0)
        {
            winner = _board[0][0];
        }
        // Check for winner in 2nd diagonal
        if (_board[2][0] == _board[1][1] && _board[2][0] == _board[0][2] &&
                _board[2][0] != 0)
        {
            winner = _board[2][0];
        }

        return winner;
    }


   public void displayBoard()
   {
        System.out.println();

        for (int r=0; r<_board.length; r++)
        {

            for (int c=0; c<_board[r].length; c++)
            {

                System.out.print(" " + _board[r][c]);
            }

            System.out.println("");
        }

   }


   public int getCurrentPlayer ()
   {
       if (_player == 0)
       {
            return _player = 1;
       }
       if (_player == 1)
       {
           return _player = 2;
       }
       else
       {
           return _player = 1;
       }

   }
}
于 2009-06-22T22:24:24.170 回答