2017-08-03 2 views
-2

Je fais un jeu avec tkinter où le joueur doit éviter les pluies acides. J'ai presque terminé, j'ai juste besoin d'un moyen de redémarrer tout le jeu après avoir appuyé sur la touche Haut. J'ai déjà fait une fonction qui s'appelle après que la pluie a frappé le joueur. Cette fonction vérifie avec un événement si la touche haut est enfoncée et déclenche la fonction de redémarrage dans laquelle le code pour redémarrer le jeu vient. Tout à l'intérieur de la classe Game. Voici le code:Comment redémarrer un jeu? (Tkinter)

import random 
import time 
from winsound import * 
from tkinter import * 

class Game(): 
    def __init__(self): 
     self.high_file = open('HIGHSCORE.txt','r') 
     self.high = self.high_file.read() 
     self.tk = Tk() 
     self.tk.title('DeadlyRain') 
     self.tk.resizable(0,1) 
     self.tk.wm_attributes('-topmost',1) 
     self.canvas = 
     Canvas(self.tk,width=400,height=500,highlightthickness=0) 
     self.canvas.pack() 
     self.tk.update() 
     self.bg = PhotoImage(file="bg.gif") 
     self.canvas.create_image(0,0,image=self.bg,anchor='nw') 
     self.score_txt = self.canvas.create_text(320,12,text='Score: 0', \ 
         fill='white',font=('Fixedsys',17)) 
     self.high_txt = self.canvas.create_text(310,30, \ 
         text='HighScore: %s' % self.high,\ 
         fill='white',font=('Fixedsys',16)) 
     self.player_img = PhotoImage(file='player\\player0.gif') 
     self.player = self.canvas.create_image(150,396, \ 
               image=self.player_img, 
               anchor='nw') 
     self.rain_img = [PhotoImage(file='rain\\rain1.gif'), 
         PhotoImage(file='rain\\rain2.gif'), 
         PhotoImage(file='rain\\rain3.gif')] 
     self.images_left = [ 
      PhotoImage(file="player\\playerL1.gif"), 
      PhotoImage(file="player\\playerL2.gif"), 
      PhotoImage(file="player\\playerL3.gif")] 
     self.images_right = [ 
      PhotoImage(file="player\\playerR1.gif"), 
      PhotoImage(file="player\\playerR2.gif"), 
      PhotoImage(file="player\\playerR3.gif")] 
     self.current_image = 0 
     self.current_image_add = 1 
     self.last_time = time.time() 
     self.new_high = False   
     self.player_x = 0 
     self.rain_drops = [] 
     self.rain_count = 0 
     self.points = 0 
     self.speed = 2 
     self.list = list(range(0,9999)) 
     self.needed_rain_count = 100 
     self.running = True 
     self.canvas.bind_all('<KeyPress-Left>',self.left) 
     self.canvas.bind_all('<KeyPress-Right>',self.right) 
    def animate(self): 
     if self.player_x != 0 : 
      if time.time() - self.last_time > 0.1: 
       self.last_time = time.time() 
       self.current_image += self.current_image_add 
       if self.current_image >= 2: 
        self.current_image_add = -1 
       if self.current_image <= 0: 
        self.current_image_add = 1 
     if self.player_x < 0: 
      self.canvas.itemconfig(self.player, 
image=self.images_left[self.current_image]) 
     elif self.player_x > 0: 
      self.canvas.itemconfig(self.player, 
image=self.images_right[self.current_image]) 
    def score(self): 
     self.points += 1 
     if self.points > int(self.high): 
      self.canvas.itemconfig(self.high_txt, \ 
            text='HighScore: %s' % self.points) 
      self.new_high = True 
     self.canvas.itemconfig(self.score_txt, \ 
           text='Score: %s' % self.points) 
     if self.points >= 20 and self.points <= 34: 
      self.needed_rain_count = 80 
     elif self.points >= 35 and self.points <= 49: 
      self.needed_rain_count = 60 
     elif self.points >= 50 and self.points <= 64: 
      self.needed_rain_count = 40 
     elif self.points >= 65 and self.points <= 79: 
      self.needed_rain_count = 20 
    def gameover(self): 
     self.running = False 
     self.canvas.create_text(200,250,text='GAMEOVER') 
     if self.new_high == True: 
      new_high = open('HIGHSCORE.txt','w') 
      new_high.write(str(self.points)) 
      new_high.close() 
      self.high_file.close() 
      self.canvas.bind_all('<KeyPress-Up>',self.restart) #restart func 
                    is called 
     self.high_file.close() 
    def restart(self,evt): 
     #insert code for restarting game here 
    def left(self,evt): 
     self.player_x = -2 
    def right(self,evt): 
     self.player_x = 2 
    def move(self): 
     self.animate() 
     self.canvas.move(self.player,self.player_x,0) 
     pos = self.canvas.coords(self.player) 
     if pos[0] <= -8: 
      self.player_x = 0 
     elif pos[0] >= self.canvas.winfo_width() - 40: 
      self.player_x = 0 

    def rain(self):   
     if self.rain_count == self.needed_rain_count: 
      for x in self.list: 
       x =self.canvas.create_image(random.randint(0,501), \ 
        0,image=random.choice(self.rain_img)) 
        self.rain_drops.append(x)   
        self.rain_count = 0 
        self.list.remove(x) 
        break 

    def rain_fall(self,id): 
     co = self.canvas.coords(id) 
     if co[1] > 500: 
      self.rain_drops.remove(id) 
      self.canvas.delete(id) 
      self.score() 
     self.canvas.move(id,0,self.speed) 

    def rain_hit(self,id): 
     rpos = self.canvas.coords(id) 
     ppos = self.canvas.coords(self.player) 
     if rpos[1] >= ppos[1] and rpos[1] <= ppos[1]+68: 
      if rpos[0] >= ppos[0] and rpos[0] <= ppos[0]+48: 
       self.gameover() 

    def mainloop(self): 
     PlaySound("sound\\rain.wav", SND_ASYNC) 
     while 1: 
      if self.running == True: 
       self.rain_count += 1 
       self.move() 
       self.rain() 
       for rain in self.rain_drops: 
        self.rain_hit(rain) 
        self.rain_fall(rain) 
       self.tk.update_idletasks() 
       self.tk.update()    
       time.sleep(0.01) 

