#python #pygame #maze
Вопрос:
Я пытаюсь создать лабиринт в pygame, но у меня проблема, когда я открываю свой первый лабиринт, все в порядке, но когда я закрываю его и открываю другой, мой лабиринт, 2 лабиринта находятся друг на друге. Я попытался перезапустить свою страницу tkinter и сыграть в pygame.уволился, но ничего не помогло.
Вот мой код:
import os import random import pygame from random import randint from tkinter import* from PIL import ImageTk, Image class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.image.load('vaisseau.png') self.rect = self.image.get_rect() #creation du rectangle Player #Rect(left, top, width, height) #left: le point ou le rectangle commence pareil pour le top self.rect.x=23 self.rect.y=27 def move(self, dx, dy): # Bouge chaque axes separement if dx != 0: self.move_single_axis(dx, 0) if dy != 0: self.move_single_axis(0, dy) def move_single_axis(self, dx, dy): # Move the rect self.rect.x = dx self.rect.y = dy # If you collide with a wall, move out based on velocity for wall in walls: if self.rect.colliderect(wall.rect):#test si deux rectangles se chevauchent if dx gt; 0: # Moving right; Hit the left side of the wall self.rect.right = wall.rect.left if dx lt; 0: # Moving left; Hit the right side of the wall self.rect.left = wall.rect.right if dy gt; 0: # Moving down; Hit the top side of the wall self.rect.bottom = wall.rect.top if dy lt; 0: # Moving up; Hit the bottom side of the wall self.rect.top = wall.rect.bottom class Wall(): def __init__(self, pos): walls.append(self) self.rect = pygame.Rect(pos[0], pos[1], 25, 25) class labyrinthe_aleatoire(): def __init__(self): self.niveau = randint(1,3) def implementation(self): x=1 y=1 if self.niveau==1: for row in level1:#pour chaque ligne dans le niveau for col in row:#pour chaque colonne dans la ligne if col == "W": # si une colonne est la lettre W Wall((x,y)) #alors on cree un mur au coordonne x et y x = 25 #on ajoute 25 a l'abcisse y = 25 #on ajoute 25 a l'ordonne x = 1 #on revient au point 0 des abcisses elif self.niveau==2: for row in level2:#pour chaque ligne dans le niveau for col in row:#pour chaque colonne dans la ligne if col == "W": # si une colonne est la lettre W Wall((x,y)) #alors on cree un mur au coordonne x et y x = 25 #on ajoute 25 a l'abcisse y = 25 #on ajoute 25 a l'ordonne x = 1 #on revient au point 0 des abcisses elif self.niveau==3: for row in level3:#pour chaque ligne dans le niveau for col in row:#pour chaque colonne dans la ligne if col == "W": # si une colonne est la lettre W Wall((x,y)) #alors on cree un mur au coordonne x et y x = 25 #on ajoute 25 a l'abcisse y = 25 #on ajoute 25 a l'ordonne x = 1 #on revient au point 0 des abcisses def f1(): global fenetre1 fenetre1=Tk() fenetre1.geometry("750x600") fenetre1.title("Snake") #titre de la fenêtre Titre1 = Label(fenetre1, text="MAZE",font=('Fixedsys',55),foreground='white') Titre1.pack(side= TOP) texte3 = Label(fenetre1, text="by Alexandre,Aaron,Maxime,Roméo",font=('Fixedsys',13),foreground = 'red',) texte3.pack(expand = YES ) lan = Button(fenetre1, text ='Niveau Aléatoire',font=("Fixedsys",20),width=17,height=1,command = maze) lan.pack(expand = YES ) photo = PhotoImage(file = "level1.png") level1bt= Button(fenetre1, text ='Level 1 ',font=("Fixedsys",20),width=700,height=86,command = niveau1,image = photo) level1bt.pack(expand = YES) photo2 = PhotoImage(file = "levelmario.png") level2bt= Button(fenetre1, text ='Level 2 ',font=("Fixedsys",12),width=700,height=86 ,command = niveau2,image = photo2) level2bt.pack(expand = YES) photo3 = PhotoImage(file = "levelamongus.png") level3bt= Button(fenetre1, text ='Level 3 ',font=("Fixedsys",12),width=700,height=87,command = niveau3,image= photo3) level3bt.pack(expand = YES) photo4 = PhotoImage(file = "leveltetris.png") level4bt= Button(fenetre1, text ='Level 4 ',font=("Fixedsys",12),width=700,height=87,command = maze,image= photo4) level4bt.place(x = 520 , y = 220) level4bt.pack(expand = YES) fenetre1.mainloop() def MainLevel(x,y,dimension,bg): running = True end_rect = pygame.Rect(x,y , 25, 25) screen = pygame.display.set_mode(dimension) back = pygame.image.load(bg) while running: clock.tick(60) for e in pygame.event.get(): if e.type == pygame.QUIT: running = False if e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE: running = False # Move the player if an arrow key is pressed key = pygame.key.get_pressed() if key[pygame.K_LEFT]:#si la fleche gauche est presse le joueur se deplace de -2 sur les abcisses player.move(-3, 0) if key[pygame.K_RIGHT]:#si la fleche droite est presse le joueur se deplace de 2 sur les abcisses player.move(3, 0) if key[pygame.K_UP]:#si la fleche du haut est presse le joueur se deplace de -2 sur les ordonne(vers le haut) player.move(0, -3) if key[pygame.K_DOWN]:#si la fleche du bas est presse le joueur se deplace de 2 sur les ordonne(vers le bas) player.move(0, 3) # Just added this to make it slightly fun ;) if player.rect.colliderect(end_rect):#test si deux rectangles se chevauchent restart() # Draw the scene screen.fill((0,0,0)) for wall in walls: pygame.draw.rect(screen, (255, 255, 255), wall.rect) pygame.draw.rect(screen, (255, 0, 0), end_rect) screen.blit(player.image,player.rect) pygame.display.flip() screen.fill((0,0,0)) restart() def restart(): fenetre1.destroy() pygame.quit() f1() def niveau1(): labyrinthe.niveau = 1 labyrinthe.implementation() MainLevel(720,470,(850, 600),"back.png") def niveau2(): labyrinthe.niveau = 2 labyrinthe.implementation() MainLevel(1550,575,(1600, 760),"mario_level.png") def niveau3(): labyrinthe.niveau =3 labyrinthe.implementation() MainLevel(1550,575,(1760, 800),"mario_level.png") def maze(): running = True labyrinthe.implementation() x=y=w=h=0 screen = 0 bg =0 if labyrinthe.niveau == 1: x=720 y=470 w=850 h=600 bg="back.png" screen = pygame.display.set_mode((w,h )) elif labyrinthe.niveau == 2: x=1550 y=575 w=1600 h=760 bg="mario_level.png" screen = pygame.display.set_mode((w,h)) MainLevel(x,y,(w,h),bg) pygame.init()# pygame.display.set_caption("Va au carre rouge!") clock = pygame.time.Clock() walls = [] player = Player() labyrinthe = labyrinthe_aleatoire() # Holds the level layout in a list of strings. level1= [ "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", " W W", "W WWWW WWWW WWWWWWWWWWWWW W", "W W W W W W W", "W W WWWW WWWWWWW WWWW W W", "W W W W W W", "W W W W W WWWW WWWWWWW W", "W W W W W W W", "W WWWW W W WWWWWWWWWW WWWW", "W W W W W", "W WWWWWWWWWWWWWWWW W WWWWWWW", "W W W", "WWWW WWWW W W W WWWWWWW W", "W W W W W W W", "WWWW WWWW W WWWWWWWWWWWWW W", "W W W W W", "W WWWWWWWWWW WWWWWWWWWW WWWW", "W W W W W W W W", "W WWWW W W WWWW W WWWW W" , "W W W W" , "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW" ] level2 = [ "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "W W W W W W W W W", "WWWW W WWWW WWWW WWWWWWWWWW W WWWWWWW WWWW WWWW W W W", "W W W W W W W W W W W W W", "WWWW W W W W W W WWWW W WWWW WWWWWWW W WWWWWWW WWWW", "W W W W W W W W", "W WWWW WWWWWWW W WWWW WWWW W WWWWWWW W WWWWWWWWWWWWW W", "W W W W W W W W W W W W", "W WWWWWWW WWWW WWWWWWW W WWWWWWW WWWWWWWWWWWWWWWW WWWW W", "W W W W W W W W W W W W W", "W W WWWW W WWWW W W WWWWWWW WWWW W W WWWWWWW WWWW W", "W W W W W W W W W W W W", "WWWW WWWW WWWW W W WWWW WWWWWWW WWWWWWW W W WWWWWWW W", "W W W W W W W W W W W", "W WWWW WWWWWWW W WWWW WWWWWWW W WWWW WWWW WWWW W W W", "W W W W W W W W W W W W W", "W W W W W WWWW W WWWWWWWWWWWWW WWWWWWW WWWW W W W W", "W W W W W W W W W W W W W W W", "W WWWWWWWWWW WWWW W W WWWW WWWW WWWW W W WWWW WWWW W", "W W W W W W W W W W W W W", "W W WWWW W WWWWWWWWWW WWWW W W W WWWWWWW WWWW WWWWWWW", "W W W W W W W W W W W W W", "W WWWW W W WWWW W WWWW WWWW W W WWWW WWWW W WWWW W", "W W W W W W W W W", "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", ] level3 = [ "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "W W W W W W W W W", "WWWWWWW W W WWWW WWWW W W W W W WWWWWWWWWWWWWWWWWWWWWW WWWW", "W W W W W W W W W W W W W W", "W W W W W WWWWWWW WWWWWWW W WWWWWWW W W WWWWWWW W WWWW W", "W W W W W W W W W W", "WWWW WWWW WWWW W WWWWWWW W WWWWWWWWWWWWW W WWWWWWW W WWWW W", "W W W W W W W W W W W W W W W W", "W WWWW WWWW WWWWWWW W WWWWWWWWWW WWWWWWW WWWW W W WWWW W W", "W W W W W W W W W", "W WWWWWWW WWWWWWWWWWWWW W WWWWWWWWWWWWW WWWWWWW W WWWW WWWW W", "W W W W W W W W W W W", "W WWWWWWWWWWWWWWWW WWWW WWWW W WWWW WWWW W WWWWWWW WWWW WWWW", "W W W W W W W W W W W W", "W WWWWWWW W WWWW W W WWWWWWWWWW W WWWW W WWWWWWWWWW W W W", "W W W W W W W W W W W W W", "W W WWWW W W WWWW WWWW WWWW WWWW W WWWW W WWWW W WWWW W", "W W W W W W W W W W W W W W W W", "W W WWWWWWW W WWWWWWWWWW W W W WWWWWWWWWW WWWW W WWWW WWWW", "W W W W W W W W W W W W W W W W W", "W W W W WWWWWWW WWWW W WWWWWWW WWWW WWWW W W W W W W W", "W W W W W W W W W W W W", "WWWWWWW W WWWW W W WWWWWWW W W WWWW W W W W WWWW WWWW W", "W W W W W W W W W W W W W W", "WWWW W W WWWWWWWWWW WWWWWWWWWW WWWW W W WWWWWWW W W W WWWW", "W W W W W W W W W W W W W", "W WWWW W W W WWWWWWW WWWWWWW W WWWW WWWWWWW W W WWWWWWW W", "W W W W W W W W W W W W W W W W", "W WWWWWWW WWWWWWW W W W W WWWW WWWWWWWWWW WWWWWWW WWWWWWW W", "W W W W W W W W", "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", ] f1()
Ответ №1:
Вам нужно только сбросить все ваши глобальные переменные и классы в вашем лабиринте : вы можете сделать это с помощью функции перезапуска, которая закрывает предыдущее окно и сбрасывает переменные.
Вот пример :
def restart(): global walls,player,labyrinthe,clock pygame.quit() pygame.init() pygame.display.set_caption("Va au carre rouge!") clock = pygame.time.Clock() walls = [] player = Player() labyrinthe = labyrinthe_aleatoire()
Вам не нужно перезапускать процесс tk f1, так как он выполняется в фоновом режиме
Комментарии:
1. Спасибо за ваши ответы, вы мне очень помогли!!