我正在尝试编写一个基本的二十一点游戏。我遇到的问题是我无法让程序在循环中的第一个选择之后允许输入。例如,如果玩家选择在第一个回合击中,它就可以工作,但在下一回合我无法让程序允许输入。这就是我所拥有的。有什么建议吗?
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!");
}
答案 0 :(得分:0)
您的问题是您实际上只是将用户的输入一次。
而不是:
int choice = scan.nextInt();
while(choice == 1){
// etc.
}
...你应该实现一个无限循环:
while (true) {
int choice = scan.nextInt();
}
...此外,您应该捕获InputMismatchException
s以获取意外的输入类型,并允许用户退出循环。
我总是建议:
Scanner#nextLine
代替Scanner#nextInt
String
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 +“!”);'。然后可以提示粘贴/扭曲并读取下一个值。