0

我正在尝试编写二十一点的基本游戏。我遇到的问题是我无法让程序在循环中的第一个选择之后允许输入。例如,如果玩家选择在第一回合击球,它可以工作,但在他们的下一回合,我无法让程序允许输入。这就是我所拥有的。有什么建议么?

import java.util.Scanner;

public class BlackJack {

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.println("Welcome to BlackJack");
    int guess = 1+(int)(Math.random()*13);
    int guess2 = 1+(int)(Math.random()*13);
    int answer = guess + guess2;
    System.out.println("Player 1 hand: " + answer);
    System.out.println("Do you want to hit(1) or stay(2)");

    boolean looping = true;
    while(looping){
        int choice = scan.nextInt();
        int guess3 = 1+(int)(Math.random()*13);
        int hand = guess3 + answer;
    if(choice == 1){
        if(guess3 == 1){
            System.out.println("Player 1 drew an Ace!");
            System.out.println("Player 1 hand: " + hand);
            System.out.println("Do you want to hit(1) or stay(2)");
        }else if(guess3 > 1 && guess3 <= 10){
            System.out.println("Player 1 drew a"  + guess3 +"!");
            System.out.println("Player 1 hand: " + hand);
            System.out.println("Do you want to hit(1) or stay(2)");
        }else if(guess3 == 11){
            System.out.println("Player 1 drew a Jack!");
            System.out.println("Player 1 hand: " + hand);
            System.out.println("Do you want to hit(1) or stay(2)");
        }else if(guess3 == 12){
            System.out.println("Player 1 drew a Queen");
            System.out.println("Player 1 hand: " + hand);
            System.out.println("Do you want to hit(1) or stay(2)");
        }else if(guess3 == 13){
            System.out.println("Player 1 drew a King!");
            System.out.println("Player 1 hand: " + hand);
            System.out.println("Do you want to hit(1) or stay(2)");
        }
        if(choice == 2){
            looping = false;
        System.out.println("Player 1 has decided to stay");
        }if(hand > 21){
            looping = false;
            System.out.println("You have busted!");
    }
4

3 回答 3

0

您对 break 语句的使用意味着您的循环执行的功能非常有限,更像是 if。跳出循环后,您就没有更多代码要运行了。

如果您的循环有效,那么您使用 answer 和 hand 变量意味着您永远不会得到正确的值(每次循环只是将原始的两个值添加到第三个值)。要么将卡片存储在列表中,要么保留累积分数。

你有很多重复,考虑在guess3上使用一个switch case,其中1输出Ace语句2到10都是相同的(所以,没有break语句)'System.out.println(“玩家1画了一个”+guess3+ “!”);'。紧随其后的是提示粘/扭和读取下一个值。

于 2013-09-02T22:11:50.687 回答
0

您的问题是您实际上只接受用户的输入一次。

代替:

int choice = scan.nextInt();
while(choice == 1){
    // etc.
}

...你应该实现一个无限循环:

while (true) {
    int choice = scan.nextInt();
}

...此外,您应该捕获InputMismatchException意外输入类型的 s,并允许用户跳出循环。

总的来说,我会推荐:

  • 如上所述使用无限循环
  • 使用Scanner#nextLine而不是Scanner#nextInt
  • String结果得到一个
  • 为想要退出的用户检查以“q”开头的东西或类似的东西
  • 否则,尝试IntegerStringwith 中解析Integer.parseInt并捕获最终结果 NumberFormatException

此外,我强烈建议使用switch语句对Integer来自用户的内容进行分类,而不是使用凌乱的 if-then-else。

于 2013-09-02T21:54:53.397 回答
0

这是因为在每个 if 语句中,您都break从循环中而不是再次输入它。

您需要的是一个循环条件,该条件为真,直到玩家破产或选择留下并且不在break每个 if 语句中的循环中,相反我认为您可能想要使用continue

boolean looping = true;
while (looping){
    int choice = scan.nextInt();
    //.... edit
    if (choice == 1){
         //Do your card/hand handling code here
    }
    //.... end of edit
    else if(choice == 2 || hand >= 22){
         looping = false;
         continue;  //Alternatively just break;
    }
}

您也可以将所有 if 语句减少到更少的情况,因为 2-10 您可以这样做

if(guess3 > 1 && guess3 <= 10){
    System.out.println("Player 1 drew an "  + guess3 +"!");
    System.out.println("Do you want to hit(1) or stay(2)");
}

编辑回应您的评论。

该程序将继续添加卡片,因为您的所有卡片处理代码都需要处于以下条件

if (choice == 1){
     //Do your card/hand handling code here
}

目前情况并非如此,因此您的程序每次只需添加卡片,因为您不检查用户选择的内容。

于 2013-09-02T21:58:50.647 回答