树莓派密码猜测游戏代码问题:循环持续打印错误及语句异常
树莓派密码猜测游戏代码修复方案
问题根源分析
你的代码存在以下关键错误,导致程序持续打印错误提示、逻辑混乱:
1. 键盘读取函数(read_keypad)的致命错误
- 缩进错误:
for col循环前多了空格,触发语法错误 - 按键索引计算错误:
keys[row 3 + col]缺少乘号,应为keys[row * 3 + col] - 引脚初始化错误:未提前将行引脚设为输入上拉模式,且每次循环重复创建Pin对象,导致误触或读取异常
- 无防抖处理:按键按下后未等待释放,会重复读取同一按键
- 返回值逻辑错误:每次循环遍历所有列,导致
entered_password可能一次性获取多个字符或空值
2. PWM配置错误
duty_u16方法仅接受一个0-65535范围内的占空比参数,代码中number_1_pwm.duty_u16(password[0], 20)的写法完全错误,需改为password[0] * 10000这类比例值(密码为1-5,乘以10000后落在合法范围内)
3. 主循环逻辑错误
- 每次循环都会重新调用
read_keypad获取输入,内部的user_input = ""无效 - 输入长度不足3位时直接报错,未实现“逐步输入3位密码”的正常逻辑
- 无输入时频繁触发错误提示,导致程序不断打印错误信息
修正后的完整代码
import random from machine import Pin, PWM import time # 初始化密码显示引脚(PWM) number_1_pin = Pin(18) number_2_pin = Pin(19) number_3_pin = Pin(20) # 初始化LED引脚 green_led_pin = Pin(14, Pin.OUT) red_led_pin = Pin(12, Pin.OUT) # 生成1-5的3位随机密码 password = [random.randint(1, 5), random.randint(1, 5), random.randint(1, 5)] print(f"调试用密码:{''.join(str(x) for x in password)}") # 调试用,正式环境可删除 # 配置PWM显示密码(占空比对应密码数值,范围0-65535) number_1_pwm = PWM(number_1_pin) number_1_pwm.freq(100) number_1_pwm.duty_u16(password[0] * 10000) # 1-5对应10000-50000 number_2_pwm = PWM(number_2_pin) number_2_pwm.freq(100) number_2_pwm.duty_u16(password[1] * 10000) number_3_pwm = PWM(number_3_pin) number_3_pwm.freq(100) number_3_pwm.duty_u16(password[2] * 10000) # 初始化键盘引脚:行引脚设为输入上拉,列引脚设为输出高电平 row_pins = [Pin(pin, Pin.IN, Pin.PULL_UP) for pin in [2, 3, 4, 5]] col_pins = [Pin(pin, Pin.OUT, value=1) for pin in [6, 7, 9]] # 键盘按键映射 keys = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "", "0", "#" ] def read_keypad(): """读取键盘单次按下的按键,返回对应字符,无按键则返回空""" for col_idx, col_pin in enumerate(col_pins): # 将当前列拉低 col_pin.value(0) time.sleep(0.01) # 消抖延迟 for row_idx, row_pin in enumerate(row_pins): if row_pin.value() == 0: # 等待按键释放,避免重复读取 while row_pin.value() == 0: time.sleep(0.01) col_pin.value(1) # 恢复列电平 return keys[row_idx * 3 + col_idx] # 恢复当前列电平 col_pin.value(1) return "" # 主循环:逐步收集3位密码输入 while True: entered = [] print("请输入3位密码:") # 收集3位有效数字输入 while len(entered) < 3: key = read_keypad() if key and key.isdigit(): entered.append(key) print(f"已输入:{''.join(entered)}") time.sleep(0.05) user_input = ''.join(entered) # 验证密码 if user_input == ''.join(str(x) for x in password): print("Correct password!") green_led_pin.value(1) time.sleep(2) green_led_pin.value(0) break else: print("Incorrect password.") red_led_pin.value(1) time.sleep(2) red_led_pin.value(0) # 清理资源 number_1_pwm.deinit() number_2_pwm.deinit() number_3_pwm.deinit()
关键修复说明
键盘读取逻辑重构:
- 提前初始化所有键盘引脚,行引脚设为
PULL_UP输入,避免误触 - 单次读取单个按键,等待按键释放后返回,避免重复读取
- 仅返回有效按键字符,无按键时返回空
- 提前初始化所有键盘引脚,行引脚设为
PWM配置修正:
- 修正
duty_u16的参数错误,用密码数值乘以比例系数生成合法的占空比值
- 修正
主循环逻辑优化:
- 改为逐步收集3位数字输入,符合密码输入的正常逻辑
- 仅在输入完成后验证密码,避免频繁触发错误提示
- 添加调试用的密码打印,方便测试(正式环境可删除)
内容的提问来源于stack exchange,提问作者Luke Cabin
相关产品推荐
相关产品推荐