g = Game() 
g.mainloop() 

Merci à l'avance!

Répondre

0

Vous pouvez simplement supprimer le while 1 de la méthode mainloop et utiliser un booléen pour continuer à boucler. Vous pouvez changer ce booléen à faux quand la touche HAUT est enfoncée et quand le joueur est frappé par la pluie.

Ensuite, vous pouvez juste faire:

while 1 : 
    g = Game() 
    g.mainloop() 

et votre jeu en boucle pour toujours.

+0

Il crée juste une nouvelle fenêtre vide et me renvoie cette erreur: – Fichtenholzz

+0

Traceback (appel le plus récent en dernier): Fichier "C: \ Utilisateurs \ HP Pavilion G6 \ Bureau \ python \ DeadlyRain \ DeadlyRain.py", ligne 147, dans g = Game() Fichier "C: \ Users \ HP Pavilion G6 \ Desktop \ python \ DeadlyRain \ DeadlyRain.py", ligne 20, dans __init__ self.canvas.create_image (0,0, image = self.bg, anchor = 'nw') Fichier "C: \ Python34 \ lib \ tkinter \ __ init__.py", ligne 2332, dans create_image return self._create ('image', args, kw) Fichier " C: \ Python34 \ lib \ tkinter \ __ init__.py ", ligne 2323, dans _create * (args + self._options (cnf, kw)))) _tkinter.TclError: l'image "pyimage13" n'existe pas – Fichtenholzz