如何修复六面骰子Dice类?Craps游戏骰子数值异常问题
问题分析与解决方案
核心问题
你的代码逻辑存在根本性误解:
- 你创建的
Dice(2,6)对象,每次调用roll()方法时,会同时投掷2个6面骰子,并返回这两个骰子的点数总和。 - 但你在Game代码里,把两次
roll()的结果当成了单个骰子的点数,导致输出的"roll1""roll2"其实都是两个骰子的和(比如12就是两个6的和),这才出现了点数大于6的异常,同时计算的sum其实是4个骰子的总和,完全不符合Craps游戏规则。
解决方案一:将Design改为单骰子工具类
把Dice设计成单个骰子的类,每次roll()返回单个骰子的点数,通过两次调用模拟投掷两个骰子的操作:
修改后的Dice类:
import java.util.Random; public class Dice { private static final Random random = new Random(); private final int numSides; public Dice(int numSides) { this.numSides = numSides; } public int roll() { return random.nextInt(numSides) + 1; } }
Game类调用代码:
public Game() { // filler dice = new Dice(6); // 单个6面骰子 } // 投掷两个骰子 int roll1 = dice.roll(); int roll2 = dice.roll(); int sum = roll1 + roll2; System.out.println("Come out roll is (" + roll1 + ")(" + roll2 + ") sum is " + sum);
解决方案二:让Dice返回所有骰子的点数数组
如果需要保留Dice支持多骰子的设计,可以修改roll()方法返回每个骰子的点数数组,既能拿到单个骰子数值,也能计算总和:
修改后的Dice类:
import java.util.Random; public class Dice { private final int numDice; private final int numSides; private final Random random; public Dice(int numDice, int numSides) { this.numDice = numDice; this.numSides = numSides; this.random = new Random(); } public int[] roll() { int[] results = new int[numDice]; for (int i = 0; i < numDice; i++) { results[i] = random.nextInt(numSides) + 1; } return results; } // 可选:添加总和计算方法 public int getSum(int[] diceRolls) { int total = 0; for (int roll : diceRolls) { total += roll; } return total; } }
Game类调用代码:
public Game() { // filler dice = new Dice(2, 6); // 两个6面骰子 } // 投掷并获取每个骰子的点数 int[] rolls = dice.roll(); int sum = dice.getSum(rolls); System.out.println("Come out roll is (" + rolls[0] + ")(" + rolls[1] + ") sum is " + sum);
内容的提问来源于stack exchange,提问作者John Martin
相关产品推荐
相关产品推荐

