1

私は、メイン クラスによって呼び出されるメソッドを持つ別のクラスである多次元配列を使用して、tictactoe ゲームを作成する割り当てに取り組んでいます。

配列は 3 X 3 で、ゼロに初期化されます。プレイヤー 1 がボード上の場所を選択すると、その特定のインデックスに 1 が置かれます。次に、プロンプトにより、プレーヤー 2 が選択を行うことができます。プレーヤーが自分の番になるたびに、ボードが完成しているかどうかを確認するメソッドが呼び出されます。完成していれば (1 と 2 で満たされている)、ゲームは引き分けと呼ばれます。この方法は正常に機能しておらず、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

これを試して:

 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 に答える
1

このコードでは問題は発生しません。ゲームを開始する前に、ボードがゼロで埋められていることを確認する必要があります。これが事実であることを確認するために、ボードの状態を出力します。それ以外の場合は、このメソッドからブール値を返すときにブール値を正しく使用していることを確認してください。

于 2009-06-22T14:51:00.953 に答える
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 に答える
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

配列は整数配列または int 配列として宣言されていますか? == と auto-unboxing を使用している場合、これは違いを生みます (数が少ない場合でもキャッシュする必要があります)。

それ以外は、配列が適切に初期化されていないと思います。このメソッドを呼び出すコードと、配列を初期化するコードを投稿してください。問題は、これら 2 つの場所のいずれかに存在する可能性が最も高いです。

于 2009-06-22T14:52:42.043 に答える
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 に答える