Bonjour à tous
Je travaille actuellement sur un projet qui consiste en la création du jeu SNAKE.
Pour créer ce jeu, j'ai à ma disposition les éléments suivants:
- une arduino nano
- un multiplexeur MAX7219
- une matrice LED 8x8 1588BS
- un joystick
J'ai commencé à éditer un code qui sait afficher une LED aléatoirement sur la matrice.
Je cherche dans un premier temps à faire déplacer cette LED à l'aide d'un joystick. Pour cela, j'ai compris qu'il fallait que j'utilise des pointeurs.
Malgré le visionnage de plusieurs tutoriels sur ceux-ci, je n'y arrive toujours pas
Pourriez-vous m'aider s'il vous plait??
Voici le code en question:
int DIN_pin = 11;
int CS_pin = 13;
int CLK_pin = 10;
int BP7 = 7; // Bouton-poussoir en broche 7
int axeX = A2; // signal de l'axe X sur entrée A2
int axeY = A3; // signal de l'axe Y sur entrée A3
int x = 4; //adresse serpent
int y = 4; //colonne serpent
//données des lignes du tableau 8x8
int clean[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};//création du tableau clean qui met toutes les LED à zéro
int pomme[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
int serpent[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
//----------------------------------------------------------------------------------------*/
//-----------------------COMMUNICATION AVEC MATRICE---------------------------------------*/
//----------------------------------------------------------------------------------------*/
void write_pix(int data) { //data = hexadécimal à envoyer sur une ligne
digitalWrite(CS_pin,LOW); //car data envoyée sur front montant de CS_pin donc éteint le pin CSpendant l'envoie des bits
for (int i=0 ; i<8 ; i++) { //boucle allant de 0 à 8 permettant d'envoyer chaque bit de l'hexadécimal
digitalWrite(CLK_pin,LOW);
//digitalWrite(DIN_pin,data); //permet d'envoyer les données à DIN_pin
digitalWrite(DIN_pin, data & 0x80);//data * 1000 0000
data = data << 1; //décalage des bits vers la gauche
digitalWrite(CLK_pin,HIGH);//prendre bit à bit les valeurs de l'hexadécimal, permet d'allumer les LED
Serial.println(data);
}
}
void write_line(int address, int data){
digitalWrite(CS_pin,LOW);//car data envoyée sur front montant de CS_pin
write_pix(address);//sur quelle adresse(ligne)on veut entrer la donnée
write_pix(data);//envoyer la donnée
digitalWrite(CS_pin,HIGH);
}
void write_matrix(int *tab) { // fonction qui se sert write_line pour compléter les lignes de la matrice
for (int i=0 ; i<8 ; i++) write_line(i+1, tab[i]); //boucle jusqu'à 8 pour remplir chaque ligne
}
//--------------------------------------------------------------------------------------*/
//--------------------------------------------------------------------------------------*/
void init_MAX7219(){ //fonction permettant d'initialiser la matrice d'après la datasheet en envoyant des nombres spéciaux en hexa sur cetaines adresses
//write_line(0x09, 0x00); //decode mode
write_line(0x0A, 0x01); //luminosité
write_line(0x0B, 0x07); //scan limit
write_line(0x0C, 0x01); //shutdown
write_line(0x0F, 0x00); //test display
}
void setup() {
//initialisation des pins
pinMode(CS_pin,OUTPUT);
pinMode(DIN_pin,OUTPUT);
pinMode(CLK_pin,OUTPUT);
delay(50);//attente de 50ms
init_MAX7219();//initialisation de la matrice et du multiplexeur
pinMode (BP7, INPUT); // définition de BP7 comme une entrée
digitalWrite(BP7, HIGH); //Résistance déjà intégrée au module du joystick
pinMode (axeX, INPUT); // définition de A2 comme une entrée
pinMode (axeY, INPUT); // définition de A3 comme une entrée
}
//void pomme_aleatoire() {
// int Bouton;
// Bouton = digitalRead (BP7);
// if (Bouton==0){
// pomme[random(8)]= 1 << random(8);
// write_matrix(pomme);
// for (int i=0 ; i<8 ; i++){
// pomme[i]=clean[i];
// delay(30);
// }
// }
//}
void start_snake() {
int Bouton;
Bouton = digitalRead (BP7);
if (Bouton==0){
serpent[x]= 1 <<y;
write_matrix(serpent);
}
}
void deplacer_snake(){
int X, Y;
X = analogRead (axeX);
Y = analogRead (axeY);
// int *pointeurSurx = &x;
// int *pointeurSury = &y;
if (X>=900){//Si joystick vers la droite
serpent[x]=1<<y-1;
write_matrix(serpent);
delay(500);//temps d'affichage
}
if(Y>=900){//Si joystick vers le bas
serpent[x+1]=1<<y;
write_matrix(serpent);
delay(500);//temps d'affichage
}
if (Y<=100){//Si joystick vers le haut
serpent[x-1]=1<<y;
write_matrix(serpent);
delay(500);
}
if (X<=100){//Si joystick vers la gauche
serpent[x]=1<<y+1;
write_matrix(serpent);
delay(500);
}
for (int i=0 ; i<8 ; i++){
serpent[i]=clean[i];
delay(30);
}
}
void loop(){
start_snake();
deplacer_snake();
}