如何实现每轮仅单次掷指定骰子的Java循环Switch逻辑?
解决骰子游戏每轮单骰子仅能掷一次的问题
核心思路
添加三个布尔变量跟踪每个骰子的投掷状态,用户选择骰子时先校验状态:若该骰子已被投掷,直接提示无法重复操作;未投掷则执行掷骰子逻辑,并标记该骰子为已投掷状态。每轮结束后重置所有骰子的状态和数值。
修改后的完整代码
import java.util.Scanner; class Main { public static void main(String[] args) { Scanner diceInput = new Scanner(System.in); String diceNumber = ""; int dice1 = 0; int dice2 = 0; int dice3 = 0; int win = 0; int loss = 0; int sum = 0; int rolls = 3; // 跟踪每个骰子是否已被投掷 boolean dice1Rolled = false; boolean dice2Rolled = false; boolean dice3Rolled = false; // intro System.out.print("Welcome to the game 12. You must roll 1-3 dice and try to get the sum 12"); // 循环直到输入q或本轮投掷次数耗尽 while ((!"q".equals(diceNumber)) || (rolls > 0)) { System.out.print("\nEnter which dice you want to roll [1,2,3] (exit with q): "); diceNumber = diceInput.nextLine(); sum = dice1 + dice2 + dice3; switch (diceNumber) { case "1": if (dice1Rolled) { System.out.println("骰子1已经掷过了,不能重复投掷!"); break; } dice1 = (int) (Math.random() * 6) + 1; sum = dice1 + dice2 + dice3; rolls--; dice1Rolled = true; break; case "2": if (dice2Rolled) { System.out.println("骰子2已经掷过了,不能重复投掷!"); break; } dice2 = (int) (Math.random() * 6) + 1; sum = dice1 + dice2 + dice3; rolls--; dice2Rolled = true; break; case "3": if (dice3Rolled) { System.out.println("骰子3已经掷过了,不能重复投掷!"); break; } dice3 = (int) (Math.random() * 6) + 1; sum = dice1 + dice2 + dice3; rolls--; dice3Rolled = true; break; case "q": System.out.println("Game Over!"); System.exit(0); default: System.out.println("输入无效,请输入1、2、3或q!"); } // 仅在有效投掷后判断胜负 if (("1".equals(diceNumber) && dice1Rolled) || ("2".equals(diceNumber) && dice2Rolled) || ("3".equals(diceNumber) && dice3Rolled)) { if (sum > 12) { loss++; } else if (sum == 12) { win++; } } System.out.println(dice1 + " " + dice2 + " " + dice3 + " " + "sum " + sum + " #win " + win + " # loss " + loss); // 一轮结束后重置骰子状态和数值 if ((rolls == 0) || (sum == 12)) { dice1 = 0; dice2 = 0; dice3 = 0; dice1Rolled = false; dice2Rolled = false; dice3Rolled = false; System.out.println("Next Round"); rolls = 3; } } diceInput.close(); } }
关键修改说明
- 状态跟踪变量:新增三个布尔变量记录骰子是否已被投掷,初始为
false表示未投掷。 - 投掷校验逻辑:每个骰子的case分支先检查状态,已投掷则提示并终止分支;未投掷则执行掷骰子、标记状态、减少剩余次数的操作。
- 轮次重置:一轮结束时,除了重置骰子数值,同步重置三个状态变量,确保下一轮可重新投掷所有骰子。
- 无效输入处理:添加
default分支处理非1/2/3/q的输入,优化用户体验。
内容的提问来源于stack exchange,提问作者user19871418
相关产品推荐
相关产品推荐

