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

树莓派密码猜测游戏代码问题:循环持续打印错误及语句异常

树莓派密码猜测游戏代码修复方案

问题根源分析

你的代码存在以下关键错误,导致程序持续打印错误提示、逻辑混乱:

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()

关键修复说明

  1. 键盘读取逻辑重构:

    • 提前初始化所有键盘引脚,行引脚设为PULL_UP输入,避免误触
    • 单次读取单个按键,等待按键释放后返回,避免重复读取
    • 仅返回有效按键字符,无按键时返回空
  2. PWM配置修正:

    • 修正duty_u16的参数错误,用密码数值乘以比例系数生成合法的占空比值
  3. 主循环逻辑优化:

    • 改为逐步收集3位数字输入,符合密码输入的正常逻辑
    • 仅在输入完成后验证密码,避免频繁触发错误提示
    • 添加调试用的密码打印,方便测试(正式环境可删除)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:25:19