如何基于现有Die类实现掷出全部1-6唯一点数后停止的功能?
没问题!我来帮你一步步实现这个需求~
实现思路与代码示例
首先,我们得先把你提供的Die类补全,因为它缺少关键的roll()方法实现和getFaceValue()方法(这正是你需要用来获取当前点数的核心方法):
public class Die { public final int MAX = 6; // 骰子最大点数 private int faceValue; // 当前显示的点数 // 构造方法:初始点数设为1 public Die() { faceValue = 1; } // 掷骰子方法:生成1到MAX的随机数并返回 public int roll(){ faceValue = (int)(Math.random() * MAX) + 1; return faceValue; } // 获取当前点数的方法(你需要的getFace相关方法) public int getFaceValue(){ return faceValue; } }
接下来,我们创建一个新的类(比如叫CompleteFaceCollector),完全基于你提到的布尔状态标记思路,实现“收集全1-6所有点数后停止”的逻辑:
public class CompleteFaceCollector { private Die die; private boolean[] hasRolledFace; // 记录每个点数是否被掷出过 private int totalRolls; // 记录总共掷了多少次 // 构造方法:初始化骰子和状态数组 public CompleteFaceCollector() { die = new Die(); // 数组长度设为7,索引0不用,1-6直接对应点数1-6,避免索引转换麻烦 hasRolledFace = new boolean[7]; totalRolls = 0; } // 核心方法:开始掷骰子直到收集全所有点数 public void startCollecting() { System.out.println("开始掷骰子,目标是收集到1-6所有点数..."); // 循环:只要没收集全所有点数,就继续掷 while (!allFacesCollected()) { die.roll(); totalRolls++; int currentFace = die.getFaceValue(); // 用getFaceValue获取当前点数 // 如果这个点数还没被掷出过,标记为已掷出 if (!hasRolledFace[currentFace]) { hasRolledFace[currentFace] = true; System.out.println("第" + totalRolls + "次掷出了新点数:" + currentFace); } else { System.out.println("第" + totalRolls + "次掷出了重复点数:" + currentFace); } } System.out.println("\n完成!已经收集到1-6所有点数,总共掷了" + totalRolls + "次!"); } // 辅助方法:检查是否所有点数都已被掷出过 private boolean allFacesCollected() { // 遍历1-6的点数对应的数组索引 for (int i = 1; i <= 6; i++) { // 只要有一个点数没被掷出,就返回false if (!hasRolledFace[i]) { return false; } } // 所有点数都被掷出了,返回true return true; } // 测试用主方法 public static void main(String[] args) { CompleteFaceCollector collector = new CompleteFaceCollector(); collector.startCollecting(); } }
关键逻辑解释
- 布尔数组的用法:
hasRolledFace数组的每个索引对应一个点数(比如hasRolledFace[5]为true表示点数5已经被掷出过),初始时所有元素都是false,每次掷出一个新点数就把对应位置设为true。 - getFaceValue的作用:每次调用
die.roll()后,通过die.getFaceValue()获取当前骰子的点数,这样我们才能知道要更新数组的哪个位置。 - 停止条件:
allFacesCollected()方法会遍历数组的1-6索引,只要有一个位置是false,就说明还没收集全,继续循环;当所有位置都是true时,循环停止。
内容的提问来源于stack exchange,提问作者WickdLotus
相关产品推荐
相关产品推荐

