You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现每轮仅单次掷指定骰子的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();
    }
}

关键修改说明

  1. 状态跟踪变量:新增三个布尔变量记录骰子是否已被投掷,初始为false表示未投掷。
  2. 投掷校验逻辑:每个骰子的case分支先检查状态,已投掷则提示并终止分支;未投掷则执行掷骰子、标记状态、减少剩余次数的操作。
  3. 轮次重置:一轮结束时,除了重置骰子数值,同步重置三个状态变量,确保下一轮可重新投掷所有骰子。
  4. 无效输入处理:添加default分支处理非1/2/3/q的输入,优化用户体验。

内容的提问来源于stack exchange,提问作者user19871418

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:40:38