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

21点骰子游戏:电脑庄家掷骰子逻辑实现及代码完善问询

《21点游戏》代码完善方案

一、核心需求梳理

明确游戏关键规则与代码要求:

  • 以两个六面骰子替代纸牌,玩家与庄家(电脑)对战
  • 必须实现Player类,包含两个Die对象,需提供以下功能:
    • 获取当前累计分数
    • 重置分数为0
    • 执行掷骰子操作并累加分数
  • 玩家回合:循环询问是否掷骰子,直到玩家选择停止或分数超过21(爆牌)
  • 庄家回合:玩家停止且未爆牌时,庄家持续掷骰子,直到分数超过玩家且≤21,或爆牌
  • 最终比较双方分数,判定胜负

二、分步实现解决方案

1. 实现标准Die类

补全课堂上的六面骰子模拟类:

import java.util.Random;

public class Die {
    private int value;
    private Random random;

    public Die() {
        random = new Random();
        roll(); // 初始化时自动掷一次骰子
    }

    // 掷骰子,生成1-6的随机点数
    public void roll() {
        value = random.nextInt(6) + 1;
    }

    // 获取当前骰子点数
    public int getValue() {
        return value;
    }
}

2. 实现符合要求的Player类

封装骰子操作与分数管理,满足需求中的类功能要求:

public class Player {
    private Die die1;
    private Die die2;
    private int currentScore;

    public Player() {
        die1 = new Die();
        die2 = new Die();
        currentScore = 0;
    }

    // 掷两个骰子并累加分数到当前总分
    public void rollDice() {
        die1.roll();
        die2.roll();
        currentScore += die1.getValue() + die2.getValue();
    }

    // 获取当前累计分数
    public int getCurrentScore() {
        return currentScore;
    }

    // 重置分数为0,用于新局准备
    public void resetScore() {
        currentScore = 0;
    }

    // 获取本次掷骰子的两个点数(用于输出展示)
    public int getDie1Value() {
        return die1.getValue();
    }

    public int getDie2Value() {
        return die2.getValue();
    }
}

3. 完善庄家掷骰子逻辑

庄家行动需严格遵循规则:

  • 仅在玩家未爆牌且选择停止后启动
  • 循环掷骰子,直到分数超过玩家且≤21,或爆牌(分数>21)
  • 每次掷骰子后输出当前点数与累计分数

三、完整Game类代码

整合所有逻辑,修复原代码的问题:

import java.util.Scanner;

public class Game {
    public static final int MAX_SCORE = 21;

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        Player player = new Player();
        Player dealer = new Player();

        System.out.println("=== 21点骰子游戏 ===");

        // 玩家回合
        while (true) {
            System.out.println("\n你当前分数:" + player.getCurrentScore());
            System.out.println("是否要掷骰子?(1=是,2=否)");
            int userInput = kb.nextInt();

            if (userInput == 1) {
                player.rollDice();
                System.out.printf("你掷出了 %d 和 %d,当前分数:%d%n",
                        player.getDie1Value(), player.getDie2Value(), player.getCurrentScore());

                // 检查玩家是否爆牌
                if (player.getCurrentScore() > MAX_SCORE) {
                    System.out.println("你爆牌了!");
                    break;
                }
                // 检查玩家是否直接拿到21点
                if (player.getCurrentScore() == MAX_SCORE) {
                    System.out.println("你拿到了21点!");
                    break;
                }
            } else if (userInput == 2) {
                System.out.println("你选择停止掷骰子,轮到庄家行动。");
                break;
            } else {
                System.out.println("输入无效,请输入1或2!");
            }
        }

        // 庄家回合:仅当玩家未爆牌时执行
        if (player.getCurrentScore() <= MAX_SCORE) {
            System.out.println("\n=== 庄家回合 ===");
            while (true) {
                dealer.rollDice();
                System.out.printf("庄家掷出了 %d 和 %d,当前分数:%d%n",
                        dealer.getDie1Value(), dealer.getDie2Value(), dealer.getCurrentScore());

                // 庄家停止条件:分数超过玩家且≤21,或者爆牌
                if (dealer.getCurrentScore() > MAX_SCORE) {
                    System.out.println("庄家爆牌了!");
                    break;
                }
                if (dealer.getCurrentScore() > player.getCurrentScore()) {
                    System.out.println("庄家分数超过你,停止掷骰子。");
                    break;
                }
                // 若庄家分数等于玩家且小于21,继续掷骰子
            }
        }

        // 判定胜负
        System.out.println("\n=== 游戏结果 ===");
        System.out.printf("你的分数:%d | 庄家分数:%d%n", player.getCurrentScore(), dealer.getCurrentScore());

        if (player.getCurrentScore() > MAX_SCORE) {
            System.out.println("你输了!");
        } else if (dealer.getCurrentScore() > MAX_SCORE) {
            System.out.println("你赢了!");
        } else if (player.getCurrentScore() > dealer.getCurrentScore()) {
            System.out.println("你赢了!");
        } else if (dealer.getCurrentScore() > player.getCurrentScore()) {
            System.out.println("你输了!");
        } else {
            System.out.println("平局!");
        }

        kb.close();
    }
}

四、代码说明

  1. Player类封装性:将骰子操作与分数管理全部封装在Player类中,符合面向对象设计,代码更清晰易维护
  2. 庄家逻辑正确性:严格遵循规则,仅在玩家未爆牌时行动,循环掷骰子直到满足停止条件
  3. 用户交互优化:增加无效输入的处理,输出信息更友好
  4. 胜负判定全面:覆盖玩家爆牌、庄家爆牌、分数高低、平局所有场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:20:44