В вашем коде есть переменная time_count
Она установлена как 5 в начале кода
...
hs = int(doc.read())
time_count = 5 # <-----------
colorlist = ["Red", "Yellow", "Blue", "Green", "Orange", "Purple"]
...
Когда у вас заканчивается время, time_count
имеет значение 0. Когда вы снова вызываете функцию start_game
, он видит, что time_count
равен 0, и поэтому игра должна быть закончена. Чтобы это исправить, вам нужно будет сбросить time_count
после каждого окончания игры. Как-то так у меня получилось:
def finish_game():
global time_sleep
time_sleep = 5
timer.grid_forget()
start_btn.grid(row=4, column=0, columnspan=3)
btn1.config(state=DISABLED)
btn2.config(state=DISABLED)
btn3.config(state=DISABLED)
btn4.config(state=DISABLED)
btn5.config(state=DISABLED)
btn6.config(state=DISABLED)
Редактировать:
Мне удалось исправить функцию countdown
, выполняющуюся самостоятельно в фоновом режиме, добавив переменную gameover
. Когда игра заканчивается, она устанавливается на 1
, а когда игра начинается, она снова устанавливается на 0
. Функция обратного отсчета проверяет gameover
и выполняется только тогда, когда она установлена на 0
. Я также сделал так, чтобы метка result
появлялась только по окончании игры.
Полный код:
from tkinter import *
from random import *
doc = open("Highscore.txt", "r")
us = 0
hs = int(doc.read())
time_count = 5
colorlist = ["Red", "Yellow", "Blue", "Green", "Orange", "Purple"]
def add_uscore():
global us
us+= 1
score.config(text=(f"Score: {us}"))
def add_highscore():
global us
global hs
if us>hs:
hs = us
highscore.config(text=(f"Highscore: {hs}"))
doc2 = open("Highscore.txt","w")
doc2.write(str(hs))
doc2.close()
def start_game():
global gameover
global colorlist
global textcolor
gameover = 0
rancolor = choice(colorlist)
textcolor = choice(colorlist)
start_btn.grid_forget()
result.grid_forget()
color.config(text=rancolor, fg=textcolor)
btn1.config(state=ACTIVE, bg="Indian Red")
btn2.config(state=ACTIVE, bg="Gold")
btn3.config(state=ACTIVE, bg="DodgerBlue3")
btn4.config(state=ACTIVE, bg="Sea Green")
btn5.config(state=ACTIVE, bg="Dark Orange")
btn6.config(state=ACTIVE, bg="Purple3")
timer.grid(row=4, column=0, columnspan=3)
def countdown():
global time_count
if time_count > 0 and gameover != 1:
time_count -= 1
timer.config(text=(f"Countdown: {time_count}"))
timer.after(1000, countdown)
elif time_count==0:
result.config(text="Time Over", fg="Indian Red")
finish_game()
def finish_game():
global time_count
time_count = 5
timer.grid_forget()
result.grid(row=3, column=0, columnspan=3)
start_btn.grid(row=4, column=0, columnspan=3)
btn1.config(state=DISABLED)
btn2.config(state=DISABLED)
btn3.config(state=DISABLED)
btn4.config(state=DISABLED)
btn5.config(state=DISABLED)
btn6.config(state=DISABLED)
def new_game():
global us
us = 0
score.config(text=(f"Score: {us}"))
finish_game()
def reset_game():
global hs
hs = 0
doc2 = open("Highscore.txt","w")
doc2.write(str(hs))
doc2.close()
new_game()
def check(ucolor):
global textcolor
global time_count
global gameover
if textcolor==ucolor:
result.config(text="Good", fg="Sea Green")
add_uscore()
add_highscore()
start_game()
time_count = 5
else:
result.config(text="You Lose", fg="Indian Red")
gameover = 1
finish_game()
win = Tk()
win.title("Color Game")
#MENU
menu1 = Menu(win)
win.config(menu=menu1)
options = Menu(menu1)
menu1.add_cascade(label="Option", menu=options)
options.add_command(label="New Game", command=new_game)
options.add_command(label="Reset Game", command=reset_game)
options.add_command(label="Exit Game", command=quit)
#DISPLAY
color = Label(win, text="", font=("Comic Sans", 50), anchor=W)
color.grid(row=0, column=0, columnspan=4)
#BUTTON
btn1 = Button(win, text="Red", height=10, width=10, state=DISABLED, command=lambda:check("Red"))
btn1.grid(row=1, column=0)
btn2 = Button(win, text="Yellow", height=10, width=10,state=DISABLED, command=lambda:check("Yellow"))
btn2.grid(row=1, column=1)
btn3 = Button(win, text="Blue", height=10, width=10, state=DISABLED, command=lambda:check("Blue"))
btn3.grid(row=1, column=2)
btn4 = Button(win, text="Green", height=10, width=10, state=DISABLED, command=lambda:check("Green"))
btn4.grid(row=2, column=0)
btn5 = Button(win, text="Orange", height=10, width=10, state=DISABLED, command=lambda:check("Orange"))
btn5.grid(row=2, column=1)
btn6 = Button(win, text="Purple", height=10, width=10, state=DISABLED, command=lambda:check("Purple"))
btn6.grid(row=2, column=2)
#RESULT
result = Label(win, text="", font=("Ariel", 25))
#COUNTDOWN
timer = Label(win, text="", fg="Dark Orange", font=("Ariel", 15))
#START BUTTON
start_btn = Button(win, text="START GAME", bg="Green", command= lambda: [start_game(), countdown()])
start_btn.grid(row=4, column=0, columnspan=3)
#SCORE
score = Label(win, text=(f"Score: {us}"), fg="Sea Green", font=("Ariel", 10))
score.grid(row=5, column=0, columnspan=3)
#HIGHSCORE
highscore = Label(win, text=(f"Highscore: {hs}"), font=("Ariel", 10), fg="firebrick4")
highscore.grid(row=6, column=0, columnspan=3)
win.mainloop()
Обратите внимание, как метка result
размещается только в менеджере сетки, когда игра заканчивается, и она удаляется, как только игра начинается снова:
Размещение метки result
на .grid
, когда игра заканчивается
def finish_game():
...
result.grid(row=3, column=0, columnspan=3)
...
Удаление метки result
с помощью .grid_forget
когда начинается игра
def start_game():
...
result.grid_forget()
...