2016-11-17 7 views
0

Так недавно я разместил вопрос о моей игре в Высшем и Нижнем, это было повсюду и просто не работало, я использовал другой подход в этой игре, и это работает, только с незначительным вопросом на этот раз, это проще показать, чем объяснить так, вот мой код:Фиксация моей петли и необходимость помощи в Input Checker, Java

String noReplay = "\nThank you for playing."; 
     String highLow = "(H)igher or (L)ower: "; 
     String loseHigh = "Card is higher, you lose. Would you like to play again? Y/N: "; 
     String loseLow = "Card is lower, you lose. Would you like to play again? Y/N: "; 

     String playAgain; 

     boolean replay = false; 

     Random rand = new Random(); 
     Scanner scan = new Scanner(System.in); 

     do { 

      int card1 = rand.nextInt(13) + 1; 
      int card2 = rand.nextInt(13) + 1; 

      System.out.println("Card is: " + card1); 
      System.out.printf(highLow); 
      String guess = scan.nextLine().toUpperCase(); 

      if(card2 > card1 && guess.equalsIgnoreCase("H")) { 
       System.out.println("Card is: " + card2); 
       System.out.printf(highLow); 
       replay = true; 
       guess = scan.nextLine().toUpperCase(); 

      } 
      else if(card2 > card1 && guess.equalsIgnoreCase("L")) { 
       System.out.println("Card is: " + card2); 
       System.out.printf(loseHigh); 
       playAgain = scan.nextLine().toUpperCase(); 
       if(playAgain.equalsIgnoreCase("Y")) { 
        replay = true; 
       } 
       else if(playAgain.equalsIgnoreCase("N")) { 
        replay = false; 
        System.out.println(noReplay); 
       } 
      } 
      else if(card2 < card1 && guess.equalsIgnoreCase("H")) { 
       System.out.println("Card is: " + card2); 
       System.out.printf(loseLow); 
       playAgain = scan.nextLine().toUpperCase(); 
       if(playAgain.equalsIgnoreCase("Y")) { 
        replay = true; 
       } 
       if(playAgain.equalsIgnoreCase("N")) { 
        replay = false; 
        System.out.println(noReplay); 
       } 
      } 
      else if(card2 < card1 && guess.equalsIgnoreCase("L")) { 
       System.out.println("Card is: " + card2); 
       System.out.printf(highLow); 
       replay = true; 
       guess = scan.nextLine().toUpperCase(); 
      } 

     } while(replay != false); 

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

Это прекрасно работает, однако из моего выхода:

Card is: 9 
(H)igher or (L)ower: h 
Card is: 11 
(H)igher or (L)ower: l 
*Card is: 6* 
*(H)igher or (L)ower: l* 
*Card is: 7* 
Card is higher, you lose. Would you like to play again? Y/N: y 
*Card is: 13* 
*(H)igher or (L)ower: h* 
*Card is: 10* 
(H)igher or (L)ower: 

Мы можем видеть на помеченных линий, он не делает то, что он должен делать. Когда я говорю выше, если число ниже, оно должно спросить, хочу ли я играть снова, потому что я понял это неправильно. В этом случае это не так?

Так что мой вопрос^

Другое дело, в то время как им в этом, я хотел бы попросить помощи с Input Checker, я только хочу, чтобы пользователь, чтобы иметь возможность ввода Y, N, H, L (Ive отсортировал проблему с нижним или верхним регистром).

Благодарим за понимание!

+0

вы должны спросить один раз для ввода от пользователя для каждой итерации do/while и исходя из текущего состояния игры и текущей карты. вы в настоящее время занимаетесь тонной работой в do/while, добавляя много сложностей, которые вам не нужны. –

+0

Как бы я это сделал? @RAZ_Muh_Taz – SeanHub

ответ

1

Это, надо надеяться, имеет смысл и поможет уменьшить сложность игры. Взгляните на мое сравнение для card1 vs. card2, вы хотите, чтобы ваше предположение основывалось на том, что карта2 сравнивается с card1, а не наоборот. если это имеет смысл. Надеюсь это поможет!

 String highLow = "(H)igher or (L)ower: "; 
    String loseHigh = "Card is higher, you lose."; 
    String loseLow = "Card is lower, you lose."; 
    String loseMessageDetails = ""; 
    boolean gameLost = false; 
    boolean askAgain = true; 
    Scanner scan = new Scanner(System.in); 
    String guess = ""; 
    Random rand = new Random(); 

    int card1; 
    int card2; 

    while(askAgain) 
    { 
     if(gameLost) 
     { 
      System.out.println(loseMessageDetails + "\nWould you like to play again? Y/N"); 
      guess = ""; 
      while(!guess.equals("Y") && !guess.equals("N")) 
      { 
       guess = scan.nextLine().toUpperCase(); 
      } 

      if(guess.equals("Y")) 
      { 
       gameLost = false; 
       askAgain = true; 
      } 
      else 
      { 
       askAgain = false; 
      } 
     } 

     if(!gameLost) 
     { 
      card1 = rand.nextInt(13) + 1; 
      card2 = rand.nextInt(13) + 1; 
      System.out.println("Card is: " + card1); 
      guess = ""; 
      //loop until correct type of input 
      while(!guess.equals("H") && !guess.equals("L")) 
      { 
       System.out.printf(highLow); 
       guess = scan.nextLine().toUpperCase(); 
      } 
      //now we either correctly guessed or incorrectly guessed 
      //here is a correct guess 
      if((card1 < card2 && guess.equalsIgnoreCase("H")) || 
       (card1 > card2 && guess.equalsIgnoreCase("L"))) 
      { 
       askAgain = true; 
      } 
      else 
      { 
       loseMessageDetails = guess.equalsIgnoreCase("L") ? loseHigh : loseLow; 
       gameLost = true; 
      } 
     } 
    } 

Это также обеспечит действительный ввод и продолжит запрашивать ввод до тех пор, пока пользователь не вводит правильные буквы.

+0

Изменяя несколько бит в этом и ставя их так, как я их хочу, он работает абсолютно безупречно, я не могу вас поблагодарить! Я потратил больше часов, чем должен был сделать это! – SeanHub

+0

Ваше приветствие! Я рад, что вы можете изменить его и изменить в свой текущий проект! –

+0

Чтобы быть больным, как я могу реализовать Input Checker в этом? Для обеспечения использования только H, L, Y и N? – SeanHub