【问题标题】:Java- checking the value in a MultiDimensional ArrayJava-检查多维数组中的值
【发布时间】:2009-06-22 14:45:53
【问题描述】:

我正在执行一项任务,使用多维数组创建一个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;
}

【问题讨论】:

  • 我们只能说你的数组中确实有一个 0。需要查看创建数组的代码、调用 isBoardComplete 的代码以及写入数组的任何其他代码
  • 您是否验证了在播放移动时数组正确填充了 1?尝试在 isBoardComplete() 中打印数组并验证数组是否包含正确的值。
  • 我不明白你的 isBoardComplete() 当所有 9 个位置都被填满时它返回 true,这是在 9 个步骤之后。如果是井字游戏,则应检查行、列和两条对角线中是否有 3 个相同的值。
  • 你是如何创建数组的?你是如何填充细胞的?尝试打印内容(或使用调试器)以查看数组的内容以防出错。

标签: java arrays multidimensional-array


【解决方案1】:

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

【讨论】:

  • 好的,这是我的构造函数,我将所有内容初始化为零。 (根据我大声笑) public TTTBoard() { //初始化私有数据 _player = 0; // 为棋盘构造 3 x 3 的 int 数组 _board = new int [3][3]; // 将所有元素初始化为 0 的数组;嵌套 for 循环 for (int i = 0; i
  • 好的,看起来不错,在这种情况下,请确保正确使用从 isBoardComplete() 方法返回的布尔值。请记住,返回 false 意味着继续播放。 while (!isBoardComplete()){//继续玩}
【解决方案2】:

试试这个:

 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;
 }

【讨论】:

  • 问题中的代码是正确的。完整标志仅在第一个 for 循环之外设置为 true,因此一旦设置为 false,它就无法重置为 true。您的代码会更高效一些,因为它在找到 0 后不会不必要地继续处理。
【解决方案3】:

看起来问题出在 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;

    }

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 我将其声明为私有 int _board[][];在构造函数中,我将其创建为 _board = new int [3][3];
    【解决方案5】:

    如果您使用的是 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.");
        }
      }
    

    【讨论】:

    • 这是真的,但它与这个问题有什么关系?
    【解决方案6】:

    这是我的代码。我有主类 (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;
           }
    
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      相关资源
      最近更新 更多