2009-06-22 2 views
0

Я работаю над заданием создать игру tictactoe с использованием многомерного массива, отдельного класса с методами, которые будут вызваны основным классом.Java-проверка значения в многомерном массиве

Массив 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

Все, что мы можем сказать, из т его в том, что действительно существует в массиве а 0. Вам нужно увидеть код, который создает массив, код, который вызывает isBoardComplete, и любой другой код, который записывается в массив. – willcodejavaforfood

+0

. Вы проверили, что массив правильно заполнен 1-м, когда идет воспроизведение? Попробуйте напечатать массив в isBoardComplete() и убедитесь, что массив содержит правильные значения. – Babar

+2

Я не понимаю, что ваш isBoardComplete() возвращает true, когда все 9 мест заполнены, что составляет 9 шагов. Если это игра tic-tac-toe, вы должны проверить на 3 одинаковых значения в строках, столбцах и в двух диагоналях. – akarnokd

ответ

1

Этот код не вызывает проблем. Перед началом игры вам необходимо убедиться, что доска изначально заполнена нулями. Я бы распечатал состояние платы, чтобы убедиться, что это так. В противном случае убедитесь, что вы правильно используете свое логическое значение, когда возвращаете его из этого метода.

+0

ok вот мой конструктор, где я инициализирую все до нуля.(согласно мне lol) общественный TTTBoard() { // инициализирует приватные данные _player = 0; // комлит 3 x 3 массива int для доски _board = new int [3] [3]; // Инициализирует все элементы в массиве 0; вложенный для цикла для (int i = 0; i <3; i ++) { для (int j = 0; j <3; j ++) { _board [i] [j] = 0; } } } – 2009-06-22 14:53:52

+0

Хорошо, в этом случае убедитесь, что вы используете логическое значение, которое вы возвращаете из своего метода isBoardComplete() правильно. Помните, что возвращение false означает продолжить воспроизведение. while (! isBoardComplete()) {// продолжаем играть} – AlbertoPL

0

Является ли массив объявленным как массив Integer или массив int? Это будет иметь значение, если вы используете == и auto-unboxing (хотя и с небольшими номерами, которые они должны кэшировать).

Кроме этого, я бы сказал, что ваш массив неправильно инициализирован. Выполните код, вызывающий этот метод, и код, который инициализирует ваш массив. Проблема, скорее всего, находится в одном из этих двух мест.

+0

Я объявила его как private int _board [] []; В конструкторе я создал его как _board = new int [3] [3]; – 2009-06-22 15:02:06

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

хорошо один. Благодарю. – akf

+0

Код в правиле. Полный флаг установлен только на истинную сторону первого цикла for, поэтому, когда он установлен в false, он не может быть сброшен на значение true. Ваш код будет немного более эффективным, хотя, поскольку он не нуждается в продолжении обработки после того, как он нашел 0. –

0

Если вы используете Java 5 или выше, вы можете использовать Arrays.deepEquals method.From в 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."); 
    } 
    } 
+1

Это правда, но как это связано с этим вопросом? – akarnokd

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

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

    } 
+0

эй спасибо, сейчас он работает. – 2009-06-23 03:54:43