2015-05-01 4 views
1

Код игры Tic-Tac-Toe (в процессе). Когда я запускаю код, он запрашивает номер позиции X, после чего он останавливается. Это связано с циклом while, потому что, когда я запускаю его без него, он отлично работает. Мне нужен цикл, однако, чтобы установить X как false, чтобы он изменился на оборот O.Do While loop застревает

import java.util.Scanner; 
class TicTacToe 


{ 
public static void main(String[] args) 

{ 
    Scanner scan = new Scanner(System.in); 
    int XInput, OInput; 
    boolean IfGameOver; 
    String []board = {"1","2","3","4","5","6","7","8","9"}; 
    IfGameOver = false; 
    boolean Xturn, Oturn; 
    Xturn = true; 
    Oturn = false; 

    System.out.print("Welcome to Tic-Tac-Toe!\n\n"); 
do 
    { 

     { 
     System.out.println(" " + board[0] + board[1] + board[2]); 
     System.out.println(" " + board[3] + board[4] + board[5]); 
     System.out.println(" " + board[6] + board[7] + board[8]); 
     } 
      if (Xturn) 
      System.out.println("It is X's turn, position number?"); 
      if (Oturn) 
      System.out.println("It is O's turn, position number?"); 

      do 
       { 
       try 
       { 
       XInput = scan.nextInt(); 
       board[XInput-1] = "X"; 
       Oturn= true; 
       Xturn = false; 
       } 
       catch (NumberFormatException e) 
       { 
        System.out.println("Invalid input. Please enter a position number"); 
        XInput = scan.nextInt(); 
       } 
       }while(Xturn = true); 
      do 
       { 
       try 
       { 
       OInput = scan.nextInt(); 
       board[OInput-1] = "X"; 
       Oturn = false; 
       Xturn = true; 
       } 
       catch (NumberFormatException e) 
       { 
        System.out.println("Invalid input. Please enter a position number"); 
        OInput = scan.nextInt(); 
       } 
       }while (Oturn = true); 

    } while (!IfGameOver); 
} 
} 
+0

* «Запустите его без него» * ​​- слишком много местоимений! –

+0

Возможно, вы захотите удалить второй 'scan.nextInt()' в своих операциях catch, поскольку вы будете запрашивать ввод дважды подряд. – theguywhodreams

+0

Я бы предложил, вы берете входной петлю пользователя и перемещаете его по собственному методу, таким образом, вы можете немного уменьшить сложность. – MadProgrammer

ответ

2

У вас есть несколько проблем. Как указывалось ранее, вы не используете проверку равенства в инструкции while, но другие проблемы переопределяют этот. Вы устанавливаете Oturn на истину после поворота X, но перед вашим циклом do-while для поворота O. Поэтому вы идете в цикл Oturn do сразу после ввода X. Это должно очистить его ...

import java.util.Scanner; 
class TicTacToe 

{ 
public static void main(String[] args) 

{ 
    Scanner scan = new Scanner(System.in); 
    int Input; 
    boolean IfGameOver; 
    String []board = {"1","2","3","4","5","6","7","8","9"}; 
    IfGameOver = false; 
    boolean Xturn = true; 

    System.out.print("Welcome to Tic-Tac-Toe!\n\n"); 
do 
    { 

     { 
     System.out.println(" " + board[0] + board[1] + board[2]); 
     System.out.println(" " + board[3] + board[4] + board[5]); 
     System.out.println(" " + board[6] + board[7] + board[8]); 
     } 
      if (Xturn) 
      System.out.println("It is X's turn, position number?"); 
      else 
      System.out.println("It is O's turn, position number?"); 

      Input = -1; 
      do 
       { 
       try 
       { 
       Input = scan.nextInt(); 
       board[Input-1] = (Xturn?"X":"O"); 
       Xturn = !Xturn; 
       } 
       catch (Exception e) 
       { 
        System.out.println("Invalid input. Please enter a valid position number"); 
       } 
       }while(Input==-1); 
    } while (!IfGameOver); 
} 
} 
2

Проблема, скорее всего, на этой линии:

  }while(Xturn = true); 

Это не сравнение. Оператор = - Назначение. Это присваивает значение trueXturn, а затем продолжает цикл, потому что результатом назначения является всегда назначенное значение.

Для сравнения: ==. Но поскольку Xturn является булевой для начала, вы можете просто написать:

  }while(Xturn); 
+0

Я просто пробовал это, и он все еще застревает. –

+0

@JustinBeaubien. Вы тоже исправили Оторна? – MadProgrammer

+0

@MadProgrammer да я сделал: s –

0

Изменить

}while(Xturn = true); 
... 
}while (Oturn = true); 

в

}while(Xturn); 
... 
}while (Oturn); 

Xturn = true является назначение и не будет проверять, если Xturn - это правда. Чтобы сделать это, вы должны использовать Xturn == true или просто Xturn. То же самое касается Oturn.

Кроме того, как указано TAsk, вам нужно значение IfGameOver, чтобы стать истинным внутри цикла, чтобы код вышел из внешнего цикла do while.