Flappy bird
Méthode : Préparation
On commence par récupérer le dossier FlappyBird , il faudra le décompresser et ouvrir le programme avec Thonny.
Voir ci-dessous
# import des modules
import pgzrun
from random import randint
# création des variables
TITLE = 'Flappy Bird'
WIDTH = 400
HEIGHT = 708
# création de l'oiseau
bird = Actor('bird1', (75, 200))
# fonctions
def update(): # ne fait rien pour le moment
pass
def draw():# affiche dans la fenêtre
screen.blit('background', (0, 0)) # le fond d'écran
bird.draw() # l'oiseau
#ligne obligatoiement en fin
pgzrun.go()
Méthode : Mettre en mouvement l'oiseau
On aura besoin de nouvelles variables :
GRAVITY initialisée à 0.3 ( pour simuler la gravité)
FLAP_STRENGTH initialisée à 6.5 ( la force des ailes de l'oiseau)
On aura besoin d'initialiser quelques valeurs précise associée à l'oiseau
bird.dead = False (l'oiseau n'est pas mort)
bird.score = 0 ( le score est à 0)
bird.vy = 0 ( la vitesse en y (ordonnée))
Voici la fonction qui gère la chute de l'oiseau
il faudra l'appeler dans la fonction update()
def update_bird():
uy = bird.vy # on récupère la valeur de vy
bird.vy += GRAVITY # on ajoute la gravité à vy
bird.y += (uy + bird.vy) / 2 # on calcule la nouvelle position de l'oiseau en ordonnée
if not bird.dead: # s'il n'est pas mort
if bird.vy < -3: # on change d'image pour un effetb de vol
bird.image = 'bird2'
else:
bird.image = 'bird1'
if not 0 < bird.y < 720: # si il tombe , on le remet en jeu
bird.y = 200
bird.dead = False
bird.score = 0
bird.vy = 0
Une fonction pour activer le vol.
cette fonction n'a pas besoin d'être appelée dans le update(), elle ne s'exécute que si on appuie sur une touche du clavier
# fonction pour n'importe quelle touche du clavier
def on_key_down():
if not bird.dead: # s'il n'est pas mort on diminue sa position en y
bird.vy = -FLAP_STRENGTH # permet de contrecarrer la chute
Méthode : Des tuyaux à traverser ...
Les tuyaux (pipes en anglais) se déplacerons et c'est cet effet qui donnera l'impression que notre oiseau avance.
ils seront placés l'un au-dessus de l'autre avec un espace pour permettre à l'oiseau de passer.
Il nous faut une nouvelle variable :
GAP = 200 pour l'écart entre les tuyaux
SPEED = 3 pour la vitesse de déplacement des tuyaux
Le code suivant crée les tuyaux et place les premiers tuyaux en exécutant immédiatement la fonction
def reset_pipes():# positionne les premiers tuyaux
pipe_gap_y = randint(200, HEIGHT - 200)
pipe_top.pos = (WIDTH, pipe_gap_y - GAP // 2)
pipe_bottom.pos = (WIDTH, pipe_gap_y + GAP // 2)
reset_pipes() # on l'exécute
Voici la fonction qui gère le déplacement des tuyaux, qui est à appeler dans la fonction update()
def update_pipes():
pipe_top.left -= SPEED # on fait reculer les tuyaux
pipe_bottom.left -= SPEED
if pipe_top.right < 0:# on réinitialise de nouveaux tuyaux s'ils sortent de la fenêtre
reset_pipes()
On rajoute les affichages des tuyaux dans la fonction draw()
pipe_top.draw()
pipe_bottom.draw()
Il faut également réinitialiser les tuyaux si l'oiseau tombe
if not 0 < bird.y < 720: # si il tombe , on le remet en jeu
bird.y = 200
bird.dead = False
bird.score = 0
bird.vy = 0
reset_pipes() # on remet les tuyaux au début
Méthode : Les collisions...
lorsque l'oiseau entre en collision avec un tuyaux, il meurt et on le remet en jeu
On ajoute simplement dans la fonction update_bird() le code suivant :
if bird.colliderect(pipe_top) or bird.colliderect(pipe_bottom):
bird.dead = True
bird.image = 'birddead'
En autonomie...
Création d'un score
Dans cette partie, vous devez gérer un score
il existe déjà dans le programme bird.score initialisé à 0
Vous pouvez même créer un highscore
.
Pour cela, le code suivant crée le stockage du meilleur score.
storage = {} # un dictionnaire
storage.setdefault('highscore', 0) # par défaut la valeur vaut 0
lorsque on augmente le score, on le compare au highscore
que l'on modifie le cas échéant.
Là ou il faut vous écrirez :
if not bird.dead:
bird.score += 1
if bird.score > storage['highscore']:
storage['highscore'] = bird.score
Vous afficherez le score et le highscore en vous reportant aux projets précédents