ENIB 2024 : Space Invador de l'espace : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(étape 1)
(ne pas modifier sous cette ligne)
 
(45 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
Titre de la fiche expérience :
+
Space Invador de l'espace <br>
==description (résumé)==
 
éventuelle photo de l'équipe
 
 
 
[[Fichier:Mariage d'amour partition 1.png|200px]]
 
  
 
==Introduction==
 
==Introduction==
  
[https://www.youtube.com/watch?v=-yKLlO2uGNM Video]
+
<html>
 +
<iframe width="560" height="315" src="https://www.youtube.com/embed/-yKLlO2uGNM?si=6mpKVUQX0jqe-2RU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
 +
</html>
  
L'objectif de notre jeu est de tuer l'ennemi. Notre Space Invador se compose de 16x16 leds représentant un vaisseau et des ennemis à abattre. Grâce aux boutons poussoirs, nous pouvons commander la position du vaisseau.
+
L'objectif de notre jeu est de tuer l'ennemi. Notre Space Invador se compose de 16x16 leds représentant un vaisseau et des ennemis à abattre. Grâce aux boutons poussoirs, nous pouvons commander la position du vaisseau et donc diriger les tirs.
  
 
==Outil et matériel==
 
==Outil et matériel==
  
 
· Carte arduino
 
· Carte arduino
·
+
<br>
 +
· 16x16 leds
 +
<br>
 +
· Boutons poussoirs
 +
<br>
 +
· Câbles électroniques
 +
<br>
 +
· Planches de chêne
  
 
==fichiers à joindre==
 
==fichiers à joindre==
code, ficher d'impression 3D, de découpe laser ou vinyle, ...
+
 
 
===Code Arduino===
 
===Code Arduino===
 
<syntaxhighlight lang="Arduino" line>  
 
<syntaxhighlight lang="Arduino" line>  
#define PIN 9
+
#include <FastLED.h>
#include <Arduino_GFX_Library.h>
+
#include <SPI.h>  
 +
 
 +
#define NUM_STRIPS 1
 +
#define NUM_LEDS_PER_STRIP 256
 +
CRGB leds[NUM_STRIPS][NUM_LEDS_PER_STRIP];
 +
 
 +
int color[5] {0x000000,0x000001,0x010000,0x000100,0x010100};
 +
int  position, position_vaisseau = 4, delay_tire = 0, level = 1;
 +
bool vivant = true, en_partie = true, ennemi = true;
 +
 
 +
int level_actuelle[16][16];
 +
 
 +
const int level_1[16][16] { \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  \
 +
};
 +
 
 +
const int level_2[16][16] { \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0}, \
 +
  {0, 0, 2, 2, 0, 0, 0, 2, 2, 0, 0, 0, 2, 2, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  \
 +
};
 +
 
 +
const int level_3[16][16] { \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 2, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0}, \
 +
  {0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 0}, \
 +
  {0, 0, 2, 0, 2, 0, 0, 2, 2, 0, 0, 2, 0, 2, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  \
 +
};
 +
 
 +
const int level_4[16][16] { \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  \
 +
};
 +
 
 +
const int game_over[16][16] { \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {2, 2, 2, 0, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0}, \
 +
  {2, 0, 0, 0, 2, 0, 2, 0, 2, 2, 2, 0, 2, 0, 0, 0}, \
 +
  {2, 0, 2, 0, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 0, 0}, \
 +
  {2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0}, \
 +
  {2, 2, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0, 2, 2, 2}, \
 +
  {0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0, 2, 0, 2}, \
 +
  {0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 2, 0, 0, 2, 2, 0}, \
 +
  {0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0, 2, 0, 2}, \
 +
  {0, 2, 2, 2, 0, 0, 2, 0, 0, 2, 2, 2, 0, 2, 0, 2}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  \
 +
};
 +
 
 +
const int win[16][16] { \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 2, 0, 0, 0, 2, 0, 2, 2, 2, 0, 2, 0, 0, 2, 0}, \
 +
  {0, 2, 0, 2, 0, 2, 0, 0, 2, 0, 0, 2, 2, 0, 2, 0}, \
 +
  {0, 2, 0, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 2, 2, 0}, \
 +
  {0, 0, 2, 0, 2, 0, 0, 2, 2, 2, 0, 2, 0, 0, 2, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 +
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  \
 +
};
 +
 
  
 
void setup() {
 
void setup() {
   // put your setup code here, to run once:
+
   // tell FastLED there's 60 NEOPIXEL leds on pin 2
 +
  FastLED.addLeds<NEOPIXEL, 2>(leds[0], NUM_LEDS_PER_STRIP);
 +
 
 +
  // tell FastLED there's 60 NEOPIXEL leds on pin 3
 +
  FastLED.addLeds<NEOPIXEL, 3>(leds[1], NUM_LEDS_PER_STRIP);
 +
 
 +
  // tell FastLED there's 60 NEOPIXEL leds on pin 4
 +
  FastLED.addLeds<NEOPIXEL, 4>(leds[2], NUM_LEDS_PER_STRIP);
 +
  Serial.begin(9600);
  
 +
  memcpy(level_actuelle,level_1,sizeof(level_1));
 +
 
 +
  pinMode(A0,INPUT);
 +
  pinMode(D7,INPUT);
 +
}
 +
 +
 +
void affiche() {
 +
  //carte
 +
  for(int x = 0; x < 16; x++) {
 +
    for(int y = 0; y < 16;y++){
 +
      if (x%2 == 1){
 +
        position = x*16+y;
 +
      }
 +
      else{
 +
        position = x*16+15-y;
 +
      }
 +
      leds[0][position] = color[level_actuelle[x][y]];
 +
    }
 +
  }
 +
 +
  FastLED.show();
 +
}
 +
 +
void create_vaisseau(){
 +
  //pos entre 2 et 15
 +
  clear();
 +
  level_actuelle[13][position_vaisseau] = 1;
 +
  level_actuelle[13][position_vaisseau-1] = 1;
 +
  level_actuelle[12][position_vaisseau-1] = 1;
 +
  level_actuelle[13][position_vaisseau-2] = 1;
 +
  level_actuelle[14][position_vaisseau-2] = 1;
 +
  level_actuelle[14][position_vaisseau] = 1;
 +
  FastLED.show();
 +
}
 +
 +
void clear(){
 +
  for(int x = 10; x < 15; x++) {
 +
    for(int y = 0; y < 16;y++){
 +
      if (level_actuelle[x][y] == 1){
 +
        level_actuelle[x][y] = 0;
 +
      }
 +
    }
 +
  }
 +
}
 +
 +
 +
void move(){
 +
  position_vaisseau = int(analogRead(A0)*16/1024);
 +
  if (position_vaisseau >= 16){
 +
    position_vaisseau = 15;
 +
  }
 +
  else if (position_vaisseau <= 1){
 +
    position_vaisseau = 2;
 +
  }
 +
}
 +
 +
void tirer() {
 +
  if (true) {
 +
    level_actuelle[11][position_vaisseau-1] = 103;
 +
  }
 +
}
 +
 +
void tick(){
 +
  ennemi = false;
 +
  for(int x = 0; x < 16; x++) {
 +
    for(int y = 0; y < 16;y++){
 +
      if (level_actuelle[x][y] == 3){ //tire joueur
 +
        if (x==0){
 +
          level_actuelle[x][y] = 0;
 +
        }
 +
        else if ((level_actuelle[x-1][y]==4) || (level_actuelle[x-1][y]==104)){
 +
          level_actuelle[x-1][y] = 3;
 +
          level_actuelle[x][y] = 104;
 +
        }
 +
        else if (level_actuelle[x-1][y]!=0){
 +
          level_actuelle[x-1][y] = 0;
 +
          level_actuelle[x][y] = 0;
 +
        }
 +
        else{
 +
          level_actuelle[x-1][y] = 3;
 +
          level_actuelle[x][y] = 0;
 +
        }
 +
      }
 +
   
 +
      else if (level_actuelle[x][y] == 2){ //vaisseau enemi
 +
        ennemi = true;
 +
        if ((level_actuelle[x+1][y] == 0)&(random(0,40)==1)){
 +
          level_actuelle[x+1][y] = 104; //chiffre temporaire pour pas refaire son action
 +
        }
 +
      }
 +
      else if (level_actuelle[x][y] == 104){
 +
        level_actuelle[x][y] = 4;
 +
      }
 +
      else if (level_actuelle[x][y] == 103){
 +
        level_actuelle[x][y] = 3;
 +
      }
 +
      else if (level_actuelle[x][y]== 4){
 +
        if (x==15){
 +
          level_actuelle[x][y] = 0;
 +
        }
 +
        if ((level_actuelle[x+1][y] == 0) &(x<15)){
 +
          level_actuelle[x+1][y] = 104;
 +
          level_actuelle[x][y] = 0;
 +
        }
 +
        else if (level_actuelle[x+1][y] == 3){
 +
          level_actuelle[x+1][y] = 104;
 +
          level_actuelle[x][y] = 3;
 +
        }
 +
        else if (level_actuelle[x+1][y] == 1){
 +
          level_actuelle[x][y] = 0;
 +
          //game over
 +
          en_partie = false;
 +
          vivant = false;
 +
        }
 +
      }
 +
    }
 +
  }
 
}
 
}
  
 
void loop() {
 
void loop() {
   // put your main code here, to run repeatedly:
+
   while (en_partie){
 +
    tick();
 +
    affiche();
 +
    create_vaisseau();
 +
    if ((digitalRead(D7)) & (delay_tire == 0)){
 +
      tirer();
 +
      delay_tire = 2;
 +
    }
 +
    else if (delay_tire !=0){
 +
      delay_tire -= 1;
 +
    }
 +
    move();
 +
    if (!ennemi){
 +
      if (level == 4){
 +
        en_partie = false;
  
 +
      }
 +
      else{
 +
        level +=1;
 +
      }
 +
 +
      if(level==2){
 +
        memcpy(level_actuelle,level_2,sizeof(level_2));
 +
      }
 +
      else if(level==3){
 +
        memcpy(level_actuelle,level_3,sizeof(level_3));
 +
      }
 +
      else if(level==4){
 +
        memcpy(level_actuelle,level_4,sizeof(level_4));
 +
      }
 +
    }
 +
    delay(75);
 +
  }
 +
  if (vivant){
 +
    memcpy(level_actuelle,win,sizeof(win));
 +
  }
 +
  else{
 +
    memcpy(level_actuelle,game_over,sizeof(game_over));
 +
  }
 +
  affiche();
 +
  delay(200);
 +
  if (digitalRead(D7)){
 +
      memcpy(level_actuelle,level_1,sizeof(level_1));
 +
      level = 1;
 +
      vivant = true;
 +
      en_partie = true;
 +
  }
 
}
 
}
 +
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
==étapes de fabrication==
 
==étapes de fabrication==
indiquer autant d'étape que nécessaire, chacune illustrée par des images (phot, dessins, ...)
 
  
 
===étape 1===
 
===étape 1===
  
Création du code arduino et test de celui-ci sur la carte.
+
Création du code arduino et test de celui-ci sur la carte. Toutes nos leds s'allument.
 +
 
 +
[[Fichier:Carte arduino.jpg|vignette]|350px]]
  
 
===étape 2===
 
===étape 2===
===étape ...===
+
 
===troubleshouting===
+
Création de la maquette en carton. Ce n'est pas la  version finale, juste le prototype.
quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?
+
 
 +
[[Fichier:Maquette en carton.jpg|vignette]|350px]]
 +
[[Fichier:Maquette carton.jpg|vignette]|350px]]
 +
 
 +
 
 +
Création de la maquette finale en bois.
 +
 
 +
<br>
 +
 
 +
[[Fichier:T.jpg|vignette]|350px]]
 +
 
 +
