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

如何在micro:bit摩斯码翻译器中使用列表实现按键序列识别?

问题描述

我正在为micro:bit制作一款摩斯码翻译器,设定Button A代表点、Button B代表划、同时按下两个按键作为确认键。但我不了解列表的用法,不知道如何通过列表匹配按键序列来实现字符转换。我编写了如下代码:

Alist = ["ButtonA", "ButtonB", "ButtonAB"]
Blist = ["ButtonB", "ButtonA", "ButtonA", "ButtonA", "ButtonAB"]
Clist = ["ButtonB", "ButtonA", "ButtonB", "ButtonA", "ButtonAB"]
Dlist = ["ButtonB", "ButtonA", "ButtonA", "ButtonAB"]
Elist = ["ButtonA", "ButtonAB"]
Flist = ["ButtonA", "ButtonA", "ButtonB", "ButtonA", "ButtonAB"]
Glist = ["ButtonB", "ButtonB", "ButtonA", "ButtonAB"]
Hlist = ["ButtonA", "ButtonA", "ButtonA", "ButtonA", "ButtonAB"]
Ilist = ["ButtonA", "ButtonA", "ButtonAB"]
Jlist = ["ButtonA", "ButtonB", "ButtonB", "ButtonB", "ButtonAB"]
Klist = ["ButtonB", "ButtonA", "ButtonB", "ButtonAB"]
Llist = ["ButtonA", "ButtonB", "ButtonA", "ButtonA", "ButtonAB"]
Mlist = ["ButtonB", "ButtonB", "ButtonAB"]
Nlist = ["ButtonB", "ButtonA", "ButtonAB"]
Olist = ["ButtonB", "ButtonB", "ButtonB", "ButtonAB"]
Plist = ["ButtonA", "ButtonB", "ButtonB", "ButtonA", "ButtonAB"]
Qlist = ["ButtonB", "ButtonB", "ButtonB", "ButtonA", "ButtonAB"]
Rlist = ["ButtonA", "ButtonB", "ButtonA", "ButtonAB"]
Slist = ["ButtonA", "ButtonA", "ButtonA", "ButtonAB"]
Tlist = ["ButtonB", "ButtonAB"]
Ulist = ["ButtonA", "ButtonA", "ButtonB", "ButtonAB"]
Vlist = ["ButtonA", "ButtonA", "ButtonA", "ButtonB", "ButtonAB"]
Wlist = ["ButtonA", "ButtonB", "ButtonB", "ButtonAB"]
Xlist = ["ButtonB", "ButtonA", "ButtonA", "ButtonB", "ButtonAB"]
Ylist = ["ButtonB", "ButtonA", "ButtonB", "ButtonB", "ButtonAB"]
Zlist = ["ButtonB", "ButtonB", "ButtonAB"]
ButtonA = input.button_is_pressed[Button.A]
ButtonB = input.is_button_pressed[Button.B]
ButtonAB = input.button_is_pressed[Button.AB]

if Alist:
    basic.show_string("A")

我尝试用if语句判断Alist来显示字母A,但未能成功实现功能,希望了解列表的正确使用方法。

解决方案

你的代码存在几个核心问题,这里一步步帮你修正:

1. 列表使用逻辑错误

if Alist:的判断永远为真,因为非空列表在Python中会被视为True,这和你要匹配按键序列的需求完全不符。你需要先收集用户的按键操作序列,再和预设的摩斯码序列对比。

2. 按键状态获取方式错误

micro:bit的按键API调用有误,正确写法是input.button_is_pressed(Button.A)(用括号而非方括号),而且你需要实时检测按键事件,而非仅获取一次状态。

3. 数据结构设计不合理

单独为每个字母创建列表会让代码冗余且难以维护,应该用字典把摩斯码序列(用点/划表示更直观)和对应字母映射起来,比如{".-": "A", "-...": "B"},后续匹配会更简单。

修正后的完整代码

# 摩斯码与字母的映射字典
morse_code = {
    ".-": "A", "-...": "B", "-.-.": "C", "-..": "D", ".": "E",
    "..-.": "F", "--.": "G", "....": "H", "..": "I", ".---": "J",
    "-.-": "K", ".-..": "L", "--": "M", "-.": "N", "---": "O",
    ".--.": "P", "--.-": "Q", ".-.": "R", "...": "S", "-": "T",
    "..-": "U", "...-": "V", ".--": "W", "-..-": "X", "-.--": "Y",
    "--..": "Z"
}

current_sequence = ""

def on_button_pressed_a():
    global current_sequence
    current_sequence += "."
    basic.show_string(".")
input.on_button_pressed(Button.A, on_button_pressed_a)

def on_button_pressed_b():
    global current_sequence
    current_sequence += "-"
    basic.show_string("-")
input.on_button_pressed(Button.B, on_button_pressed_b)

def on_button_pressed_ab():
    global current_sequence
    # 查找当前序列对应的字母
    if current_sequence in morse_code:
        basic.show_string(morse_code[current_sequence])
    else:
        basic.show_string("?")
    # 重置序列,准备下一次输入
    current_sequence = ""
input.on_button_pressed(Button.AB, on_button_pressed_ab)

代码说明

  • 用morse_code字典替代大量单独列表,结构更清晰,维护更方便。
  • 通过on_button_pressed事件监听函数,实时记录用户按键操作:按A添加点,按B添加划。
  • 同时按AB时,检查当前记录的序列是否在字典中,显示对应字母后重置序列,准备下一次输入。

内容的提问来源于stack exchange,提问作者Ethan A.K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:32:29