Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gestion des niveaux pour un jeu pygame en python

    2 mars 2024 à 11:38:07

    Bonjour,

    Je rencontre un problème sur mon jeu pygame.

    C'est un jeu avec 3 niveaux + un niveau bonus et j'aimerais que quand le joueur démarre le jeu, le niveau 1 soit accessible, mais pas les autres niveaux, quand le joueur fini le niveau 1, il peut accéder au niveau 2, mais pas aux niveaux supérieurs, quand il finit le niveau 2, il peut accéder au niveau 3, mais pas au niveau bonus et quand il finit le niveau 3, il peut accéder au niveau bonus.

    Voici le code du jeu:

    import pygame
    import random
    import time
    import sys

    pygame.init()


    pygame.display.set_caption("Jeu de la Frite")
    screen = pygame.display.set_mode((1080, 720))

    background = pygame.image.load(r'C:\Users\User\PycharmProjects\Jeu De La Frite\Capture décran .png')


    images_boutons = {
    "Niveau 1": pygame.image.load(r'C:\Users\User\PycharmProjects\Jeu De La Frite\DALL·E 2023-08-15 13.51.15 - interieur restrauranta frite style dessin colorie.png'),
    "Niveau 2": pygame.image.load(r'C:\Users\User\PycharmProjects\Jeu De La Frite\DALL·E 2023-08-20 12.26.23 - interieur restrauranta frite style dessin colorie2.png'),
    "Niveau 3": pygame.image.load(r'C:\Users\User\PycharmProjects\Jeu De La Frite\DALL·E 2023-08-20 12.36.48 - une restrauranta frite style dessin colorie.png'),
    "Niveau Bonus": pygame.image.load(r'C:\Users\User\PycharmProjects\Jeu De La Frite\DALL·E 2023-08-20 13.33.25 - interieur restrauranta frite style dessin colorie.png')
    }

    frite_image = pygame.image.load(r'C:\Users\User\PycharmProjects\Jeu De La Frite\frite-removebg-preview.png')

    # Chargez l'image du boutonpip install pyinstaller "Quitter"
    quit_button_image = pygame.image.load(r'C:\Users\User\PycharmProjects\Jeu De La Frite\quit_button.png')

    class Frite:
    def __init__(self, image, position):
    self.image = image
    self.position = position
    self.scale = 1.0

    frite = Frite(frite_image, None)

    current_image = None

    bonus_scale = 0.2 # Échelle spécifique au niveau bonus
    bonus_timer = None
    bonus_move_timer = None # Ajout du timer pour le mouvement de la frite au niveau bonus

    bouton_hauteur = 50
    bouton_marge = 20

    total_height = (bouton_hauteur + bouton_marge) * len(images_boutons) - bouton_marge

    y_offset = (720 - total_height) // 2
    x_offset = 70

    buttons = []

    for i, (nom_bouton, image_bouton) in enumerate(images_boutons.items()):
    bouton_rect = pygame.Rect(500 - x_offset, y_offset + i * (bouton_hauteur + bouton_marge), 200, bouton_hauteur)
    scale = 0.75 if nom_bouton == "Niveau 1" else 0.5 if nom_bouton == "Niveau 2" else 0.25
    buttons.append({"text": nom_bouton, "rect": bouton_rect, "image": image_bouton, "scale": scale})

    buttons[1]["image_x_offset"] = 200 # Décalage de l'image du bouton 2 vers la droite

    # Définissez la position et la taille du bouton "Quitter"
    quit_button_rect = quit_button_image.get_rect()
    quit_button_rect.topleft = (10, 600 - 70)

    game_state = "menu"
    current_scale = None

    running = True

    while running:
    screen.blit(background, (0, 0))

    for button_data in buttons:
    pygame.draw.rect(screen, (255, 0, 0), button_data["rect"])

    font = pygame.font.Font(None, 36)
    button_text = font.render(button_data["text"], True, (255, 255, 255))
    screen.blit(button_text, (button_data["rect"].centerx - button_text.get_width() // 2, button_data["rect"].centery - button_text.get_height() // 2))

    if button_data["rect"].collidepoint(pygame.mouse.get_pos()) and game_state == "menu":
    if pygame.mouse.get_pressed()[0]:
    current_image = button_data["image"]
    game_state = "jeu"
    if button_data["text"] == "Niveau 1":
    frite.scale = 1.0
    elif button_data["text"] == "Niveau 2":
    frite.scale = 0.75
    elif button_data["text"] == "Niveau 3":
    frite.scale = 0.5
    elif button_data["text"] == "Niveau Bonus":
    frite.scale = bonus_scale
    frite.position = (random.randint(0, 1080 - frite.image.get_width()), random.randint(0, 720 - frite.image.get_height()))
    bonus_timer = time.time() + 5 # Réinitialise le timer lorsque vous revenez au menu
    current_scale = frite.scale # Sauvegarde l'échelle actuelle
    print("Changement d'état vers 'jeu'")
    print(f"Frite position: {frite.position}, Frite scale: {frite.scale}")

    # Affichez le bouton "Quitter"
    screen.blit(quit_button_image, quit_button_rect.topleft)

    if current_image:
    if game_state == "menu" and "image_x_offset" in buttons[1]:
    screen.blit(current_image, (buttons[1]["rect"].x + buttons[1]["image_x_offset"], 0))
    else:
    screen.blit(current_image, (0, 0))

    if game_state == "jeu" and frite.position:
    scaled_frite = pygame.transform.scale(frite.image, (int(frite.image.get_width() * frite.scale), int(frite.image.get_height() * frite.scale)))
    screen.blit(scaled_frite, frite.position)

    if game_state == "bonus":
    if bonus_timer is not None and time.time() >= bonus_timer:
    frite.scale = random.uniform(0.1, 1.0) # Change la taille de la frite de manière aléatoire
    frite.position = (random.randint(0, 1080 - frite.image.get_width()), random.randint(0, 720 - frite.image.get_height()))
    bonus_timer = time.time() + 5

    if bonus_move_timer is None or time.time() >= bonus_move_timer:
    frite.position = (random.randint(0, 1080 - frite.image.get_width()), random.randint(0, 720 - frite.image.get_height()))
    bonus_move_timer = time.time() + 4 # Réinitialisation du timer pour le prochain mouvement aléatoire

    pygame.display.flip()

    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    running = False
    print("Quitting the game")
    if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
    mouse_pos = pygame.mouse.get_pos()
    print(f"Mouse position: {mouse_pos}")
    print(f"Quit button rectangle: {quit_button_rect}")

    if game_state == "menu" and quit_button_rect.collidepoint(mouse_pos):
    running = False # Quittez le jeu si le bouton "Quitter" est cliqué
    print("Quitting the game from menu")
    elif game_state == "jeu" and frite.position and frite.position[0] <= mouse_pos[0] <= frite.position[
    0] + scaled_frite.get_width() and frite.position[1] <= mouse_pos[1] <= frite.position[
    1] + scaled_frite.get_height():
    current_image = None
    game_state = "menu"
    frite.scale = current_scale # Rétablir l'échelle précédente
    print("Changement d'état vers 'menu'")
    print(f"Frite position: {frite.position}, Frite scale: {frite.scale}")

    pygame.time.delay(10) # Ajout d'un léger délai pour éviter une utilisation excessive du processeur

    pygame.quit()
    sys.exit()

    Quel peut-être la solution ?

    • Partager sur Facebook
    • Partager sur Twitter
      2 mars 2024 à 17:06:16

      La réponse est dans la question non ?
      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

        2 mars 2024 à 18:53:10

        Oui mais je n'arrive pas à le faire.
        • Partager sur Facebook
        • Partager sur Twitter
          4 mars 2024 à 14:33:15

          il faut "tracer" son évolution
          • Partager sur Facebook
          • Partager sur Twitter
            5 mars 2024 à 12:54:23

            bah il faut connaitre le niveau actuel du joueur, "désactiver" les niveaux supérieurs au niveau+1; quand le joueur a fini un niveau, on met à jour le niveau actuel, et activer les niveaux alors jouables
            • Partager sur Facebook
            • Partager sur Twitter
              5 mars 2024 à 13:42:40

              C'est quand même dommage d'utiliser le mot clé class sans rien modéliser de son jeu.
              • Partager sur Facebook
              • Partager sur Twitter

              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

              Gestion des niveaux pour un jeu pygame en python

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown