diff --git a/app.py b/app.py index ce31b91..7a8a53c 100644 --- a/app.py +++ b/app.py @@ -1,110 +1,109 @@ -import pyxel -import random - -# Configuration de base du jeu -SCREEN_WIDTH = 128 -SCREEN_HEIGHT = 128 -GRAVITY = 0.7 -JUMP_STRENGTH = -4 -PIPE_WIDTH = 16 -PIPE_GAP = 60 -BIRD_WIDTH = 8 -BIRD_HEIGHT = 8 - -class FlappyBird: - def __init__(self): - pyxel.init(SCREEN_WIDTH, SCREEN_HEIGHT, title="Flappy Bird") - pyxel.load("assets.pyxres") # Assurez-vous d'avoir des images dans ce fichier - self.bird_y = SCREEN_HEIGHT // 2 - self.velocity = 0 - self.score = 0 - self.pipes = [] - self.game_over = False - pyxel.run(self.update, self.draw) - - def update(self): - if self.game_over: - return - - # Mécanisme de saut - if pyxel.btnp(pyxel.KEY_SPACE): - self.velocity = JUMP_STRENGTH - - # Appliquer la gravité - self.velocity += GRAVITY - self.bird_y += self.velocity - - # Limiter l'oiseau aux bords de l'écran - if self.bird_y > SCREEN_HEIGHT - BIRD_HEIGHT: - self.bird_y = SCREEN_HEIGHT - BIRD_HEIGHT - self.velocity = 0 - - if self.bird_y < 0: - self.bird_y = 0 - self.velocity = 0 - - # Déplacer les tuyaux - self.move_pipes() - - # Vérification des collisions - self.check_collisions() - - def move_pipes(self): - if len(self.pipes) == 0 or self.pipes[-1][0] < SCREEN_WIDTH - 60: - self.create_pipe() - - # Déplacer les tuyaux vers la gauche - for pipe in self.pipes: - pipe[0] -= 1 - - # Supprimer les tuyaux qui sont hors écran - self.pipes = [pipe for pipe in self.pipes if pipe[0] > -PIPE_WIDTH] - - # Vérifier si un tuyau a traversé l'écran - for pipe in self.pipes: - if pipe[0] == SCREEN_WIDTH // 2 and not pipe[2]: - self.score += 1 - pipe[2] = True - - def create_pipe(self): - gap_y = random.randint(30, SCREEN_HEIGHT - 30 - PIPE_GAP) - self.pipes.append([SCREEN_WIDTH, gap_y, False]) # (x, y, passed) - - def check_collisions(self): - # Collision avec le sol ou le plafond - if self.bird_y > SCREEN_HEIGHT - BIRD_HEIGHT or self.bird_y < 0: - self.game_over = True - - # Collision avec les tuyaux - for pipe in self.pipes: - # Vérifier la collision avec la partie haute des tuyaux - if pipe[0] < BIRD_WIDTH and pipe[0] + PIPE_WIDTH > 0: - if self.bird_y < pipe[1]: # Si l'oiseau touche le haut du tuyau - self.game_over = True - - # Vérifier la collision avec la partie basse des tuyaux - if pipe[0] < BIRD_WIDTH and pipe[0] + PIPE_WIDTH > 0: - if self.bird_y + BIRD_HEIGHT > pipe[1] + PIPE_GAP: # Si l'oiseau touche le bas du tuyau - self.game_over = True - - def draw(self): - pyxel.cls(0) - - if self.game_over: - pyxel.text(SCREEN_WIDTH // 2 - 24, SCREEN_HEIGHT // 2, "GAME OVER", pyxel.COLOR_RED) - pyxel.text(SCREEN_WIDTH // 2 - 24, SCREEN_HEIGHT // 2 + 10, f"Score: {self.score}", pyxel.COLOR_WHITE) - return - - # Dessiner l'oiseau - pyxel.rect(32, self.bird_y, BIRD_WIDTH, BIRD_HEIGHT, pyxel.COLOR_YELLOW) - - # Dessiner les tuyaux - for pipe in self.pipes: - pyxel.rect(pipe[0], 0, PIPE_WIDTH, pipe[1], pyxel.COLOR_GREEN) # Partie haute du tuyau - pyxel.rect(pipe[0], pipe[1] + PIPE_GAP, PIPE_WIDTH, SCREEN_HEIGHT - (pipe[1] + PIPE_GAP), pyxel.COLOR_GREEN) # Partie basse du tuyau - - # Afficher le score - pyxel.text(5, 5, f"Score: {self.score}", pyxel.COLOR_WHITE) - -if __name__ == "__main__": - FlappyBird() +import pyxel +import random + +# Paramètres du jeu +SCREEN_WIDTH = 128 +SCREEN_HEIGHT = 128 +BIRD_SIZE = 8 +PIPE_WIDTH = 16 +PIPE_GAP = 50 # Modifié de 30 à 50 +BIRD_GRAVITY = 0.4 # Modifié de 0.5 à 0.4 +BIRD_LIFT = -4 # Modifié de -6 à -4 +PIPE_SPEED = 1 +PIPE_FREQ = 60 + +class FlappyBirdGame: + def __init__(self): + pyxel.init(SCREEN_WIDTH, SCREEN_HEIGHT) + pyxel.load("flappybird.pyxres") # Charger les ressources depuis le fichier .pyxres + self.bird_x = SCREEN_WIDTH // 4 + self.bird_y = SCREEN_HEIGHT // 2 + self.bird_velocity = 0 + self.pipes = [] + self.frame = 0 + self.score = 0 + self.game_over = False + self.game_started = False # Ajout de l'état de début du jeu + self.passed_pipes = [] # Suivi des tuyaux déjà passés + pyxel.run(self.update, self.draw) + + def update(self): + if self.game_over: + return + + self.frame += 1 + + # Si le jeu n'a pas commencé, on attend que l'utilisateur appuie sur espace + if not self.game_started: + if pyxel.btnp(pyxel.KEY_SPACE): + self.game_started = True # Le jeu commence dès qu'on appuie sur espace + self.bird_velocity = BIRD_LIFT # On applique un premier saut + + # Si le jeu a commencé, on gère la logique normale + if self.game_started: + # Saut du joueur + if pyxel.btnp(pyxel.KEY_SPACE): + self.bird_velocity = BIRD_LIFT + + # Mise à jour de la position de l'oiseau + self.bird_velocity += BIRD_GRAVITY + self.bird_y += self.bird_velocity + + # Limiter l'oiseau aux bords de l'écran + if self.bird_y < 0: + self.bird_y = 0 + if self.bird_y > SCREEN_HEIGHT - BIRD_SIZE: + self.bird_y = SCREEN_HEIGHT - BIRD_SIZE + self.game_over = True + + # Création des tuyaux + if self.frame % PIPE_FREQ == 0: + pipe_height = random.randint(20, SCREEN_HEIGHT - PIPE_GAP - 20) + self.pipes.append([SCREEN_WIDTH, pipe_height]) + + # Mise à jour de la position des tuyaux + for pipe in self.pipes: + pipe[0] -= PIPE_SPEED + + # Vérification des collisions + for pipe in self.pipes: + # Si l'oiseau touche un tuyau, le jeu est terminé + if self.bird_x + BIRD_SIZE > pipe[0] and self.bird_x < pipe[0] + PIPE_WIDTH: + if self.bird_y < pipe[1] or self.bird_y + BIRD_SIZE > pipe[1] + PIPE_GAP: + self.game_over = True + + # Retirer les tuyaux hors de l'écran + self.pipes = [pipe for pipe in self.pipes if pipe[0] + PIPE_WIDTH > 0] + + # Mise à jour du score + for pipe in self.pipes: + # Vérifier si l'oiseau a traversé le tuyau + if pipe[0] + PIPE_WIDTH < self.bird_x and pipe not in self.passed_pipes: + self.score += 1 + self.passed_pipes.append(pipe) # Marquer le tuyau comme "passé" + + def draw(self): + pyxel.cls(0) # Effacer l'écran + + # Dessiner l'oiseau en utilisant l'image du sprite dans le fichier .pyxres + pyxel.blt(self.bird_x, self.bird_y, 0, 0, 0, 8, 8, 0) # Le 0,0 ici représente la position du sprite dans le fichier pyxres + + # Dessiner les tuyaux + for pipe in self.pipes: + pyxel.rect(pipe[0], 0, PIPE_WIDTH, pipe[1], 11) # Tuyau du dessus + pyxel.rect(pipe[0], pipe[1] + PIPE_GAP, PIPE_WIDTH, SCREEN_HEIGHT - pipe[1] - PIPE_GAP, 11) # Tuyau du dessous + + # Afficher le score + pyxel.text(10, 10, f"Score: {self.score}", 7) + + # Si le jeu est terminé + if self.game_over: + pyxel.text(SCREEN_WIDTH // 2 - 30, SCREEN_HEIGHT // 2, "GAME OVER", 8) + pyxel.text(SCREEN_WIDTH // 2 - 30, SCREEN_HEIGHT // 2 + 10, f"Score: {self.score}", 7) + + # Si le jeu n'a pas encore commencé, afficher un message d'attente + if not self.game_started: + pyxel.text(SCREEN_WIDTH // 2 - 50, SCREEN_HEIGHT // 2, "Press SPACE to Start", 8) # Afficher le texte sans centrage automatique + +if __name__ == "__main__": + FlappyBirdGame()