===étape 3 ===
 +
 
 +
Test du jeu.
 +
 
 +
[[Fichier:A.jpg|vignette]|350px]]
 +
 
 +
===Troubleshouting===
 +
 
 +
Difficultés rencontrées : création du code arduino
 +
<br>
 +
Solutions : test du code, analyse des erreurs, aide des intervenants
  
 
==Sources et documentation complémentaire==
 
==Sources et documentation complémentaire==
 +
* https://www.makercase.com/#/
 +
* https://www.festi.info/boxes.py/
 +
* https://boxdesigner.connectionlab.org/
  
 
==ne pas modifier sous cette ligne==
 
==ne pas modifier sous cette ligne==
 
[[Catégorie:Enib2024]]
 
[[Catégorie:Enib2024]]

Version actuelle datée du 2 février 2024 à 16:06

Space Invador de l'espace

Introduction

L'objectif de notre jeu est de tuer l'ennemi. Notre Space Invador se compose de 16x16 leds représentant un vaisseau et des ennemis à abattre. Grâce aux boutons poussoirs, nous pouvons commander la position du vaisseau et donc diriger les tirs.

Outil et matériel

· Carte arduino
· 16x16 leds
· Boutons poussoirs
· Câbles électroniques
· Planches de chêne

fichiers à joindre

