Моята програма прави един допълнителен цикъл, как да го поправя?

Програмирам игра на карти на по-ниско. Целта е да познаете дали втората карта ще бъде по-голяма или по-малка от първата. Програмата работи добре с изключение на един проблем. В играта играчът започва с 5 кредита. Всяко предположение той печели един кредит до 10 или ако не е познал, губи 1 кредит, до 0. При 0 или 10 той трябва да получи Вие печелите! или Губиш! съобщение, което той прави, но проблемът е, че програмата така или иначе прави едно допълнително теглене след това.

Първо използвах цикъл 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" идват след "win" или "lose", тъй като не сте се върнали към цикъла while. Предлагам ви да използвате продължи или прекъсване, за да спрете обработката на следващите инструкции:

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