Моя программа делает один дополнительный цикл, как исправить?

Я программирую карточную игру выше ниже. Цель состоит в том, чтобы угадать, будет ли вторая карта больше или меньше первой. Программа работает нормально, кроме одной проблемы. В игре игрок начинает с 5 кредитами. За каждое предположение он получает один кредит до 10 или, если он не угадал, он теряет 1 кредит, вплоть до 0. Предполагается, что при 0 или 10 он получит награду You Win! или ты проиграл! сообщение, что он и делает, но проблема в том, что программа все равно после этого делает один дополнительный розыгрыш.

Сначала я использовал цикл while, затем попробовал цикл do while, но проблема та же.

Вот основной метод:

 public static void main(String[] args)
      {
         HigherLower h = new HigherLower();

         boolean higher;  // higher = true; lower = false

         Draw draw = new Draw(); Deck deck = new Deck(); 
         Card card1; Card card2;

         int credits = 5;

         boolean playing = true;

         while(playing)
         {
             if(credits == 0)
             {
                 System.out.println("\nYou lose !");
                 playing = false;
             }
             else if(credits == 10)
             {
                 System.out.println("\nYou win !");
                 playing = false;
             }

             System.out.println("\n\n\n\n NEW DRAW : ");
             card1 = draw.drawCard(deck);

             System.out.print(card1.getName());

             boolean choice = h.getRightInput();

             card2 = draw.drawCard(deck);

             if((card2.getValue() > card1.getValue() && choice == true) 
            || (card2.getValue() < card1.getValue() && choice == false))
             {
                 credits++;
                 System.out.printf("Second card is %s", card2.getName());
                 System.out.printf("\n\nYou guessed right ! "
                        + "Now you have %d credits", credits);
             }
             else
             {
                 credits--;
                 System.out.printf("Second card is %s", card2.getName());
                 System.out.printf("\n\nYou guessed wrong ! "
                        + "Now you have %d credits", credits);
             }




         }


      }

Вот другие классы, я просто сложу их рядом друг с другом:

       public class Card 
        {
               String name;
               int value;

            Card(String name, int value)
            {
                this.name = name;
                this.value = value;
            }

            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public int getValue() {
                return value;
            }
            public void setValue(int value) {
                this.value = value;
            }
        }

public class Deck 
    {
        Card Joker = new Card("Joker", 1); 
        Card Two = new Card("2", 2);
        Card Three = new Card("3", 3);
        Card Four = new Card("4", 4);
        Card Five = new Card("5", 5);
        Card Six = new Card("6", 6);
        Card Seven = new Card("7", 7);
        Card Eight = new Card("8", 8);
        Card Nine = new Card("9", 9);
        Card Ten = new Card("10", 10);
        Card Jack = new Card("J", 11);
        Card Queen = new Card("Q", 12);
        Card King = new Card("K", 13);
        Card Ace = new Card("A", 14);

        Card[] deck = new Card[]{Joker, Two, Three, Four, Five,
                                 Six, Seven, Eight, Nine, Ten, 
                                 Jack, Queen, King, Ace};

    }


import java.util.Random;

public class Draw 
{

     Random random = new Random();

     public Card drawCard(Deck deck)
     {
         int maxNumber = deck.deck.length  ;

         int draw = random.nextInt(maxNumber);

         Card drawedCard = deck.deck[draw];

         return drawedCard;

     }


}

public class HigherLower 
{

     Scanner sc = new Scanner(System.in);

     public boolean getRightInput()
     {
         while(true)
         {
         System.out.println("\n (H)igher or (L)ower ? ");

         String s = sc.next();
         char c = s.charAt(0);

            if(c == 'H' || c == 'h')
            {
                return true;
            }
            else if(c == 'L' || c == 'l')
            {
                return false;
            }
            else
            {
                System.out.println("Give valid input ! H or L");
            }

         }

     }
}

person DragonCoder    schedule 05.05.2016    source источник


Ответы (5)


Игрок начинает игру с 5 кредитами, что означает, что игра не закончится в момент ее начала. Вы должны перевернуть части вашего цикла - сначала выполните рисунок, а затем проверьте, закончилась ли игра:

 while (playing) {
     // Code to do another drawing

     if (credits == 0) {
         System.out.println("\nYou lose !");
         playing = false;
     } else if (credits == 10) {
         System.out.println("\nYou win !");
         playing = false;
     }
}
person Mureinik    schedule 05.05.2016
comment
Ты прав. Это помогло. Большое спасибо ! - person DragonCoder; 05.05.2016

Переместите Вы выигрываете и проигрываете в конец цикла

     while(playing)
         {

             System.out.println("\n\n\n\n NEW DRAW : ");
             card1 = draw.drawCard(deck);

             System.out.print(card1.getName());

             boolean choice = h.getRightInput();

             card2 = draw.drawCard(deck);

             if((card2.getValue() > card1.getValue() && choice == true) 
            || (card2.getValue() < card1.getValue() && choice == false))
             {
                 credits++;
                 System.out.printf("Second card is %s", card2.getName());
                 System.out.printf("\n\nYou guessed right ! "
                        + "Now you have %d credits", credits);
             }
             else
             {
                 credits--;
                 System.out.printf("Second card is %s", card2.getName());
                 System.out.printf("\n\nYou guessed wrong ! "
                        + "Now you have %d credits", credits);
             }

             if(credits == 0)
             {
                 System.out.println("\nYou lose !");
                 playing = false;
             }
             else if(credits == 10)
             {
                 System.out.println("\nYou win !");
                 playing = false;
             }




         }
person Jeremy Fisher    schedule 05.05.2016

while(playing)
         {
             if(credits == 0)
             {
                 System.out.println("\nYou lose !");
                 playing = false;
                 break;
             }
             else if(credits == 10)
             {
                 System.out.println("\nYou win !");
                 playing = false;
                 break;
             }

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

person Priyamal    schedule 05.05.2016

уверен, что инструкции «Draw» следуют после «выигрыша» или «проигрыша», поскольку вы не возвращались к циклу while. Я предлагаю вам использовать continue или break, чтобы остановить обработку следующих инструкций:

while(playing)
         {
             if(credits == 0)
             {
                 System.out.println("\nYou lose !");
                 playing = false;continue;
             }
             else if(credits == 10)
             {
                 System.out.println("\nYou win !");
                 playing = false;continue;
             }
person V.ERNST    schedule 05.05.2016

Попробуйте этот код:

     if(credits == 0) {
                     System.out.println("\nYou lose !");
                     playing = false;
break;
                 }
                 else if(credits == 10) {
                     System.out.println("\nYou win !");
                     playing = false;
break;
                 }
person Daniel Arechiga    schedule 05.05.2016