一个问答游戏的线程计时器



我在大学里必须用Python做一些练习。所以我需要做一个问答游戏。要求是:

  • 正确答案加1分
  • 回答错误得-1分

玩家必须在20秒内回答每个问题。如果回答时间超过20秒,即使答对也得-1分。

我刚刚尝试了threadingTimer。我的代码是这样的:

from time import *
import threading as th
score = 0
correct_answer = 1
def sctn():  
global score
score -=1
print(score)
S = th.Timer(20.0, sctn)  
S.start()  
answer = int(input("enter : "))
if answer == correct_answer :
score += 1
else:
score -= 1
print(score)
S.cancel()

我为正确答案树立了榜样。但是当我运行代码时,如果我输入正确答案超过20秒,那么分数= -1 + 1 = 0,或者如果我输入错误答案超过20秒,分数= -1 -1 = -2。

代码太多了。有两种情况:如果用户在20秒或更短时间内输入正确答案,他就得一分;否则他会失去一个。

计时器函数不需要做任何事情。在测试正确答案时,还可以测试计时器是否已过期。定时器是线程的子类,因此它有一个函数is_alive,如果它还在运行,返回True。

原始程序的问题是,一旦计时器过期,答案就不再重要了。但无论如何你都会检查它,所以计时器函数的-1点被添加到答案检查逻辑的正负1点。

from time import *
import threading as th
score = 0
correct_answer = 1
def sctn():
pass
S = th.Timer(20.0, sctn)  
S.start()  
answer = int(input("enter : "))
if answer == correct_answer and S.is_alive():
score += 1
else:
score -= 1
S.cancel()
print(score)

您可以使用tkinter的after方法在显示问题时启动计时器,如果用户没有及时回答,则扣除分数。如果用户及时响应,可以调用after_cancel并返回after的值来取消作业。

例如,当你想启动计时器时,你可以这样做:

def start_timer():
global after_id
root.after(20000, times_up)

假设您有一个名为root的全局变量,该变量指向根窗口。不过,您可以为此使用任何小部件。它所做的是指示tkinter在20秒(20,000毫秒)内调用函数times_up

在该函数中,您可以将分数减1,例如:

def times_up():
global score
score += 1

然后,在处理用户选择答案的代码中,您可以停止计时器并防止分数下降:

def user_picked_an_answer():
global after_id
root.after_cancel(after_id)

如果在用户选择答案时调用此函数,它将计算新的分数并防止计时器被触发。

最新更新