Как сделать перезапуск скрипта по нажатию клавиши?

Рейтинг: 0Ответов: 1Опубликовано: 07.02.2023

Скажите пожалуйста, как сделать, чтобы при проигрыше при нажатии на пробел игра перезапускалась?

from tkinter import *
import random
import time


class Egg:
    def __init__(self, canvas, basket):
        self.canvas = canvas
        self.basket = basket
        self.oval = canvas.create_oval(0, 0, 20, 25, fill='ivory')
        self.canvas.move(self.oval, random.randint(0, 500), 0)
        self.touch_bottom = False
        self.score = 0
        self.score_text = canvas.create_text(190, 30, anchor=W, fill='royalblue', font=('Arial',24), text="")


    def touch_basket(self, egg_pos):
        basket_pos = self.canvas.coords(self.basket.rect)
        if egg_pos[2] >= basket_pos[0] and egg_pos[0] <= basket_pos[2]:
            if egg_pos[3] >= basket_pos[1] and egg_pos[1] <= basket_pos[3]:
                return True
            return False
        


    def fall(self):
        self.canvas.move(self.oval, 0, 1)
        pos = self.canvas.coords(self.oval)
        if pos[3] >= 400:
            self.touch_bottom = True
            canvas.create_text(150, 100, anchor=W, fill='tomato', font=('Arial',24), text="Game Ower!" )
        if self.touch_basket(pos) == True:
            self.canvas.coords(self.oval, 0, 0, 20, 25)
            self.canvas.move(self.oval, random.randint(0, 500), 0)
            self.score = self.score + 1
            self.canvas.itemconfig(self.score_text, text="Яиц собрано: " + str(self.score))

class Basket:
    def __init__(self, canvas):
        self.canvas = canvas
        self.rect = canvas.create_rectangle(0, 0, 100, 30, outline="")
        self.image = canvas.create_image(0, 0, anchor=NW, image=basket_image)
        self.canvas.move(self.rect, 200, 350)
        self.canvas.move(self.image, 170, 290)
        self.x = 0
        self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
        self.canvas.bind_all('<KeyPress-Right>', self.turn_right)

    def turn_left(self, event):
        self.x = -3

    def turn_right(self, event):
        self.x = 3

    def move_basket(self):
            self.canvas.move(self.rect, self.x, 0)
            self.canvas.move(self.image, self.x, 0)
            pos = self.canvas.coords(self.rect)
            if pos[0] <= 0:
                self.x = 0

            if pos[2] >= 500:
                self.x = 0


    




#------------------------------------------------MAIN-----------------------------


                
window = Tk()
window.title("Поймай яйцо!")
window.resizable(0, 0)
window.wm_attributes("-topmost", 1)
canvas = Canvas(window, width=500, height=400, highlightthickness=0)
canvas.pack()
bg = PhotoImage(file="C:/Users/admin/Desktop/bg.png")
canvas.create_image(0, 0, anchor=NW, image=bg)
basket_image = PhotoImage(file="C:/Users/admin/Desktop/basket.png")

basket = Basket(canvas)

egg = Egg(canvas, basket)

while True:
    if egg.touch_bottom == False:
        egg.fall()
        basket.move_basket()
    else:
        break
    egg.fall()
    window.update()
    time.sleep(0.01)  

Ответы

▲ 0

За завершение игры ответственен разрыв цикла break, заменив его на переинициализацию классов мы получим новую игру чтото вроде

    else:
        #break
        #restart here
        canvas.delete("all")
        basket = Basket(canvas)
        egg = Egg(canvas, basket)

то есть начнётся новая игра, но с некоторыми недоработками,- нет фона, так как его создание вынесено в мэйн программы, а должно быть в __init__; нет сообщения о конце игры так как не реализована пауза (можно вставить time.sleep но лучше реализовать методику "press any key"). Далее time.sleep в основном цикле нужно ставить в самом начале, на случай если встретится continue