如何在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.
相关产品推荐
相关产品推荐

