while循环java(二十一点)

时间:2013-09-02 21:51:40

标签: java loops while-loop

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

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!");
    }

3 个答案:

答案 0 :(得分:0)

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

而不是:

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

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

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

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

我总是建议:

  • 使用如上所述的无限循环
  • 使用Scanner#nextLine代替Scanner#nextInt
  • 获得String
  • 检查以“q”开头的内容或类似用户的内容 想要退出
  • 否则,尝试使用Integer解析String Integer.parseInt并抓住最终结果 NumberFormatException

另外,我强烈建议您使用switch语句对用户Integer进行分类,而不是使用麻烦的if-then-else。

答案 1 :(得分:0)

这是因为在每个if语句中你break来自循环并且不再输入它。

你需要的是一个循环条件,这种情况一直存在,直到玩家在每个if语句中出现或选择留下并且不在循环中,而我认为你可能想要使用{{}} {1}}

break

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

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;
    }
}

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

答案 2 :(得分:0)

你使用break语句意味着你的循环执行的功能非常有限,更像是if。在打破循环时,您没有更多的代码可以运行。

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

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