2

我为游戏编写了这个 python 程序:

print("CC ACTIVATED")
import lcddriver
import time
import subprocess
display = lcddriver.lcd()
try:
    display.lcd_display_string("CC... ", 1) 
    time.sleep(2)
    display.lcd_display_string("ONLINE", 2)
    time.sleep(2)
    display.lcd_clear()
except Exception:
    print("SCREEN ERROR")
try:
    display.lcd_display_string("SETUP A", 1) 
    display.lcd_display_string("PASSWORD? Y/N", 2)
except Exception:
    print("SCREEN ERROR")
activate = input("")
if activate == 'y':
    print("ACTIVATED")
    try:
        display.lcd_clear()
        display.lcd_display_string("", 1) 
        time.sleep(2)
        display.lcd_display_string("LOADING", 2)
        time.sleep(2)
        display.lcd_clear()
    except Exception:
        print("SCREEN ERROR")

else:
    print("ABORT")
    try:
        display.lcd_clear()
        display.lcd_display_string("", 1) 
        time.sleep(2)
        display.lcd_display_string("ABORT", 2)
        time.sleep(2)
        display.lcd_clear()
        subprocess.call(["sudo","halt"])
    except Exception:
        print("SCREEN ERROR")
        subprocess.call(["sudo","halt"])
k = True
while k:
    
    try:
        display.lcd_clear()
        display.lcd_display_string("ENTER PASWORD", 1) 
        display.lcd_display_string("----------------", 2)
    except Exception:
        print("SCREEN ERROR")
    pasword = input("")
    display.lcd_clear()
    try:
        display.lcd_clear()
        display.lcd_display_string("YOU TYPED:", 1) 
        display.lcd_display_string(pasword, 2)
        time.sleep(2)
        display.lcd_display_string("CONFIRM? Y/N", 1) 
    except Exception:
        print("SCREEN ERROR")
    ok = input("")
    if ok == 'y':
        k = False
    else:
        display.lcd_clear()
try:
    display.lcd_clear()
    display.lcd_display_string("PASSWORD", 1) 
    display.lcd_display_string("SET", 2)
except Exception:
    print("SCREEN ERROR")
time.sleep(2)
run = True
try:
    display.lcd_clear()
    display.lcd_display_string("STARTING ", 1) 
    display.lcd_display_string("GAME...", 2)
except Exception:
    print("SCREEN ERROR")
time.sleep(2)
while run:
    try:
        display.lcd_clear()
        display.lcd_display_string("ENTER PASSWORD ", 1) 
        display.lcd_display_string("TO DEACTIVATE", 2)
    except Exception:
        print("SCREEN ERROR")
    pasword1 = input("")
    if pasword1 == pasword:
        try:
            display.lcd_clear()
            display.lcd_display_string("PASSWORD....", 1)
            time.sleep(2)
            display.lcd_display_string("ACCEPTED", 2)
            time.sleep(2)
            display.lcd_clear()
            display.lcd_display_string("DEACTIVATED", 2)
            subprocess.call(["sudo","halt"])
            time.sleep(10)
        except Exception:
            print("SCREEN ERROR")
            subprocess.call(["sudo","halt"])
    else:
        try:
            display.lcd_clear()
            display.lcd_display_string("PASSWORD....", 1)
            time.sleep(2)
            display.lcd_display_string("UNACCEPTED", 2)
            time.sleep(2)
        except Exception:
            print("SCREEN ERROR")

它在树莓派上运行并且工作得非常好,但是我想做的一件事有点超出我的技能水平。我需要这个程序给你三次尝试猜测密码,然后在第四次尝试时播放录音。之后它需要用五分钟的录音来响应失败的尝试,然后回到沉默的三个机会。我知道如何让它进行录音,但我需要五分钟部分的帮助。这里有人知道怎么做吗?谢谢。

4

1 回答 1

1

要允许 3 次密码尝试,您将需要一个计数器变量,每次失败尝试最多计数 3 次。

而不是只运行 while k == True,您希望同时检查k == Trueattempts <= 3。就等待五分钟而言,您将希望创建用户上次猜测时间的时间戳。

from datetime import datetime

...
k = True
password_attempts = 0

while k and password_attempts < 4:
    try:
        display.lcd_clear()
        display.lcd_display_string("ENTER PASWORD", 1)
        display.lcd_display_string("----------------", 2)
    except Exception:
        print("SCREEN ERROR")
    pasword = input("")
    display.lcd_clear()
    try:
        display.lcd_clear()
        display.lcd_display_string("YOU TYPED:", 1)
        display.lcd_display_string(pasword, 2)
        time.sleep(2)
        display.lcd_display_string("CONFIRM? Y/N", 1)
    except Exception:
        print("SCREEN ERROR")
    ok = input("")
    if ok == "y":
        k = False
    else:
        display.lcd_clear()
        password_attempts += 1
        if password_attempts == 4:
            #Create a timestamp of last attempt
            last_request = datetime.now()
            current_request = datetime.now()
            while((last_request - current_request).total_seconds() < 5 * 60):
                #Code to play music
                current_request = datetime.now()

然后由您将播放器重新路由到程序中他们再次尝试输入密码的位置。

但是,您在此项目开始时所做的设计选择将真正开始妨碍您想要做的事情。

我建议你考虑重新设计你的程序,以使工作更轻松、更愉快。

编程中最好的部分之一是代码重用;这用函数最容易理解。在 Python 中,您使用以下语法创建一个函数def function_name():

然后,当您想在该函数中运行代码时,只需按名称调用它:function_name()

这对您的应用意味着什么?

您可以在一个方法中包装对 LCD 的写入,这样您就可以避免重复输入相同的try:... except:块(顺便说一下......当您编写时except Exception,您正在捕获程序可能抛出的所有异常。这被认为是不好的做法,因为你可能不想做同样的事情,不管异常是什么。相反,尝试找到一个你试图捕获的特定异常,并通过名称来捕获那个异常)。

改写 LCD 打印的示例:

def print_to_lcd(statements_to_print: [str]):
    line_number = 1
    try:
        for statement in statements_to_print:
            display.lcd_display_string(statement, line_number)
            line_number += 1
    except Exception:
        print("SCREEN ERROR")

然后,您只需为 LCD 生成要打印的内容列表,并使用它们调用 LCD 函数:

things_to_write = ["PASSWORD...", "UNACCEPTED"]
print_to_lcd(things_to_write)

关于如何检查密码值、何时播放音乐等也可以这样说。

每当您发现自己反复重写相同的信息时,请花点时间思考是否有一种方法可以将其编写一次,然后重新使用它。它会让你的程序更容易编写,也更容易使用。

特别是在这种情况下,因为你想在等待一段时间后重新做同样的事情。想象一下,当用户第四次输入错误密码时,您不必编写大量的 if 语句,您只需编写如下内容:

play_music_for_five_minutes()
prompt_for_password()

让我知道是否还有其他问题我可以回答!

于 2020-09-25T19:45:18.007 回答