Bonjour, je ne vais pas vous le cacher je suis débutant ,mais vraiment, en ce qui concerne Pygame avec Pycharm et même en général, alors pour que vous ayez le contexte j’ai un travail de groupe à faire et nous souhaitons réaliser un jeu du style Street Fighter. Certaines de ces pages ne sont pas finis, mais le problème que je n’arrive pas à résoudre est que lorsque je clique sur le bouton pour relancer une partie, sur la page WinScreen, le jeu s’arrête et ne relance pas de partie. Si quelqu’un pouvait m’aider cela serait vraiment très sympa
Game :
from Player_2 import Player_2
from Player_1 import Player_1
class Game:
def __init__(self):
self.player_2 = Player_2()
self.player_1 = Player_1()
self.pressed = {
"Right": True,
"Left": False
}
self.game_over = False # Ajout de l'attribut game_over
# Ajout d'une méthode pour définir le jeu comme terminé
def set_game_over(self):
self.game_over = True
Player_1 :
import pygame
class Player_1(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
# CARACTERISTIQUE DU PERSONNAGE
self.health = 200
self.max_health = 200
self.attack = 2
self.in_player = False
self.image = pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Link_Green_Sprite.png"), (70, 90))
self.rect = self.image.get_rect()
self.rect.x = 450
self.rect.y = 250 # 227
self.floor = self.rect.y
self.speed = 8
self.jump_speed = 1
self.jump_height = 20
self.gravity = 1
self.direction = 'right'
self.is_jumping = False
self.animation_update = False
self.height = 12 * 6.5
self.width = 18 * 6.5
self.sprites_right = [
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame1.png"),
(self.height, self.width)),
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame2.png"),
(self.height, self.width)),
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame3.png"),
(self.height, self.width)),
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame4.png"),
(self.height, self.width))
]
self.sprites_left = [
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame5.png"),
(self.height, self.width)),
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame6.png"),
(self.height, self.width)),
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame7.png"),
(self.height, self.width)),
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame8.png"),
(self.height, self.width))
]
self.current_sprite_right = 0
self.current_sprite_left = 4
self.image = self.sprites_right[self.current_sprite_right]
self.rect1 = self.image.get_rect()
def move_right(self):
self.rect.x += self.speed
self.direction = 'right'
"self.animation_update = True"
def move_left(self):
self.rect.x -= self.speed
self.direction = 'left'
def jump(self):
if not self.is_jumping and self.rect.y == self.floor:
self.is_jumping = True
self.jump_speed = -self.jump_height
def update(self):
if self.is_jumping:
self.jump_speed += self.gravity
self.rect.y += self.jump_speed
if self.rect.y > self.floor:
self.rect.y = self.floor
self.is_jumping = False
def update_health_bar(self, surface):
bar_color = (111, 210, 46)
bar_color_background = (60, 63, 60)
bar_position = (425, 15, self.health, 20)
bar_background_position = (425, 15, self.max_health, 20)
pygame.draw.rect(surface, bar_color_background, bar_background_position)
pygame.draw.rect(surface, bar_color, bar_position)
def take_damage(self):
if self.in_player:
self.health -= self.attack
print("Player 1 :Dégat subit")
self.in_player = False
def update_animation(self, speed):
keys = pygame.key.get_pressed()
if keys[pygame.K_RIGHT]:
if self.animation_update:
self.current_sprite_right += speed
self.image = self.sprites_right[int(self.current_sprite_right)-1]
if int(self.current_sprite_right) >= len(self.sprites_right):
self.current_sprite_right = 0
self.animation_update = False
else:
self.current_sprite_left += speed
self.image = self.sprites_left[int(self.current_sprite_left) - 2]
if int(self.current_sprite_left) >= len(self.sprites_left):
self.current_sprite_left = 5
self.animation_update = True
Player_2:
import pygame
class Player_2(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
# CARACTERISTIQUE DU PERSONNAGE
self.health = 200
self.max_health = 200
self.attack = 2
self.in_player = False
self.image = pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Link_Red_Sprite.png"), (70, 90))
self.rect = self.image.get_rect()
self.rect.x = 100
self.rect.y = 250
self.floor = self.rect.y
self.speed = 8
self.jump_speed = 1
self.jump_height = 20
self.gravity = 1
self.direction = 'right'
self.is_jumping = False
def move_right(self):
self.rect.x += self.speed
self.direction = 'right'
def move_left(self):
self.rect.x -= self.speed
self.direction = 'left'
def jump(self):
if not self.is_jumping and self.rect.y == self.floor:
self.is_jumping = True
self.jump_speed = -self.jump_height
def update(self):
if self.is_jumping:
self.jump_speed += self.gravity
self.rect.y += self.jump_speed
if self.rect.y > self.floor:
self.rect.y = self.floor
self.is_jumping = False
def update_health_bar(self, surface):
bar_color = (111, 210, 46)
bar_color_background = (60, 63, 60)
bar_position = (15, 15, self.health, 20)
bar_background_position = (15, 15, self.max_health, 20)
pygame.draw.rect(surface, bar_color_background, bar_background_position)
pygame.draw.rect(surface, bar_color, bar_position)
def take_damage(self):
if self.in_player:
self.health -= self.attack
print("Player 2 :Dégat subit")
self.in_player = False
ScreenUI :
from copy import copy
import pygame
from Game import Game
import WinScreen
# FENETRE
pygame.init()
game = Game()
running = True
pygame.display.set_caption("Link Fighter: Streets of Hyrule")
pygame.display.set_icon(pygame.image.load("E:\\Game_Project\\Icon_Game\\Triforce_Icon.png"))
screen = pygame.display.set_mode((640, 400))
window_width, window_height = screen.get_size()
background = pygame.transform.scale(pygame.image.load("E:\\Game_Project\\BackGround\\Map1.png"), (window_width, window_height))
# BOUCLE PRINCIPALE
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Ajout d'un contrôle pour arrêter la boucle si le jeu est terminé
if game.game_over:
running = False
elif event.type == pygame.KEYDOWN:
game.pressed[event.key] = True
elif event.type == pygame.KEYUP:
game.pressed[event.key] = False
old_direction = copy(game.player_1.direction)
old_direction_player2 = copy(game.player_2.direction)
# Player 1
if game.player_1.rect.colliderect(game.player_2.rect):
game.player_1.in_player = True
else:
game.player_1.in_player = False
if game.player_2.rect.colliderect(game.player_1.rect):
game.player_2.in_player = True
print("Collision entre les joueurs!")
else:
game.player_2.in_player = False
if game.pressed.get(pygame.K_RIGHT):
game.player_1.move_right()
elif game.pressed.get(pygame.K_LEFT):
game.player_1.move_left()
elif game.pressed.get(pygame.K_KP0):
game.player_2.take_damage()
if game.pressed.get(pygame.K_UP):
game.player_1.jump()
# Player 2
if game.pressed.get(pygame.K_d):
game.player_2.move_right()
elif game.pressed.get(pygame.K_q):
game.player_2.move_left()
elif game.pressed.get(pygame.K_SPACE):
game.player_1.take_damage()
if game.pressed.get(pygame.K_z):
game.player_2.jump()
# Player 1 Collision and Image Actualisation
if game.player_1.rect.x + game.player_1.rect.width > screen.get_width():
game.player_1.rect.x = screen.get_width() - game.player_1.rect.width
if game.player_1.rect.x < 0:
game.player_1.rect.x = 0
if old_direction != game.player_1.direction:
game.player_1.image = pygame.transform.flip(game.player_1.image, True, False)
# Player 2 Collision and Image Actualisation
if game.player_2.rect.x + game.player_2.rect.width > screen.get_width():
game.player_2.rect.x = screen.get_width() - game.player_2.rect.width
if game.player_2.rect.x < 0:
game.player_2.rect.x = 0
if old_direction_player2 != game.player_2.direction:
game.player_2.image = pygame.transform.flip(game.player_2.image, True, False)
# ACTUALISATION
screen.fill((55, 55, 55))
screen.blit(background, (0, 0))
screen.blit(game.player_1.image, game.player_1.rect)
screen.blit(game.player_2.image, game.player_2.rect)
game.player_1.update()
game.player_1.update_animation(0.3)
game.player_2.update()
game.player_1.update_health_bar(screen)
game.player_2.update_health_bar(screen)
if game.player_1.health <= 0 or game.player_2.health <= 0:
# Open the game over screen passing the winner and the game instance
winner = 2 if game.player_1.health <= 0 else 1 # Determine the winner
WinScreen.WinScreen(winner, game) # Pass the game instance
pygame.display.flip()
pygame.time.delay(15)
pygame.quit()
WinScreen.py :
import pygame
def reset_game(game):
# Réinitialisation de la vie des joueurs
game.player_1.health = 200
game.player_2.health = 200
# Réinitialisation de la position des joueurs
game.player_1.rect.x = 450
game.player_1.rect.y = 250
game.player_2.rect.x = 100
game.player_2.rect.y = 250
# Définir le jeu comme non terminé
game.set_game_over(False)
def WinScreen(winner,game):
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Game Over")
font = pygame.font.Font(None, 36)
clock = pygame.time.Clock()
# Charger l'image de fond
background_image = pygame.image.load("E:\\Game_Project 1\\BackGround\\Win_Screen.jpg").convert()
# Définir les rectangles des boutons
button_width = 200
button_height = 50
restart_button_rect = pygame.Rect(200, 300, button_width, button_height)
main_menu_button_rect = pygame.Rect(200, 350, button_width, button_height)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
# Logique des boutons
if restart_button_rect.collidepoint(event.pos):
print("Restart Game")
reset_game(game)# Action pour redémarrer le jeu
elif main_menu_button_rect.collidepoint(event.pos):
print("Main Menu")
# Action pour revenir au menu principal
running = False # Sortir de la boucle et fermer la fenêtre
screen.fill((0, 0, 0))
# Affichage de l'image de fond
screen.blit(background_image, (0, 0))
title_font = pygame.font.Font(None,77)
game_over_text =title_font.render("Game Over", True, (255, 255, 255))
winner_font = pygame.font.Font(None, 65)
winner_text = winner_font.render(f"The Winner is : Player {winner}", True, (255, 255, 255))
restart_button_rect = pygame.Rect(200, 300, button_width, button_height)
main_menu_button_rect = pygame.Rect(restart_button_rect.right + 20, 300, button_width, button_height)
restart_button_text = font.render("Restart Game", True, (255, 255, 255))
main_menu_button_text = font.render("Main Menu", True, (255, 255, 255))
screen.blit(game_over_text, (250, 100))
screen.blit(winner_text, (125, 170))
screen.blit(restart_button_text, restart_button_rect.topleft)
screen.blit(main_menu_button_text, main_menu_button_rect.topleft)
pygame.display.flip()
clock.tick(60)
Ton code est imbitable t'as réussi à foirer ton c/c et à faire sauter l'indentation ![]()
Refais ça propre si tu veux qu'on puisse t'aider
(Même si c'est pas vraiment le sujet du forum)
ah oui excuse moi, après quelque recherche maintenant le jeu s'ouvre mais comme si c'était en arrière plan le voici avec l'indentation mais j'arrive pas à le mettre avec <code></code> : Game.py :
from Player_2 import Player_2
from Player_1 import Player_1
class Game:
def __init__(self):
self.player_2 = Player_2()
self.player_1 = Player_1()
self.pressed = {
"Right": True,
"Left": False
}
self.game_over = False # Ajout de l'attribut game_over
Player_1 :
import pygame
class Player_1(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
# CARACTERISTIQUE DU PERSONNAGE
self.health = 200
self.max_health = 200
self.attack = 2
self.in_player = False
self.image = pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Link_Green_Sprite.png"), (70, 90))
self.rect = self.image.get_rect()
self.rect.x = 450
self.rect.y = 250 # 227
self.floor = self.rect.y
self.speed = 8
self.jump_speed = 1
self.jump_height = 20
self.gravity = 1
self.direction = 'right'
self.is_jumping = False
self.animation_update = False
self.height = 12 * 6.5
self.width = 18 * 6.5
self.sprites_right = [
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame1.png"),
(self.height, self.width)),
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame2.png"),
(self.height, self.width)),
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame3.png"),
(self.height, self.width)),
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame4.png"),
(self.height, self.width))
]
self.sprites_left = [
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame5.png"),
(self.height, self.width)),
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame6.png"),
(self.height, self.width)),
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame7.png"),
(self.height, self.width)),
pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Run_Sprite_1\\Frame8.png"),
(self.height, self.width))
]
self.current_sprite_right = 0
self.current_sprite_left = 4
self.image = self.sprites_right[self.current_sprite_right]
self.rect1 = self.image.get_rect()
def move_right(self):
self.rect.x += self.speed
self.direction = 'right'
"self.animation_update = True"
def move_left(self):
self.rect.x -= self.speed
self.direction = 'left'
def jump(self):
if not self.is_jumping and self.rect.y == self.floor:
self.is_jumping = True
self.jump_speed = -self.jump_height
def update(self):
if self.is_jumping:
self.jump_speed += self.gravity
self.rect.y += self.jump_speed
if self.rect.y > self.floor:
self.rect.y = self.floor
self.is_jumping = False
def update_health_bar(self, surface):
bar_color = (111, 210, 46)
bar_color_background = (60, 63, 60)
bar_position = (425, 15, self.health, 20)
bar_background_position = (425, 15, self.max_health, 20)
pygame.draw.rect(surface, bar_color_background, bar_background_position)
pygame.draw.rect(surface, bar_color, bar_position)
def take_damage(self):
if self.in_player:
self.health -= self.attack
print("Player 1 :Dégat subit")
self.in_player = False
def update_animation(self, speed):
keys = pygame.key.get_pressed()
if keys[pygame.K_RIGHT]:
if self.animation_update:
self.current_sprite_right += speed
self.image = self.sprites_right[int(self.current_sprite_right)-1]
if int(self.current_sprite_right) >= len(self.sprites_right):
self.current_sprite_right = 0
self.animation_update = False
else:
self.current_sprite_left += speed
self.image = self.sprites_left[int(self.current_sprite_left) - 2]
if int(self.current_sprite_left) >= len(self.sprites_left):
self.current_sprite_left = 5
self.animation_update = True
Player_2 :
import pygame
class Player_2(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
# CARACTERISTIQUE DU PERSONNAGE
self.health = 200
self.max_health = 200
self.attack = 2
self.in_player = False
self.image = pygame.transform.scale(pygame.image.load("E:\\Game_Project\\Caracter\\Link_Red_Sprite.png"), (70, 90))
self.rect = self.image.get_rect()
self.rect.x = 100
self.rect.y = 250
self.floor = self.rect.y
self.speed = 8
self.jump_speed = 1
self.jump_height = 20
self.gravity = 1
self.direction = 'right'
self.is_jumping = False
def move_right(self):
self.rect.x += self.speed
self.direction = 'right'
def move_left(self):
self.rect.x -= self.speed
self.direction = 'left'
def jump(self):
if not self.is_jumping and self.rect.y == self.floor:
self.is_jumping = True
self.jump_speed = -self.jump_height
def update(self):
if self.is_jumping:
self.jump_speed += self.gravity
self.rect.y += self.jump_speed
if self.rect.y > self.floor:
self.rect.y = self.floor
self.is_jumping = False
def update_health_bar(self, surface):
bar_color = (111, 210, 46)
bar_color_background = (60, 63, 60)
bar_position = (15, 15, self.health, 20)
bar_background_position = (15, 15, self.max_health, 20)
pygame.draw.rect(surface, bar_color_background, bar_background_position)
pygame.draw.rect(surface, bar_color, bar_position)
def take_damage(self):
if self.in_player:
self.health -= self.attack
print("Player 2 :Dégat subit")
self.in_player = False
ScreenUI :
from copy import copy
import pygame
from Game import Game
import WinScreen
pygame.init()
game = Game()
running = True
pygame.display.set_caption("Link Fighter: Streets of Hyrule")
pygame.display.set_icon(pygame.image.load("E:\\Game_Project\\Icon_Game\\Triforce_Icon.png"))
screen = pygame.display.set_mode((640, 400))
window_width, window_height = screen.get_size()
background = pygame.transform.scale(pygame.image.load("E:\\Game_Project\\BackGround\\Map1.png"), (window_width, window_height))
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Ajout d'un contrôle pour arrêter la boucle si le jeu est terminé
if game.game_over:
running = False
elif event.type == pygame.KEYDOWN:
game.pressed[event.key] = True
elif event.type == pygame.KEYUP:
game.pressed[event.key] = False
old_direction = copy(game.player_1.direction)
old_direction_player2 = copy(game.player_2.direction)
# Player 1
if game.player_1.rect.colliderect(game.player_2.rect):
game.player_1.in_player = True
else:
game.player_1.in_player = False
if game.player_2.rect.colliderect(game.player_1.rect):
game.player_2.in_player = True
print("Collision entre les joueurs!")
else:
game.player_2.in_player = False
if game.pressed.get(pygame.K_RIGHT):
game.player_1.move_right()
elif game.pressed.get(pygame.K_LEFT):
game.player_1.move_left()
elif game.pressed.get(pygame.K_KP0):
game.player_2.take_damage()
if game.pressed.get(pygame.K_UP):
game.player_1.jump()
# Player 2
if game.pressed.get(pygame.K_d):
game.player_2.move_right()
elif game.pressed.get(pygame.K_q):
game.player_2.move_left()
elif game.pressed.get(pygame.K_SPACE):
game.player_1.take_damage()
if game.pressed.get(pygame.K_z):
game.player_2.jump()
# Player 1 Collision and Image Actualisation
if game.player_1.rect.x + game.player_1.rect.width > screen.get_width():
game.player_1.rect.x = screen.get_width() - game.player_1.rect.width
if game.player_1.rect.x < 0:
game.player_1.rect.x = 0
if old_direction != game.player_1.direction:
game.player_1.image = pygame.transform.flip(game.player_1.image, True, False)
# Player 2 Collision and Image Actualisation
if game.player_2.rect.x + game.player_2.rect.width > screen.get_width():
game.player_2.rect.x = screen.get_width() - game.player_2.rect.width
if game.player_2.rect.x < 0:
game.player_2.rect.x = 0
if old_direction_player2 != game.player_2.direction:
game.player_2.image = pygame.transform.flip(game.player_2.image, True, False)
# Ajout de la vérification pour voir si un joueur a perdu toute sa vie
if game.player_1.health <= 0:
WinScreen.WinScreen(2, game)
running = False # Arrête la boucle principale
elif game.player_2.health <= 0:
WinScreen.WinScreen(1, game)
running = False # Arrête la boucle principale
# ACTUALISATION
screen.fill((55, 55, 55))
screen.blit(background, (0, 0))
screen.blit(game.player_1.image, game.player_1.rect)
screen.blit(game.player_2.image, game.player_2.rect)
game.player_1.update()
game.player_1.update_animation(0.3)
game.player_2.update()
game.player_1.update_health_bar(screen)
game.player_2.update_health_bar(screen)
pygame.display.flip()
pygame.time.delay(15)
pygame.quit()
WinScreen :
import pygame
import ScreenUI
def reset_game(game):
# Réinitialisation de la vie des joueurs
game.player_1.health = 200
game.player_2.health = 200
# Réinitialisation de la position des joueurs
game.player_1.rect.x = 450
game.player_1.rect.y = 250
game.player_2.rect.x = 100
game.player_2.rect.y = 250
# Définir le jeu comme non terminé
running = True
def WinScreen(winner,game):
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Game Over")
font = pygame.font.Font(None, 36)
clock = pygame.time.Clock()
# Charger l'image de fond
background_image = pygame.image.load("E:\\Game_Project 1\\BackGround\\Win_Screen.jpg").convert()
# Définir les rectangles des boutons
button_width = 200
button_height = 50
restart_button_rect = pygame.Rect(200, 300, button_width, button_height)
main_menu_button_rect = pygame.Rect(200, 350, button_width, button_height)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
# Logique des boutons
if restart_button_rect.collidepoint(event.pos):
print("Restart Game")
reset_game(game)# Action pour redémarrer le jeu
elif main_menu_button_rect.collidepoint(event.pos):
print("Main Menu")
# Action pour revenir au menu principal
running = False # Sortir de la boucle et fermer la fenêtre
screen.fill((0, 0, 0))
# Affichage de l'image de fond
screen.blit(background_image, (0, 0))
title_font = pygame.font.Font(None,77)
game_over_text =title_font.render("Game Over", True, (255, 255, 255))
winner_font = pygame.font.Font(None, 65)
winner_text = winner_font.render(f"The Winner is : Player {winner}", True, (255, 255, 255))
restart_button_rect = pygame.Rect(200, 300, button_width, button_height)
main_menu_button_rect = pygame.Rect(restart_button_rect.right + 20, 300, button_width, button_height)
restart_button_text = font.render("Restart Game", True, (255, 255, 255))
main_menu_button_text = font.render("Main Menu", True, (255, 255, 255))
screen.blit(game_over_text, (250, 100))
screen.blit(winner_text, (125, 170))
screen.blit(restart_button_text, restart_button_rect.topleft)
screen.blit(main_menu_button_text, main_menu_button_rect.topleft)
pygame.display.flip()
clock.tick(60)