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(); } }
四、代码说明
- Player类封装性:将骰子操作与分数管理全部封装在Player类中,符合面向对象设计,代码更清晰易维护
- 庄家逻辑正确性:严格遵循规则,仅在玩家未爆牌时行动,循环掷骰子直到满足停止条件
- 用户交互优化:增加无效输入的处理,输出信息更友好
- 胜负判定全面:覆盖玩家爆牌、庄家爆牌、分数高低、平局所有场景
内容的提问来源于stack exchange,提问作者Jaden Laborete
相关产品推荐
相关产品推荐

