Java终端赌博程序循环问题:如何实现玩家多次赌博功能?
问题
刚学习Java一两周,想写一个终端简易赌博程序,希望玩家能用单一余额多次赌博,但添加while循环和Scanner输入后,输入"Yes"程序无反应。代码如下:
import java.util.Random; import java.util.Scanner; public class Gambler { public static void main(String[] args) { Random random = new Random(); Scanner scanner = new Scanner(System.in); int balance = 100; System.out.println(); System.out.println("--> Current Balance: $" + balance + " <--"); System.out.println(); System.out.println("Would you like to enter the Java Gambler simulator?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); String yesOrNo; yesOrNo = scanner.nextLine(); if (yesOrNo.equalsIgnoreCase("Yes")) { System.out.println(); System.out.println("[!] Welcome to the Java Gambler! [!]"); System.out.println(); System.out.println("The only Java gambling software in all of Java County!"); System.out.println(); System.out.println("If the chosen number is {1}, the player automatically wins $20."); System.out.println("If the chosen number is {2}, the player automatically wins $10."); System.out.println("If the chosen number is {3}, the player automatically wins $5."); System.out.println("All other numbers are an automatic loss."); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); String yesOrNo2; yesOrNo2 = scanner.nextLine(); if (yesOrNo2.equalsIgnoreCase("Yes")) { System.out.println(); System.out.println("Gambling Options:"); System.out.println(); System.out.println("[A] $1 Bet (1/20 $20, 1/20 $10, 1/20 $5)"); System.out.println("[B] $5 Bet (1/10 $20, 1/10 $10, 1/10 $5)"); System.out.println("[C] $10 Bet (1/5 $20, 1/5 $10, 1/5 $5)"); System.out.println(); System.out.println("Gambling Selection: "); System.out.println(); String continueGambling = "Yes"; while (continueGambling.equalsIgnoreCase("Yes")) { String gamblingSelection; gamblingSelection = scanner.nextLine(); String a = "A"; String b = "B"; String c = "C"; if (gamblingSelection.equalsIgnoreCase(a)) { balance = balance - 1; int aSelection = random.nextInt(20) + 1; System.out.println(); System.out.println("And the number is... " + aSelection); System.out.println(); switch (aSelection) { case 1: System.out.println("Congrats, you have won $20!"); balance = balance + 20; System.out.println("--> Your new balance: $" + balance + " <--"); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); break; case 2: System.out.println("Congrats, you have won $10!"); balance = balance + 10; System.out.println("--> Your new balance: $" + balance + " <--"); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); break; case 3: System.out.println("Congrats, you have won $5!"); balance = balance + 5; System.out.println("--> Your new balance: $" + balance + " <--"); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); break; default: System.out.println("Sorry, no luck this time..."); System.out.println("--> Your new balance: $" + balance + " <--"); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); break; } } else if (gamblingSelection.equalsIgnoreCase(b)) { balance = balance - 5; int bSelection = random.nextInt(10) + 1; System.out.println(); System.out.println("And the number is... " + bSelection); System.out.println(); switch (bSelection) { case 1: System.out.println("Congrats, you have won $20!"); balance = balance + 20; System.out.println("--> Your new balance: $" + balance + " <--"); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); break; case 2: System.out.println("Congrats, you have won $10!"); balance = balance + 10; System.out.println("--> Your new balance: $" + balance + " <--"); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); break; case 3: System.out.println("You won $5! Its a free spin, I guess..."); balance = balance + 5; System.out.println("--> Your new balance: $" + balance + " <--"); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); break; default: System.out.println("Sorry, no luck this time..."); System.out.println("--> Your new balance: $" + balance + " <--"); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); break; } } else if (gamblingSelection.equalsIgnoreCase(c)) { balance = balance - 10; int cSelection = random.nextInt(5) + 1; System.out.println(); System.out.println("And the number is... " + cSelection); System.out.println(); switch (cSelection) { case 1: System.out.println("Congrats, you have won $20!"); balance = balance + 20; System.out.println("--> Your new balance: $" + balance + " <--"); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); break; case 2: System.out.println("You won $10! Its a free spin, I guess..."); balance = balance + 10; System.out.println("--> Your new balance: $" + balance + " <--"); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); break; case 3: System.out.println("You won $5! At least its somethin..."); balance = balance + 5; System.out.println("--> Your new balance: $" + balance + " <--"); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); break; default: System.out.println("Sorry, no luck this time..."); System.out.println("--> Your new balance: $" + balance + " <--"); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); break; } } } continueGambling = scanner.nextLine(); } else { String wrongValue = "Invalid response. Please try again."; System.out.println(wrongValue); } } else if (yesOrNo.equalsIgnoreCase("No")) { System.out.println("You sure are missing out..."); } else { System.out.println("Invalid response. Please try again."); } scanner.close(); } }
问题排查与修复
核心问题
- 循环外更新控制变量:你把
continueGambling = scanner.nextLine();放在了while循环外面,循环内部没有更新这个变量,导致循环无法感知用户的继续选择,只会一直等待输入。 - 缺少无效输入处理:当用户输入非A/B/C的内容时,程序没有任何反馈,直接进入下一次循环,体验极差。
- 选项提示位置错误:赌博选项只在第一次赌博前显示,后续循环不会重新提示,不符合用户操作逻辑。
修复后的代码
import java.util.Random; import java.util.Scanner; public class Gambler { public static void main(String[] args) { Random random = new Random(); Scanner scanner = new Scanner(System.in); int balance = 100; System.out.println(); System.out.println("--> Current Balance: $" + balance + " <--"); System.out.println(); System.out.println("Would you like to enter the Java Gambler simulator?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); String yesOrNo = scanner.nextLine(); if (yesOrNo.equalsIgnoreCase("Yes")) { System.out.println(); System.out.println("[!] Welcome to the Java Gambler! [!]"); System.out.println(); System.out.println("The only Java gambling software in all of Java County!"); System.out.println(); System.out.println("If the chosen number is {1}, the player automatically wins $20."); System.out.println("If the chosen number is {2}, the player automatically wins $10."); System.out.println("If the chosen number is {3}, the player automatically wins $5."); System.out.println("All other numbers are an automatic loss."); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); String yesOrNo2 = scanner.nextLine(); if (yesOrNo2.equalsIgnoreCase("Yes")) { String continueGambling = "Yes"; while (continueGambling.equalsIgnoreCase("Yes")) { // 每次循环重新显示赌博选项 System.out.println(); System.out.println("Gambling Options:"); System.out.println(); System.out.println("[A] $1 Bet (1/20 $20, 1/20 $10, 1/20 $5)"); System.out.println("[B] $5 Bet (1/10 $20, 1/10 $10, 1/10 $5)"); System.out.println("[C] $10 Bet (1/5 $20, 1/5 $10, 1/5 $5)"); System.out.println(); System.out.println("Gambling Selection: "); System.out.println(); String gamblingSelection = scanner.nextLine(); boolean validSelection = true; if (gamblingSelection.equalsIgnoreCase("A")) { balance -= 1; int aSelection = random.nextInt(20) + 1; System.out.println(); System.out.println("And the number is... " + aSelection); System.out.println(); switch (aSelection) { case 1: System.out.println("Congrats, you have won $20!"); balance += 20; break; case 2: System.out.println("Congrats, you have won $10!"); balance += 10; break; case 3: System.out.println("Congrats, you have won $5!"); balance += 5; break; default: System.out.println("Sorry, no luck this time..."); break; } } else if (gamblingSelection.equalsIgnoreCase("B")) { balance -= 5; int bSelection = random.nextInt(10) + 1; System.out.println(); System.out.println("And the number is... " + bSelection); System.out.println(); switch (bSelection) { case 1: System.out.println("Congrats, you have won $20!"); balance += 20; break; case 2: System.out.println("Congrats, you have won $10!"); balance += 10; break; case 3: System.out.println("You won $5! Its a free spin, I guess..."); balance += 5; break; default: System.out.println("Sorry, no luck this time..."); break; } } else if (gamblingSelection.equalsIgnoreCase("C")) { balance -= 10; int cSelection = random.nextInt(5) + 1; System.out.println(); System.out.println("And the number is... " + cSelection); System.out.println(); switch (cSelection) { case 1: System.out.println("Congrats, you have won $20!"); balance += 20; break; case 2: System.out.println("You won $10! Its a free spin, I guess..."); balance += 10; break; case 3: System.out.println("You won $5! At least its somethin..."); balance += 5; break; default: System.out.println("Sorry, no luck this time..."); break; } } else { System.out.println("Invalid selection! Please choose A/B/C."); validSelection = false; } // 只有选择有效时,才显示余额并询问是否继续 if (validSelection) { System.out.println("--> Your new balance: $" + balance + " <--"); System.out.println(); System.out.println("Continue?"); System.out.println(); System.out.println("[Yes] [No]"); System.out.println(); // 在循环内部更新控制变量 continueGambling = scanner.nextLine(); } } System.out.println("Thanks for playing!"); } else { System.out.println("Invalid response. Please try again."); } } else if (yesOrNo.equalsIgnoreCase("No")) { System.out.println("You sure are missing out..."); } else { System.out.println("Invalid response. Please try again."); } scanner.close(); } }
修复说明
- 将
continueGambling的输入读取移到while循环内部,每次赌博结束后更新变量,控制循环是否继续 - 增加无效选择处理,输入非A/B/C时提示错误,不扣除余额
- 将赌博选项提示移到循环内部,每次继续赌博时重新显示
- 简化余额加减写法(如
balance -= 1),代码更简洁
内容的提问来源于stack exchange,提问作者Brock Benton
相关产品推荐
相关产品推荐

