Моя программа делает один дополнительный цикл, как исправить?
Я программирую карточную игру высшего ниже. Цель состоит в том, чтобы угадать, будет ли вторая карта больше или меньше первой. Программа отлично работает, кроме одной проблемы. В игре игрок начинает с 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");
}
}
}
}
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;
}
}
Верные инструкции "Draw" идут после "win" или "проигрыша", так как вы не вернулись к циклу 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;
}
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;
}
Вы можете рассмотреть разрыв цикла, если выполнены условия. перемещение условия ничего не даст, оно все равно напечатает дополнительные данные.
Переместите "Вы выигрываете" и "Вы проигрываете" в конец цикла
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;
}
}
Попробуйте этот код:
if(credits == 0) {
System.out.println("\nYou lose !");
playing = false;
break;
}
else if(credits == 10) {
System.out.println("\nYou win !");
playing = false;
break;
}