Code Arduino

  1  
  2 #include <FastLED.h>
  3 #include <SPI.h> 
  4 
  5 #define NUM_STRIPS 1
  6 #define NUM_LEDS_PER_STRIP 256
  7 CRGB leds[NUM_STRIPS][NUM_LEDS_PER_STRIP];
  8 
  9 int color[5] {0x000000,0x000001,0x010000,0x000100,0x010100};
 10 int  position, position_vaisseau = 4, delay_tire = 0, level = 1;
 11 bool vivant = true, en_partie = true, ennemi = true;
 12 
 13 int level_actuelle[16][16];
 14 
 15 const int level_1[16][16] { \
 16   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 17   {0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0}, \
 18   {0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0}, \
 19   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 20   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 21   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 22   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 23   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 24   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 25   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 26   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 27   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 28   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 29   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 30   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 31   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  \
 32 };
 33 
 34 const int level_2[16][16] { \
 35   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 36   {0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0}, \
 37   {0, 0, 2, 2, 0, 0, 0, 2, 2, 0, 0, 0, 2, 2, 0, 0}, \
 38   {0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0}, \
 39   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 40   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 41   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 42   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 43   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 44   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 45   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 46   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 47   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 48   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 49   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 50   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  \
 51 };
 52 
 53 const int level_3[16][16] { \
 54   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 55   {0, 0, 0, 2, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0}, \
 56   {0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 0}, \
 57   {0, 0, 2, 0, 2, 0, 0, 2, 2, 0, 0, 2, 0, 2, 0, 0}, \
 58   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 59   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 60   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 61   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 62   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 63   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 64   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 65   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 66   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 67   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 68   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 69   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  \
 70 };
 71 
 72 const int level_4[16][16] { \
 73   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 74   {0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0}, \
 75   {0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0}, \
 76   {0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0}, \
 77   {0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0}, \
 78   {0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0}, \
 79   {0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0}, \
 80   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 81   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 82   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 83   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 84   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 85   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 86   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 87   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 88   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  \
 89 };
 90 
 91 const int game_over[16][16] { \
 92   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 93   {2, 2, 2, 0, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0}, \
 94   {2, 0, 0, 0, 2, 0, 2, 0, 2, 2, 2, 0, 2, 0, 0, 0}, \
 95   {2, 0, 2, 0, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 0, 0}, \
 96   {2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0}, \
 97   {2, 2, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0}, \
 98   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 99   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
100   {0, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0, 2, 2, 2}, \
101   {0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0, 2, 0, 2}, \
102   {0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 2, 0, 0, 2, 2, 0}, \
103   {0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0, 2, 0, 2}, \
104   {0, 2, 2, 2, 0, 0, 2, 0, 0, 2, 2, 2, 0, 2, 0, 2}, \
105   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
106   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
107   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  \
108 };
109 
110 const int win[16][16] { \
111   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
112   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
113   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
114   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
115   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
116   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
117   {0, 2, 0, 0, 0, 2, 0, 2, 2, 2, 0, 2, 0, 0, 2, 0}, \
118   {0, 2, 0, 2, 0, 2, 0, 0, 2, 0, 0, 2, 2, 0, 2, 0}, \
119   {0, 2, 0, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 2, 2, 0}, \
120   {0, 0, 2, 0, 2, 0, 0, 2, 2, 2, 0, 2, 0, 0, 2, 0}, \
121   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
122   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
123   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
124   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
125   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
126   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  \
127 };
128 
129 
130 void setup() {
131   // tell FastLED there's 60 NEOPIXEL leds on pin 2
132   FastLED.addLeds<NEOPIXEL, 2>(leds[0], NUM_LEDS_PER_STRIP);
133 
134   // tell FastLED there's 60 NEOPIXEL leds on pin 3
135   FastLED.addLeds<NEOPIXEL, 3>(leds[1], NUM_LEDS_PER_STRIP);
136 
137   // tell FastLED there's 60 NEOPIXEL leds on pin 4
138   FastLED.addLeds<NEOPIXEL, 4>(leds[2], NUM_LEDS_PER_STRIP);
139   Serial.begin(9600); 
140 
141   memcpy(level_actuelle,level_1,sizeof(level_1));
142   
143   pinMode(A0,INPUT);
144   pinMode(D7,INPUT);
145 }
146 
147 
148 void affiche() {
149   //carte
150   for(int x = 0; x < 16; x++) {
151     for(int y = 0; y < 16;y++){
152       if (x%2 == 1){
153         position = x*16+y;
154       }
155       else{
156         position = x*16+15-y;
157       }
158       leds[0][position] = color[level_actuelle[x][y]];
159     }
160   }
161 
162   FastLED.show();
163 }
164 
165 void create_vaisseau(){
166   //pos entre 2 et 15
167   clear();
168   level_actuelle[13][position_vaisseau] = 1;
169   level_actuelle[13][position_vaisseau-1] = 1;
170   level_actuelle[12][position_vaisseau-1] = 1;
171   level_actuelle[13][position_vaisseau-2] = 1;
172   level_actuelle[14][position_vaisseau-2] = 1;
173   level_actuelle[14][position_vaisseau] = 1;
174   FastLED.show();
175 }
176 
177 void clear(){
178   for(int x = 10; x < 15; x++) {
179     for(int y = 0; y < 16;y++){
180       if (level_actuelle[x][y] == 1){
181         level_actuelle[x][y] = 0;
182       }
183     }
184   }
185 }
186 
187 
188 void move(){
189   position_vaisseau = int(analogRead(A0)*16/1024);
190   if (position_vaisseau >= 16){
191     position_vaisseau = 15;
192   }
193   else if (position_vaisseau <= 1){
194     position_vaisseau = 2;
195   }
196 }
197 
198 void tirer() {
199   if (true) {
200     level_actuelle[11][position_vaisseau-1] = 103;
201   }
202 }
203 
204 void tick(){
205   ennemi = false;
206   for(int x = 0; x < 16; x++) {
207     for(int y = 0; y < 16;y++){
208       if (level_actuelle[x][y] == 3){ //tire joueur
209         if (x==0){
210           level_actuelle[x][y] = 0;
211         }
212         else if ((level_actuelle[x-1][y]==4) || (level_actuelle[x-1][y]==104)){
213           level_actuelle[x-1][y] = 3;
214           level_actuelle[x][y] = 104;
215         }
216         else if (level_actuelle[x-1][y]!=0){
217           level_actuelle[x-1][y] = 0;
218           level_actuelle[x][y] = 0;
219         }
220         else{
221           level_actuelle[x-1][y] = 3;
222           level_actuelle[x][y] = 0;
223         }
224       }
225     
226       else if (level_actuelle[x][y] == 2){ //vaisseau enemi
227         ennemi = true;
228         if ((level_actuelle[x+1][y] == 0)&(random(0,40)==1)){
229           level_actuelle[x+1][y] = 104; //chiffre temporaire pour pas refaire son action
230         }
231       }
232       else if (level_actuelle[x][y] == 104){
233         level_actuelle[x][y] = 4;
234       }
235       else if (level_actuelle[x][y] == 103){
236         level_actuelle[x][y] = 3;
237       }
238       else if (level_actuelle[x][y]== 4){
239         if (x==15){
240           level_actuelle[x][y] = 0;
241         }
242         if ((level_actuelle[x+1][y] == 0) &(x<15)){
243           level_actuelle[x+1][y] = 104;
244           level_actuelle[x][y] = 0;
245         }
246         else if (level_actuelle[x+1][y] == 3){
247           level_actuelle[x+1][y] = 104;
248           level_actuelle[x][y] = 3;
249         }
250         else if (level_actuelle[x+1][y] == 1){
251           level_actuelle[x][y] = 0;
252           //game over
253           en_partie = false;
254           vivant = false;
255         }
256       }
257     }
258   }
259 }
260 
261 void loop() {
262   while (en_partie){
263     tick();
264     affiche();
265     create_vaisseau();
266     if ((digitalRead(D7)) & (delay_tire == 0)){
267       tirer();
268       delay_tire = 2;
269     }
270     else if (delay_tire !=0){
271       delay_tire -= 1;
272     }
273     move();
274     if (!ennemi){
275       if (level == 4){
276         en_partie = false;
277 
278       }
279       else{
280         level +=1;
281       }
282 
283       if(level==2){
284         memcpy(level_actuelle,level_2,sizeof(level_2));
285       }
286       else if(level==3){
287         memcpy(level_actuelle,level_3,sizeof(level_3));
288       }
289       else if(level==4){
290         memcpy(level_actuelle,level_4,sizeof(level_4));
291       }
292     }
293     delay(75);
294   }
295   if (vivant){
296     memcpy(level_actuelle,win,sizeof(win));
297   }
298   else{
299     memcpy(level_actuelle,game_over,sizeof(game_over));
300   }
301   affiche();
302   delay(200);
303   if (digitalRead(D7)){
304       memcpy(level_actuelle,level_1,sizeof(level_1));
305       level = 1;
306       vivant = true;
307       en_partie = true;
308   }
309 }

étapes de fabrication

étape 1

Création du code arduino et test de celui-ci sur la carte. Toutes nos leds s'allument.

vignette]

étape 2

Création de la maquette en carton. Ce n'est pas la version finale, juste le prototype.

vignette] vignette]


Création de la maquette finale en bois.


vignette]

étape 3

Test du jeu.

vignette]

Troubleshouting

Difficultés rencontrées : création du code arduino
Solutions : test du code, analyse des erreurs, aide des intervenants

Sources et documentation complémentaire

ne pas modifier sous cette ligne