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