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

如何基于现有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:05:52