我如何创建一个刽子手计时器,使其扣除用户';在python中,s每10秒得分一次?

我如何创建一个刽子手计时器,使其扣除用户';在python中,s每10秒得分一次?,python,python-3.x,Python,Python 3.x,我正在尝试创建一个计时器,以便每10秒从用户分数中扣除一个值1。但一旦我运行程序并等待30秒后触发我编写的代码,下面的错误就发生了。有更好的方法吗 def countdown(): score=0 stop_thread=True count=0 while stop_thread and count<40: count=count+1 time.sleep(0.5) if stop_thread:

我正在尝试创建一个计时器,以便每10秒从用户分数中扣除一个值1。但一旦我运行程序并等待30秒后触发我编写的代码,下面的错误就发生了。有更好的方法吗

def countdown():

    score=0
    stop_thread=True
    count=0
    while stop_thread and count<40:
        count=count+1
        time.sleep(0.5)
    if stop_thread:
        print("You took too long to guess. Your score is deducted by 1.")
        score=score-1
        if count==20:
            print("You took too long to guess again. Your score is deducted by 1 again.")
            score=score-1
    else:
        score=score
def倒计时():
分数=0
停止线程=真
计数=0

停止线程并计数时,您应该在整个逻辑之前初始化
分数
,使用您希望学生在不花费太多时间的情况下拥有的最大值:

score=0  # starts from 0
count=0
while stop_thread and count<40:
    count=count+1
    time.sleep(0.5)
if stop_thread:
    print("You took too long to guess. Your score is deducted by 1.")
    score=score-1
    if count==20:
        print("You took too long to guess again. Your score is deducted by 1 again.")
        score=score-1
else:
    score=score
score=0#从0开始
计数=0

正如@Arnaud所说,停止线程并计数,在尝试引用变量之前,需要初始化score变量

<>但是更大的问题是你应该考虑使用异步I/O(和定时器)设计而不是线程。围绕主事件循环设计您的程序;在执行非阻塞操作或仅在短时间间隔内阻塞输入的操作时,检查输入、更新显示和检查其他异步事件(计时器过期)(与标准库或更高级别系统中较新或较旧的较低级别模块中提供的模块类似

当然,你可以用线程来实现这一点。但即使这样,你也应该有一个主线程通过对象来协调它的活动。有一个优先级队列,你可以在其中安排计时器事件,还有一个线程在该队列上充当阻塞消费者;它弹出计时器事件并为主循环生成其他事件。然后是一个或多个输入工作线程可以阻塞输入通道并将输入事件馈送到主循环的事件队列中。现在主循环只更新屏幕并使用事件(告诉它要执行哪些更新)

主循环实现了游戏的状态机。显示介绍,玩主游戏,处理这些计时器事件,检测赢/输条件,并显示分数和选项,以便在适当的情况下循环到下一轮游戏


在尝试创建线程时,有一个可靠的设计是很重要的。连贯的队列作为多任务和多线程的设计原语非常有用。

分数的初始值是多少?@Johnny抱歉,我没有显示。它是0。停止线程?@Johnny我的停止线程只是停止线程=true,但它不会继续扣除我的分数包括分数=0..threads对于像我这样不久前才开始使用python的人来说听起来很复杂。目前我在我的hangman程序中使用jupyter,所以我认为threads仍然适用于jupyter?如果是这样的话,我应该添加什么类型的合适队列对象?对不起,我错读了问题。我以为你已经开始了尝试使用一些线程逻辑(代码段中未显示)来实现这一点。因此,是的。在尝试“引用”变量之前,只需初始化变量……也就是说,在尝试根据变量的先前值(如score=score-1)执行任何操作之前,或者更习惯地说:score-=1(增广赋值).但我面临的问题是,在初始化变量score=0后,它不会在10秒后继续扣除,如我尝试的if count==20:forwards中所示…因此您在函数定义中初始化这些变量。但这意味着您在每次调用函数时都会重新初始化它们。它们不会保留在这个函数可能应该是一个类,或者您应该传递并返回一个可变对象(字典),以保持一个调用(调用)和下一个调用之间的状态。