micro:bit 不重复抽签器:抽走一个号码,长按后再开启新一轮

2026-10-22 / 0 评论 / 6 阅读

micro:bit 不重复抽签器:抽走一个号码,长按后再开启新一轮 教程示意图

适用场景

本文整理于 2026-10-22,使用 micro:bit V2 制作一个五个号码的桌面抽签器。可以把五项练习、五个展示顺序或五张任务卡编号为 1 到 5,按 A 抽取一个号码,同一轮内每个号码只会出现一次;长按 B 一秒开始新一轮。

项目仅使用板载按钮与点阵屏,不需要外接电路。它适合学习列表、随机选择和按钮处理。该程序用于课堂练习或日常游戏,不用于有奖金、法律效力或需要可审计公平性的抽签。

原理:从袋子里取走,而不是反复猜数字

直接反复生成 1 到 5 的随机数,会出现重复号码。这里使用一个列表保存尚未抽走的号码,把它想象成装有五张签的袋子。每次先随机选择一个有效位置,再用列表删除操作取走该位置的号码。

列表长度会依次变为四、三、二、一、零。只要取走后不放回,当前轮次就不会重复。列表为空时显示横线,不再生成随机下标,也不会自动开始下一轮,避免用户不知道轮次已经改变。

随机函数的上下界都包含在结果范围内,因此长度为五时,下标应从 0 到 4。有关边界定义见 MicroPython 随机数官方文档。

准备工作

准备 micro:bit V2、支持数据传输的 USB 线,以及能够为该板烧录 MicroPython 程序的编辑器。先将原有程序另存到电脑,再新建本项目。本文代码使用 micro:bit MicroPython,不适用于直接粘贴到其他 Python 运行环境。

板上不接鳄鱼夹、电机或其他负载。使用 USB 供电时避免底部触点接触金属桌面,移动板子时拿住边缘。以后若增加外接灯,必须断电接线并为 LED 配置限流电阻,不能直接套用本项目的无外接电路条件。

分步骤操作

第一步:约定显示与按钮含义

上电显示字母 R,表示已经准备好新一轮。按 A 显示本次抽中的数字;五个号码抽完后,再按 A 显示横线。长按 B 至少一秒重置列表,重新显示 R。

B 按住期间忽略 A。重置完成后,程序等待 B 松开才继续,避免一次长按反复重置。这个等待是本项目明确选择的交互行为,等待期间不会处理抽签请求。

第二步:输入完整程序

将下列程序作为一个整体写入编辑器,保持缩进一致:

from microbit import button_a, button_b, display, sleep, running_time
import random

bag = [1, 2, 3, 4, 5]
b_started = None
display.show('R')

while True:
    if button_b.is_pressed():
        button_a.was_pressed()
        if b_started is None:
            b_started = running_time()

        if running_time() - b_started >= 1000:
            bag = [1, 2, 3, 4, 5]
            display.show('R')
            while button_b.is_pressed():
                button_a.was_pressed()
                sleep(20)
            button_a.was_pressed()
            b_started = None
    else:
        b_started = None
        if button_a.was_pressed():
            if len(bag) == 0:
                display.show('-')
            else:
                index = random.randint(0, len(bag) - 1)
                number = bag.pop(index)
                display.show(str(number))

    sleep(20)

bag 保存剩余号码;index 是本次随机选中的位置;number 是取出的号码。b_started 记录本次按下 B 的开始时间,初始值为空,表示还没有开始计时。程序没有需要替换的设备地址或登录参数。

第三步:理解按钮处理

is_pressed() 查询按钮现在是否按住,适合测量长按;was_pressed() 查询自上次读取后是否出现过按下事件,读取时会清除该事件记录。两者含义不同,官方定义见 Buttons 文档。

程序在 B 分支中读取 A 的事件,是有意丢弃重置期间的误触,避免松开 B 后突然补抽一个号码。每轮休眠二十毫秒,使循环保持适度响应。计时使用启动后的毫秒数,其用法可参见官方按钮教程。

第四步:烧录并完成第一轮

使用编辑器提供的烧录功能将程序传到板上,等待完成后确认显示 R。每次按下并松开 A,将屏幕数字记到纸上。连续操作五次,应得到 1 到 5 的某种排列;第六次按 A 应显示横线。

长按 B,等到显示 R 后松开,再进行第二轮。两轮之间可以出现相同顺序,因为随机选择不保证每轮排列都不同。

验证方法

验证重点是规则,而不是凭感觉判断随机程度。首先确认一轮五个结果无重复且没有遗漏;其次确认抽空后连续按 A 都只显示横线;再确认短按 B 不会把已经抽走的号码放回。

随后测试长按 B 超过一秒但持续不松手,屏幕应保持 R,松开后才恢复抽签。重置期间按 A,松开 B 后不应自动出现号码。最后断电重启,应重新显示 R,因为本程序没有把轮次写入非易失存储。

常见错误

随机下标上界写成列表长度,会偶尔选中不存在的位置。先计算下标、后判断列表是否为空,也会在抽空后出错。本文先检查长度,只有非空才生成有效下标。

如果一按 A 就快速抽空,应检查是否把事件查询改成了当前按住状态查询。一直按住属于持续状态,快速循环会执行多次。反过来,极快地连续按多次 A,也可能在两次查询之间合并成一个事件,因此按一次、看清结果再继续更适合这个交互设计。

安全与回退

不要在连接 USB 时让裸露触点碰到导电物体。烧录失败时先检查数据线和板卡连接,再重新烧录,不要随意短接触点。

修改程序前保存当前版本。若增加人数,建议先保持单个数字显示范围,再同步修改初始化和重置位置中的两个列表。需要恢复原功能时重新烧录之前保存的程序;重新上电会丢弃当前抽签进度,活动过程中应避免拔线。

参考资料与转载说明

本文依据上述公开资料进行中文原创整理,不是逐句翻译,也不替代厂商手册。操作前请核对自己的版本、型号和备份。

评论一下?

OωO
取消