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

基于BBC micro:bit V1的DND虚拟骰子双按钮功能实现求助

解决micro:bit DND虚拟骰子的切换与掷骰问题

问题核心

你需要用两个按钮实现:按钮B切换D4/D6/D8/D10/D12/D20等骰子类型,按钮A掷出对应点数,现有代码的问题在于没有正确用数组管理骰子类型,且按钮B的响应逻辑完全缺失。

关键修正思路

  1. 用数组存储所有骰子的面数(比如[4,6,8,10,12,20]),而不是存随机数
  2. 用一个变量跟踪当前选中的骰子索引,按B时切换索引(循环切换,避免越界)
  3. 按钮A根据当前索引对应的面数生成随机点数

完整可运行代码

// 定义所有需要的骰子面数
let diceTypes = [4, 6, 8, 10, 12, 20]
// 跟踪当前选中的骰子索引,默认从D4开始
let currentDiceIndex = 0

// 按钮A:掷出当前选中的骰子
input.onButtonPressed(Button.A, function () {
    let max = diceTypes[currentDiceIndex]
    let result = randint(1, max)
    basic.showString("D" + max + "=" + result)
})

// 按钮B:切换骰子类型,循环切换
input.onButtonPressed(Button.B, function () {
    currentDiceIndex += 1
    // 如果到了最后一个骰子,回到第一个
    if (currentDiceIndex >= diceTypes.length) {
        currentDiceIndex = 0
    }
    // 显示当前选中的骰子类型
    basic.showString("D" + diceTypes[currentDiceIndex])
})

// 初始化显示第一个骰子
basic.showString("D" + diceTypes[currentDiceIndex])

代码解释

  • diceTypes数组:把所有需要的骰子面数存起来,想加新骰子直接在数组里追加数字就行
  • currentDiceIndex:记录当前选的是数组里第几个骰子,按B就加1,到数组末尾就重置为0,实现循环切换
  • 按钮A逻辑:拿到当前骰子的最大面数,用randint(1, max)生成1到max的随机数,然后显示结果
  • 按钮B逻辑:切换索引后,立刻显示当前选中的骰子类型,让你明确当前的骰子种类

为什么你之前的代码不行?

  1. 你写的if (input.buttonIsPressed(Button.B))只在程序启动时执行一次,不会持续响应按钮按下,必须用input.onButtonPressed(Button.B)的事件回调才能实时触发切换
  2. swapOut数组存的是随机数,不是骰子的面数,逻辑完全搞反——应该先存骰子类型,掷骰时再生成随机数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:25:07