Il s'agit d'une version simplifiée du jeu Flappy Bird. L'objectif est de diriger un oiseau, qui se déplace continuellement vers le haut ou le bas, pour éviter les obstacles. Si le joueur touche un obstacle, il perd.
Le but de ce didacticiel est d'enseigner les bases des sprites, des tableaux et des boucles de jeu.
Tout d'abord, nous allons ajouter un sprite pour l'oiseau depuis le menu Jeu et le faire clignoter.
Il faudra créer la variable "bird". Le mot bird veut dire oiseau.
Le mot sprite veut dire lutin.
x correspond à l'axe des abscisses et y à l'axe des ordonnées.
bird: game.LedSprite = None
bird = game.create_sprite(0, 2)
bird.set(LedSpriteProperty.BLINK, 300)
Avant de créer le code des actions du jeu, ajoutons d'abord quelques contrôles afin de pouvoir nous déplacer. Nous allons contrôler l'oiseau en appuyant sur le bouton A pour monter ou sur le bouton B pour descendre.
C'est là que les choses commenceront à devenir intéressantes. Nous allons générer aléatoirement des obstacles. Tous les obstacles auront un seul trou pour que l'oiseau puisse voler à travers. Tout d'abord, créez un ensemble d'obstacles qui contiendront tous les sprites (lutins) d'obstacles.
Nous devrons créer une nouvelle variable "obstacles".
obstacles: List[game.LedSprite] = []
Générez maintenant des obstacles verticaux composés de 4 sprites et 1 trou aléatoire. Créez une nouvelle variable appelée "emptyObstacleY". En utilisant le bloc "choisir au hasard", générez un nombre aléatoire de 0 à 4 et stockez-le dans emptyObstacleY. En utilisant la boucle "for", itérez de 0 à 4. Pour chaque coordonnée non égale à "emptyObstacleY", créez et ajoutez des sprites d'obstacle à la fin du tableau d'obstacles.
N'oubliez pas de créer une variable "index"!
Maintenant, à chaque redémarrage de micro:bit, vous devriez voir différents obstacles verticaux générés automatiquement. Avant de continuer, assurez-vous que les obstacles sont générés de manière aléatoire et que l'oiseau monte et descend.
Accéder à chaque obstacle à l'aide d'une boucle "pour l'élément faire" (itérer sur le tableau des obstacles) et diminuer la coordonnée X de l'obstacle de 1. Faire un clic droit sur le bloc valeur et le renommer en obstacle ; puis faites glisser ce bloc d'obstacle au-dessus du sprite dans le bloc de changement x.
Les obstacles doivent se déplacer vers la gauche toutes les secondes.
Faites disparaître les obstacles après avoir atteint le coin le plus à gauche. Itérez sur tous les obstacles, supprimez les sprites d'obstacles où la coordonnée X est égale à 0 et supprimez-les du tableau des obstacles.
Pour le moment, notre code ne génère qu'un seul obstacle vertical. Nous devons mettre le code de génération d'obstacles dans la boucle éternelle afin qu'il continue à générer de plus en plus d'obstacles.
Maintenant, notre écran est plein d'obstacles mobiles. Créez des espaces entre les obstacles générés. Introduisons une variable ticks pour compter le nombre d'itérations effectuées par la boucle pour toujours et n'exécutons la création d'obstacles que si ticks est divisible par 3.
À l'heure actuelle, rien ne se passe lorsque l'oiseau est heurté par un obstacle. Corrigez cela en parcourant le tableau des obstacles et en vérifiant si une coordonnée de sprite d'obstacle est égale à la coordonnée de l'oiseau.
// Variables
let birdY = 2
let gravity = 0
let obstacles: number[][] = []
let score = 0
let gameOver = false
// Initialisation
basic.forever(() => {
if (!gameOver) {
// Effacer l'écran
basic.clearScreen()
// Dessiner l'oiseau
led.plot(1, birdY)
// Appliquer la gravité
birdY += gravity
gravity = 1
// Empêcher l'oiseau de sortir de l'écran
if (birdY > 4) {
birdY = 4
gameOver = true
}
if (birdY < 0) {
birdY = 0
gravity = 1
}
// Générer des obstacles
if (Math.random() < 0.05) {
let gap = Math.randomRange(1, 3)
let obstacle: number[] = []
for (let i = 0; i < 5; i++) {
if (i < gap || i > gap) {
obstacle.push(1)
} else {
obstacle.push(0)
}
}
obstacles.push(obstacle)
}
// Déplacer et dessiner les obstacles
for (let i = 0; i < obstacles.length; i++) {
let obstacle = obstacles[i]
for (let j = 0; j < 5; j++) {
if (obstacle[j] == 1) {
led.plot(4 - i, j)
}
}
}
// Supprimer les obstacles hors écran
if (obstacles.length > 4) {
obstacles.shift()
}
// Détection de collision
for (let i = 0; i < obstacles.length; i++) {
if (obstacles[i][birdY] == 1 && (4 - i) == 1) {
gameOver = true
}
}
// Augmenter le score
score += 1
basic.pause(500)
} else {
basic.showString("Game Over!")
basic.showNumber(score)
basic.pause(2000)
control.reset()
}
})
// Contrôle de l'oiseau
input.onButtonPressed(Button.A, () => {
if (!gameOver) {
birdY -= 1
gravity = 0
}
})
from microbit import *
import random
# Variables
bird_y = 2
gravity = 0
obstacles = []
score = 0
game_over = False
# Fonction pour dessiner l'oiseau
def draw_bird():
display.set_pixel(1, bird_y, 9)
# Fonction pour dessiner les obstacles
def draw_obstacles():
for i in range(len(obstacles)):
for j in range(5):
if obstacles[i][j] == 1:
display.set_pixel(4 - i, j, 9)
# Boucle principale
while not game_over:
# Effacer l'écran
display.clear()
# Dessiner l'oiseau
draw_bird()
# Appliquer la gravité
bird_y += gravity
gravity = 1
# Empêcher l'oiseau de sortir de l'écran
if bird_y > 4:
bird_y = 4
game_over = True
if bird_y < 0:
bird_y = 0
gravity = 1
# Générer des obstacles aléatoires
if random.random() < 0.05:
gap = random.randint(1, 3)
obstacle = [0] * 5
for j in range(5):
if j < gap or j > gap:
obstacle[j] = 1
obstacles.append(obstacle)
# Dessiner les obstacles
draw_obstacles()
# Supprimer les obstacles hors écran
if len(obstacles) > 4:
obstacles.pop(0)
# Détection de collision
for i in range(len(obstacles)):
if obstacles[i][bird_y] == 1 and (4 - i) == 1:
game_over = True
# Augmenter le score
score += 1
sleep(500)
# Contrôle de l'oiseau
if button_a.was_pressed():
bird_y -= 1
gravity = 0
# Fin du jeu
display.scroll("Game Over!")
display.scroll(str(score))
Des exercices Voici quelques fonctionnalités supplémentaires que vous pouvez ajouter au jeu :