Un jeu de vaisseau spatial est un type de jeu vidéo où le joueur contrôle un vaisseau qui doit naviguer dans l'espace. L'objectif peut varier : éviter des obstacles, détruire des ennemis, collecter des objets, ou atteindre une destination spécifique.
Les caractéristiques principales incluent :
Contrôle du vaisseau : déplacement dans plusieurs directions (haut, bas, gauche, droite) souvent avec des commandes pour tirer des projectiles.
Ennemis et obstacles : astéroïdes, vaisseaux ennemis, champs de mines, etc.
Power-ups : améliorations des armes, boucliers, vitesse, etc.
Score : points accumulés en détruisant des ennemis ou en survivant plus longtemps.
Le joueur contrôle un vaisseau spatial qui doit survivre le plus longtemps possible en détruisant des ennemis avec des roquettes. Le score augmente à chaque ennemi éliminé. Le jeu se termine lorsque le vaisseau entre en collision avec un ennemi.
1. État Initial :
L’écran affiche "Arduino Space game".
Le joueur appuie sur le joystick pour commencer.
2. Phase de Jeu :
Déplacement du vaisseau dans les deux directions droite et gauche grâce au joystick.
Apparition des ennemis : des ennemis apparaissent sur l'écran.
Tirs de roquettes : le joueur tire des roquettes pour détruire les ennemis. Les roquettes se déplacent du bas vers le haut.
3. Gestion des Collisions :
Roquette vs Ennemi : si une roquette touche un ennemi : L’ennemi disparaît.
4. Fin de Partie :
Affichage de "Congratulations Game Won !!!" et du score final.
Possibilité de redémarrer la partie en appuyant sur le joystick.
Carte Arduino UNO
La carte Arduino UNO est le cerveau du jeu, gère la logique du gameplay, le traitement des entrées du joystick, l'affichage sur l’écran LCD et le contrôle du buzzer.
Fonctionnalités :
Lecture des valeurs analogiques du joystick.
Gestion des interruptions pour les tirs de roquettes.
Contrôle des signaux I2C pour l’écran LCD.
Commande du buzzer pour les effets sonores.
Afficheur LCD I2C (16x2 ou 20x4)
L'écran affiche l’état du jeu : position du vaisseau, ennemis et roquettes.
Manette (Joystick Analogique)
La manette contrôle du vaisseau (haut/bas/gauche/droite) et tir de roquettes (clic du joystick).
Buzzer
Le Buzzer fournit des effets sonores pour améliorer l'immersion :
Fils de connexion
On utilise les fils de connexion pour relier tous les composants à l’Arduino
Plaque d'essai (Breadboard) :
On utilise la plaque d'essai pour faciliter le câblage des différents composants.
*
Joystick :
VRx : Connecté à l'entrée analogique A2 de la carte Arduino UNO.
VRy : Connecté à l'entrée analogique A3 de la carte Arduino UNO.
SW : Connecté à l'entrée numérique D2 de la carte Arduino UNO pour le bouton-poussoir.
GND : Connecté à broche GND de la carte Arduino UNO.
VCC : Connecté à broche 3V3 de la carte Arduino UNO.
2. Afficheur LCD :
SDA : Connecté à l'entrée analogique A4 de la carte Arduino UNO.
SCL : Connecté à l'entrée analogique A5 de la carte Arduino UNO.
GND : Connecté à broche GND de la carte Arduino UNO.
VCC : Connecté à broche 5V de la carte Arduino UNO.
3. Buzzer :
Connecter la broche (+) du buzzer à la sortie numérique D3 de l'Arduino UNO.
Relier l'autre broche (-) à GND de l'Arduino UNO.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
// Jeu de vaisseau spatial - Arduino UNO // Contrôle : Joystick (mouvement + tir) // Affichage : Écran LCD I2C // Effets sonores : Buzzer #include <LiquidCrystal_I2C.h> // Configuration de l'écran LCD I2C LiquidCrystal_I2C lcd(0x27, 16, 2); // Broches du joystick const int VRx = A0; const int VRy = A1; const int SW = 2; // Bouton du joystick // Broche du buzzer const int buzzer = 3; // Variables du vaisseau int shipY = 0; // Position verticale (0 ou 1) // Roquette bool rocketActive = false; int rocketX, rocketY; // Ennemi int enemyX = 15; int enemyY; // Score int score = 0; void setup() { lcd.begin(16, 2); lcd.backlight(); pinMode(SW, INPUT_PULLUP); pinMode(buzzer, OUTPUT); randomSeed(analogRead(0)); lcd.setCursor(2, 0); lcd.print("Vaisseau Spatial"); lcd.setCursor(3, 1); lcd.print("Appuyez !"); while (digitalRead(SW) == HIGH); delay(200); lcd.clear(); } void loop() { readJoystick(); updateRocket(); updateEnemy(); checkCollision(); displayGame(); delay(150); } void readJoystick() { int yValue = analogRead(VRy); if (yValue < 400 && shipY > 0) { shipY--; } else if (yValue > 600 && shipY < 1) { shipY++; } if (digitalRead(SW) == LOW && !rocketActive) { rocketActive = true; rocketX = 2; rocketY = shipY; tone(buzzer, 1000, 100); } } void updateRocket() { if (rocketActive) { rocketX++; if (rocketX > 15) { rocketActive = false; } } } void updateEnemy() { enemyX--; if (enemyX < 0) { enemyX = 15; enemyY = random(0, 2); } } void checkCollision() { if (rocketActive && rocketX == enemyX && rocketY == enemyY) { rocketActive = false; enemyX = 15; score++; tone(buzzer, 1500, 200); } if (enemyX == 1 && enemyY == shipY) { gameOver(); } } void displayGame() { lcd.clear(); lcd.setCursor(0, shipY); lcd.print(">^"); if (rocketActive) { lcd.setCursor(rocketX, rocketY); lcd.print("-"); } lcd.setCursor(enemyX, enemyY); lcd.print("@"); lcd.setCursor(12, 0); lcd.print("Score:"); lcd.print(score); } void gameOver() { tone(buzzer, 500, 1000); lcd.clear(); lcd.setCursor(4, 0); lcd.print("GAME OVER"); lcd.setCursor(4, 1); lcd.print("Score: "); lcd.print(score); delay(3000); resetGame(); } void resetGame() { shipY = 0; rocketActive = false; enemyX = 15; score = 0; lcd.clear(); } |
1. Inclusion des Bibliothèques et Initialisation de l'Écran
1 2 |
#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); |
LiquidCrystal_I2C.h
: pour contrôler l’écran LCD I2C (adresse 0x27, 16 colonnes, 2 lignes).
2. Définition des Broches et Variables
1 2 3 4 5 6 7 8 9 10 |
const int VRx = A0; // Axe X du joystick const int VRy = A1; // Axe Y du joystick const int SW = 2; // Bouton du joystick const int buzzer = 3; // Buzzer int shipY = 0; // Position verticale du vaisseau bool rocketActive = false; int rocketX, rocketY; int enemyX = 15, enemyY; int score = 0; |
Joystick : contrôle le vaisseau et le tir.
Buzzer : émet des sons (tirs, explosions, game over).
Positions du vaisseau, des roquettes et des ennemis : gérées par des coordonnées X
et Y
.
Score : compteur des ennemis détruits.
3. Initialisation dans setup()
1 2 3 4 5 |
lcd.begin(16, 2); lcd.backlight(); pinMode(SW, INPUT_PULLUP); pinMode(buzzer, OUTPUT); randomSeed(analogRead(0)); |
Initialisation de l’écran LCD avec rétroéclairage.
Pull-up interne pour le bouton du joystick (évite des résistances externes).
Générateur de nombres aléatoires pour la position des ennemis.
4. Boucle Principale loop()
Chaque cycle de la boucle met à jour le jeu :
1. Lecture du joystick (déplacement + tir)
2. Mise à jour de la roquette (avancée)
3. Mouvement de l’ennemi (vers la gauche)
4. Vérification des collisions (roquette/ennemi, vaisseau/ennemi)
5. Affichage sur l’écran LCD
6. Pause de 150 ms pour contrôler la vitesse du jeu.
5. Lecture du Joystick (readJoystick()
)
1 2 3 4 5 6 7 8 9 10 |
int yValue = analogRead(VRy); if (yValue < 400 && shipY > 0) shipY--; else if (yValue > 600 && shipY < 1) shipY++; if (digitalRead(SW) == LOW && !rocketActive) { rocketActive = true; rocketX = 2; rocketY = shipY; tone(buzzer, 1000, 100); } |
Déplacement vertical du vaisseau entre la ligne 0 et 1 de l’écran.
Tir de roquette lorsque le bouton du joystick est pressé (SW
bas).
6. Gestion de la Roquette (updateRocket()
)
1 2 3 4 |
if (rocketActive) { rocketX++; if (rocketX > 15) rocketActive = false; } |
La roquette avance vers la droite.
Si elle sort de l’écran, elle disparaît.
7. Apparition des Ennemis (updateEnemy()
)
1 2 3 4 5 |
enemyX--; if (enemyX < 0) { enemyX = 15; enemyY = random(0, 2); } |
L’ennemi se déplace de droite à gauche.
Lorsqu’il sort de l’écran, il réapparaît aléatoirement en haut ou en bas.
8. Détection des Collisions (checkCollision()
)
1 2 3 4 5 6 7 8 9 10 |
if (rocketActive && rocketX == enemyX && rocketY == enemyY) { rocketActive = false; enemyX = 15; score++; tone(buzzer, 1500, 200); } if (enemyX == 1 && enemyY == shipY) { gameOver(); } |
Roquette vs Ennemi : explosion + gain de score + son.
Vaisseau vs Ennemi : Game Over immédiat.
9. Affichage sur l'Écran (displayGame()
)
1 2 3 4 5 6 7 8 9 10 11 12 |
lcd.clear(); lcd.setCursor(0, shipY); lcd.print(">^"); // Vaisseau if (rocketActive) { lcd.setCursor(rocketX, rocketY); lcd.print("-"); // Roquette } lcd.setCursor(enemyX, enemyY); lcd.print("@"); // Ennemi lcd.setCursor(12, 0); lcd.print("Score:"); lcd.print(score); |
Affichage de :
Le vaisseau >^
La roquette -
L’ennemi @
Le score en haut à droite.
10. Fin de Partie (gameOver()
)
1 2 3 4 5 6 7 8 9 |
tone(buzzer, 500, 1000); lcd.clear(); lcd.setCursor(4, 0); lcd.print("GAME OVER"); lcd.setCursor(4, 1); lcd.print("Score: "); lcd.print(score); delay(3000); resetGame(); |
Son d’alarme avec le buzzer.
Affichage du message de fin et du score final.
Redémarrage du jeu après un délai de 3 secondes.
11. Réinitialisation du Jeu (resetGame()
)
1 2 3 4 5 |
shipY = 0; rocketActive = false; enemyX = 15; score = 0; lcd.clear(); |
Remise à zéro des positions et du score pour un nouveau départ.
La robotique éducative joue un rôle important dans l'éducation des enfants et des jeunes en les aidant à acquérir des compétences en science et technologie.
Dans ce cadre notre site web représente une excellente ressource pour les parents, les enseignants et les enfants qui souhaitent découvrir la robotique.
Zaouiet Kontech-Jemmel-Monastir-Tunisie
+216 92 886 231
medaliprof@gmail.com
Site robotique réalisé par Mohamed Ali-Prof Info