2014-04-11 2 views
0

Итак, я назначил Tic Tac Toe для своего класса. Я успешно создал простую программу Tic Tac Toe, но как-то метод проверки на розыгрыш иногда не получается правильно. Если все заполнено, но победителя нет, то это ничья. Но если все остальное заполняется, за исключением столбца 1 строки 0, оно все равно будет показывать «рисование», даже если это поле все еще пусто. Если вы не понимаете, что я имею в виду, просто попробуйте заполнить все, кроме средней коробки в верхнем ряду, но не выиграйте, он скажет «рисовать», даже если последняя коробка не заполнена. Что я сделал неправильно в своем коде ???? Вот драйвер: import javax.swing.JOptionPane;Tic Tac Toe java draw game

public class TwoDimensionalArray_Driverr 
{ 
    public static void main(String[]args) 
    { 
    char player = 'o'; 
    TwoDimensionalArrayy game = new TwoDimensionalArrayy(); 

    while (game.checkGame() == "PLAY") 
    { 
     if (player == 'o') player = 'x'; 
     else player = 'o'; 
     System.out.println(game); 
     String input = JOptionPane.showInputDialog("Enter Position of Row for player "+ player +" or  press Cancel to exit"); 
     if (input == null) 
     System.exit(0); 
     int row = Integer.parseInt(input); 

     input = JOptionPane.showInputDialog("Enter Position of Column for player " + player); 
     int column = Integer.parseInt(input); 

     game.set(row,column,player); 
     game.isDraw(); 
     game.hasWon(row,column,player); 
     game.checkGame(); 
     System.out.println(game.checkGame()); 
    } 
    if (game.checkGame()=="DRAW"){ 
     System.out.println(game); 
     System.out.println("It's a draw."); 
    } 
    else { 
     System.out.println(game); 
     System.out.println(player + " has won.");} 
    } 
} 

А вот объект: общественный класс TwoDimensionalArrayy { частное Строка CurrentState = "GO"; частный знак [] [] доска; закрытый статический окончательный int ROWS = 3; закрытый статический окончательный int COLUMNS = 3;

public TwoDimensionalArrayy(){ 
    board = new char[ROWS][COLUMNS]; 

    for(int i=0;i<ROWS;i++) //always do ROWS first!!!! 
    for(int j = 0;j<COLUMNS;j++) 
    board[i][j]=' '; 
    } 

    public void set(int i, int j, char player) 
    { 
    if(board[i][j] != ' ') 
     throw new IllegalArgumentException("Position Occupied"); 
    board[i][j] = player; 
    } 

    public String toString() 
    { 
    System.out.println("This is the board. 3x3"); 
    System.out.println("Position start @ row[0]col[0],row[0]col[1],row[0]col[2]"); 
    String dString= ""; 
    for (int row = 0; row<ROWS; row++) 
    { 
     if (COLUMNS>0) 
     dString += board[row][0]; 
     for (int col = 1; col<COLUMNS; col++) 
     { 
     dString+= "|" + board[row][col]; 
     } //end 2nd for 
     dString += "\n"; 
    }//end first for 
    return dString; 
    } 

    public String checkGame(){ 
    if (currentState=="Win"){ 
     return "END";} 
    else if (currentState=="Draw"){ 
     return "DRAW";} 
    else return "PLAY"; 
    } 
    public void hasWon(int i,int j,char player){ 
    if (board[i][0] == player   // 3-in-the-row 
        && board[i][1] == player 
        && board[i][2] == player 
       || board[0][j] == player  // 3-in-the-column 
        && board[1][j] == player 
        && board[2][j] == player 
       || i == j   // 3-in-the-diagonal 
        && board[0][0] == player 
        && board[1][1] == player 
        && board[2][2] == player 
       || i + j == 2 // 3-in-the-opposite-diagonal 
        && board[0][2] == player 
        && board[1][1] == player 
        && board[2][0] == player) 
     currentState = "Win"; 
    } 
    public void isDraw(){ 
    for (int row = 0; row < ROWS; row++) { 
     for (int col = 0; col < COLUMNS; col++) { 
      if (board[row][col] == ' ') { 
       currentState = "Play"; 
       break; 
      } 
      else {currentState = "Draw";} // no empty cell, it's a draw} 
     } 
     } 
    } 
} 

ответ

1
public void isDraw(){ 
    for (int row = 0; row < ROWS; row++) { 
    for (int col = 0; col < COLUMNS; col++) { 
     if (board[row][col] == ' ') { 
     currentState = "Play"; 
     break; 
     } else { 
     currentState = "Draw"; // no empty cell, it's a draw 
     } 
    } 
    } 
} 

break здесь избежит внутренний цикл, но не внешний один. По существу isDraw рассматривает только последнюю строку. Вместо этого вы должны попробовать использовать return.

+0

Я вижу! Большое спасибо! Также, если я буду использовать возврат, что бы я вернулся и как он будет работать? Я немного смущен в этой части. – Ccyan

+0

@ user3504731 'isDraw' - это метод' void', поэтому он не имеет возвращаемого значения - простой 'return;' выйдет из метода. –

+0

Ohhhhh. Итак, если я верну возврат вместо перерыва, он выйдет из обоих циклов? Я тоже об этом думал, но я думал, что даже если я вернусь, он все равно вернется через все. Большое спасибо! – Ccyan

 Смежные вопросы

  • Нет связанных вопросов^_^