Flappy bird

Flappy Bird

Tout le monde connaît le jeu du flappy bird

MéthodePréparation

On commence par récupérer le dossier FlappyBird , il faudra le décompresser et ouvrir le programme avec Thonny.

Voir ci-dessous

1
# import des modules
2
import pgzrun
3
from random import randint
4
5
# création des variables
6
7
TITLE = 'Flappy Bird'
8
WIDTH = 400
9
HEIGHT = 708
10
# création de l'oiseau
11
bird = Actor('bird1', (75, 200))
12
13
# fonctions
14
def update(): # ne fait rien pour le moment
15
    pass
16
17
def draw():# affiche dans la fenêtre
18
    screen.blit('background', (0, 0)) # le fond d'écran
19
    bird.draw() # l'oiseau
20
21
#ligne obligatoiement en fin
22
pgzrun.go()

MéthodeMettre 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()

1
def update_bird():
2
    uy = bird.vy # on récupère la valeur de vy
3
    bird.vy += GRAVITY # on ajoute la gravité à vy
4
    bird.y += (uy + bird.vy) / 2 # on calcule la nouvelle position de l'oiseau en ordonnée
5
6
    if not bird.dead: # s'il n'est pas mort
7
        if bird.vy < -3: # on change d'image pour un effetb de vol
8
            bird.image = 'bird2'
9
        else:
10
            bird.image = 'bird1'
11
12
    if not 0 < bird.y < 720: # si il tombe , on le remet en jeu
13
        bird.y = 200
14
        bird.dead = False
15
        bird.score = 0
16
        bird.vy = 0
17
        

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

1
# fonction pour n'importe quelle touche du clavier       
2
def on_key_down():
3
    if not bird.dead: # s'il n'est pas mort on diminue sa position en y
4
        bird.vy = -FLAP_STRENGTH # permet de contrecarrer la chute

MéthodeDes 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

1
def reset_pipes():# positionne les premiers tuyaux
2
    pipe_gap_y = randint(200, HEIGHT - 200)
3
    pipe_top.pos = (WIDTH, pipe_gap_y - GAP // 2)
4
    pipe_bottom.pos = (WIDTH, pipe_gap_y + GAP // 2)
5
    
6
reset_pipes()  # on l'exécute

Voici la fonction qui gère le déplacement des tuyaux, qui est à appeler dans la fonction update()

1
def update_pipes():
2
    pipe_top.left -= SPEED # on fait reculer les tuyaux
3
    pipe_bottom.left -= SPEED
4
    if pipe_top.right < 0:# on réinitialise de nouveaux tuyaux s'ils sortent de la fenêtre
5
        reset_pipes()

On rajoute les affichages des tuyaux dans la fonction draw()

1
pipe_top.draw()
2
pipe_bottom.draw()

Il faut également réinitialiser les tuyaux si l'oiseau tombe

1
if not 0 < bird.y < 720: # si il tombe , on le remet en jeu
2
        bird.y = 200
3
        bird.dead = False
4
        bird.score = 0
5
        bird.vy = 0
6
        reset_pipes() # on remet les tuyaux au début

MéthodeLes 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 :

1
if bird.colliderect(pipe_top) or bird.colliderect(pipe_bottom):
2
        bird.dead = True
3
        bird.image = 'birddead'
4
        

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.

1
storage = {} # un dictionnaire
2
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 :

1
if not bird.dead:
2
    bird.score += 1
3
    if bird.score > storage['highscore']:
4
        storage['highscore'] = bird.score

Vous afficherez le score et le highscore en vous reportant aux projets précédents