Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <SPI.h>
- #include "Ucglib.h"
- /*
- Hardware SPI Pins:
- Arduino Uno sclk=13, data=11
- Arduino Due sclk=76, data=75
- Arduino Mega sclk=52, data=51
- */
- /*
- */
- Ucglib_ST7735_18x128x160_HWSPI ucg(/*cd=*/ 9, /*cs=*/ 10, /*reset=*/ 8);
- //Ucglib_ST7735_18x128x160_SWSPI ucg(/*sclk=*/ 13, /*data=*/ 11, /*cd=*/ 9, /*cs=*/ 10, /*reset=*/ 8);
- byte taille_brique=8; //unité de taille des éléments
- bool briques[16*7]={ 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0, //Barre
- 0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0, //carré
- 0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0, //2
- 0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0, //5
- 0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0, //L
- 0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0, //-L
- 0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0 //T
- };
- //valeur du score :
- //pas de ligne +2
- //1 ligne +10
- //2 lignes +20
- //3 lignes +50
- //4 lignes +100
- byte bonus[]={2,10,20,50,100};
- // nombre de points a atteindre pour franchir un niveau
- // 9 8 7 6 5 4 3 2 1
- int niveaux[]={3600,2800,2100,1500,1000,600,300,100,0};//finish à 5000
- byte grille_reelle[10*20]; //c'est la grille telle qu'affichée à l'écran
- int score=0;
- byte piece_actuelle[16]; //tableau dans lequel est stocké la pièce en cours
- byte etat=0; //code les différentes étapes du jeu 0:accueil, 1:jeu, 2:game_over
- short position_piece[2]={0,0}; //la position de la pièce sur la grille. -2<=x<=12 et -4<=y<=18, selon la forme de la pièce
- byte num_prochaine=10; //un numéro supérieur à 8 indique que la pièce n'a pas été définie
- byte num_actuelle=10;
- short gauche=A2;
- short droite=A1;
- short bas=A3;
- short tourne=A4;
- byte couleurs[3*7]={ 200,0,0, //rouge
- 0,200,0, //vert
- 0,0,200, //bleu
- 150,150,0, //jaune
- 100,100,100, //gris
- 150,0,200, //violet
- 200,100,0 //orange
- };
- void setup(void)
- {
- delay(1000);
- ucg.begin(UCG_FONT_MODE_TRANSPARENT);
- ucg.setRotate180();
- background();
- raz();
- choix_piece();
- pinMode(A0,INPUT);
- randomSeed(analogRead(0));
- pinMode(gauche,INPUT_PULLUP);
- pinMode(droite,INPUT_PULLUP);
- pinMode(bas,INPUT_PULLUP);
- pinMode(tourne,INPUT_PULLUP);
- Serial.begin(9600);
- }
- void loop(void)
- {
- switch (etat){
- case 0:
- background();
- accueil();
- while(digitalRead(tourne)){delay(200);} // on reste sur l'écran d'accueil tant qu'on n'appuie pas de nouveau sur tourne
- etat=1;
- break;
- case 1:
- game();
- break;
- case 2:
- game_over();
- while(digitalRead(tourne)){delay(200);} // on reste sur l'écran game over tant qu'on n'appuie pas de nouveau sur tourne
- etat=0;
- break;
- }
- }
- void game(){
- bool perdu=false;
- while(!perdu){
- //mise à jour du score et du level
- byte niveau=0;
- while(score<niveaux[niveau]){
- niveau++;
- }
- niveau=9-niveau;
- ucg.setColor(150,200,200);
- ucg.drawBox(11*taille_brique,4*taille_brique,4*taille_brique,2*taille_brique);
- ucg.drawBox(11*taille_brique,9*taille_brique,4*taille_brique,2*taille_brique);
- ucg.setFontPosTop();
- ucg.setFont(ucg_font_helvB08_hr);
- ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
- ucg.setColor(80, 80, 80); // black color for the text
- ucg.setPrintPos(11*taille_brique+2,4*taille_brique+2);
- ucg.print(score);
- ucg.setPrintPos(11*taille_brique+2,9*taille_brique+2);
- ucg.print(niveau);
- //on redessine la grille
- redessine_grille();
- bool passe=true;
- choix_piece();
- position_piece[0]=0;
- position_piece[1]=-4;
- while(passe){
- for(byte i=0;i<5;i++){
- short move_x=0;
- short move_y=0;
- //On regarde si un bouton est pressé
- if(!digitalRead(gauche)) {
- move_x=-1;
- //Serial.println(move_x);
- }
- else if(!digitalRead(droite)) {
- move_x=1;
- //Serial.println(move_x);
- }
- else if(!digitalRead(tourne)) {
- eff_piece_jeu(position_piece[0],position_piece[1]);
- rotation();
- dessine_piece_jeu(position_piece[0],position_piece[1]);
- //Serial.println("rotation");
- }
- else if(!digitalRead(bas)) {
- move_y=1;
- //Serial.println(move_y);
- }
- if((move_x!=0 || move_y!=0) && translation(move_x,move_y)){
- eff_piece_jeu(position_piece[0],position_piece[1]);
- position_piece[0]+=move_x;
- position_piece[1]+=move_y;
- dessine_piece_jeu(position_piece[0],position_piece[1]);
- }
- delay(100-10*niveau);
- }
- //si la pièce peut avancer alors elle avance
- if(translation(0,1)){
- eff_piece_jeu(position_piece[0],position_piece[1]);
- position_piece[1]++;
- dessine_piece_jeu(position_piece[0],position_piece[1]);
- }
- //si elle ne peut pas avancer mais qu'elle n'est pas à sa position intiale
- else if(position_piece[1]>0) {
- //on commence par coller la pièce dans la grille
- for(byte i=0;i<16;i++){
- if(piece_actuelle[i]){grille_reelle[position_piece[0]+i%4+10*(position_piece[1]+i/4)]=num_actuelle;}
- }
- //on regarde ensuite si la ligne est complète
- byte nb_lignes=0; //Nombre de lignes faites
- for(byte i=0;i<20;i++){
- bool ligne_complete=true;
- for(byte j=0;j<10;j++){
- //Une case vide a une valeur de 10, donc si on trouve
- //la valeur 10 dans la ligne, on sait qu'elle n'est
- //pas remplie
- if(grille_reelle[10*i+j]==10) ligne_complete=false;
- }
- if (ligne_complete){ //si la ligne est complète
- // on incrémente nb_lignes
- nb_lignes++;
- // on déplace les lignes au-dessus que l'on colle
- for (byte k=0;k<10*(i+1);k++){
- //on vide la ligne du haut
- if(10*i+9-k<10) {grille_reelle[10*i+9-k]=10;}
- //on remplace la valeur des lignes par celles de
- //la ligne au-dessus
- else {grille_reelle[10*i+9-k]=grille_reelle[10*i+9-k-10];}
- }
- }
- }
- // le score s'incrémente de 3^(nb_lignes+1)
- score += bonus[nb_lignes];
- passe=false;
- }
- else perdu=true;
- }
- }
- etat=2;// c'est le game over
- }
- //assigne comme pièce actuelle la pièce précédémment annoncée
- //définit la "nouvelle" future pièce
- //et se relance si la pièce actuelle n'est pas encore définie (ie : au départ)
- void choix_piece(){
- num_actuelle=num_prochaine;
- for(byte i=0;i<16;i++){
- piece_actuelle[i]=briques[16*num_actuelle+i];
- }
- num_prochaine=random(7);
- dessine_piece_prochaine(11,15);
- if(num_actuelle>8)choix_piece();
- }
- //va tester la possibilité de faire tourner la pièce
- //càd vérifier qu'il n'y a pas de collision avec le bord ou une pièce déjà placée
- void rotation(){
- byte piece_test[16]; //tableau temporaire servant à vérifier qu'on peut faire tourner la pièce
- for(byte i=0;i<16;i++){
- piece_test[4*(i/4)+i%4]=piece_actuelle[(i%4)*4+3-i/4]; //On colle la pièce actuelle en tournant de 90° dans la pièce test
- }
- //on vérifie maintenant qu'il n'y a pas de problème avec la pièce test
- //càd qu'aucune partie ne se superpose à une pièce déjà présente sur la grille
- //et qu'aucune partie ne se retrouve à l'extérieur de la grille mise à part
- //l'extrêmité supérieure
- bool collision=0;
- for(byte i=0;i<16;i++){
- //on vérifie d'abord qu'une partie de la pièce n'est pas à l'extérieur de la grille
- if((position_piece[0]+i%4<0 ||position_piece[0]+i%4>9||position_piece[1]+i/4>19) && piece_test[i]!=0) collision=true;
- //on vérifie ensuite qu'avec la rotation, une partie de la pièce n'entre pas en collision avec une pièce présente sur la grille
- else if ((grille_reelle[10*(position_piece[1]+4*i/4)+position_piece[0]+i%4]!=10)&& piece_test[i]!=0) collision=true;
- }
- if(true){ //s'il n'y a pas de problème alors la rotation est validée en envoyant le résultat de la rotation
- // dans la pièce actuelle.
- for(int i=0;i<16;i++){
- piece_actuelle[i]=piece_test[i];
- }
- }
- }
- //va tester la possibilité de déplacer la pièce
- //retourne "true" si cela est possible, "false" dans le cas contraire
- bool translation(short delta_x,short delta_y){
- bool collision=0;
- for(byte i=0;i<16;i++){
- //on vérifie d'abord qu'une partie de la pièce n'est pas à l'extérieur de la grille
- if((position_piece[0]+i%4+delta_x<0 ||position_piece[0]+i%4+delta_x>9||position_piece[1]+i/4+delta_y>19) && piece_actuelle[i]!=0) collision=true;
- //on vérifie ensuite qu'avec le déplacement, une partie de la pièce n'entre pas en collision avec une pièce présente sur la grille
- else if ((grille_reelle[10*(position_piece[1]+i/4+delta_y)+position_piece[0]+i%4+delta_x]!=10)&& piece_actuelle[i]!=0 && (position_piece[1]+i/4+delta_y)>0) collision=true;
- }
- if(!collision){return true;}
- else return false;
- }
- void redessine_grille(){//redessine la grille en fonction des valeurs de ses cases
- for (byte i=0;i<200;i++){
- if(grille_reelle[i]!=10){
- ucg.setColor(couleurs[3*grille_reelle[i]],couleurs[3*grille_reelle[i]+1],couleurs[3*grille_reelle[i]+2]);
- }
- else ucg.setColor(200,255,255);
- ucg.drawBox(8*(i%10),8*(i/10),8,8);
- }
- }
- void raz(){
- position_piece[0]=0;
- position_piece[1]=-4;
- for(byte i=0;i<200;i++){
- grille_reelle[i]=10; //une case vaut 10 si elle est vide et entre 0 et 7 si elle est pleine, ce nombre définit sa couleur
- }
- for(byte i=0;i<16;i++){
- piece_actuelle[i]=0;
- }
- num_prochaine=10;
- num_actuelle=10;
- score=0;
- }
- void dessine_piece_prochaine(short posx, short posy){
- for(byte i=0;i<16;i++){
- if(briques[16*num_prochaine+i]){
- ucg.setColor(couleurs[3*num_prochaine],couleurs[3*num_prochaine+1],couleurs[3*num_prochaine+2]);
- ucg.drawBox(8*(posx+(i%4)),8*(posy+(i/4)),8,8);
- }
- else{
- ucg.setColor(150,200,200);
- ucg.drawBox(8*(posx+(i%4)),8*(posy+(i/4)),8,8);
- }
- }
- }
- void dessine_piece_jeu(short posx, short posy){ //dessine une pièce dans la grille de jeu
- for(byte i=0;i<16;i++){
- if(piece_actuelle[i]){
- ucg.setColor(couleurs[3*num_actuelle],couleurs[3*num_actuelle+1],couleurs[3*num_actuelle+2]);
- ucg.drawBox(8*(posx+(i%4)),8*(posy+(i/4)),8,8);
- }
- }
- }
- void eff_piece_jeu(short posx, short posy){
- for(byte i=0;i<16;i++){
- if(piece_actuelle[i]){
- ucg.setColor(200,255,255);
- ucg.drawBox(8*(posx+(i%4)),8*(posy+(i/4)),8,8);
- }
- }
- }
- void dessine_brique(short posx, short posy){ //dessine une brique du décors
- byte brique[] = {80,80,80,80,80,200,188,80,80,188,128,80,80,80,80,80};
- for(byte i=0;i<16;i++){
- ucg.setColor(brique[i],brique[i],brique[i]);
- ucg.drawBox(posx+2*(i%4),posy+2*(i/4),2,2);
- }
- }
- void background(){
- //zone de jeu
- ucg.setColor(200,255,255);
- ucg.drawBox(0,0,10*taille_brique,20*taille_brique);
- //les briques
- for(byte j=0;j<6;j++){
- for(byte i=0;i<20;i++){
- dessine_brique(80+taille_brique*j,taille_brique*i);
- }
- }
- //les fenêtres d'affichage
- ucg.setColor(150,200,200);
- ucg.drawBox(11*taille_brique,2*taille_brique,4*taille_brique,4*taille_brique);
- ucg.drawBox(11*taille_brique,7*taille_brique,4*taille_brique,4*taille_brique);
- ucg.drawBox(11*taille_brique,12*taille_brique,4*taille_brique,2*taille_brique);
- ucg.drawBox(11*taille_brique,15*taille_brique,4*taille_brique,4*taille_brique);
- //le texte dans les fenêtres
- ucg.setFontPosTop();
- ucg.setFont(ucg_font_helvB08_hr);
- ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
- ucg.setColor(80, 80, 80); // black color for the text
- ucg.setPrintPos(11*taille_brique+2,2*taille_brique+2);
- ucg.print("Score");
- ucg.setPrintPos(11*taille_brique+2,7*taille_brique+2);
- ucg.print("Level");
- ucg.setPrintPos(11*taille_brique+2,12*taille_brique+2);
- ucg.print("NEXT");
- }
- void game_over(){
- //zone de jeu
- ucg.setColor(200,255,255);
- ucg.drawBox(0,0,10*taille_brique,20*taille_brique);
- //le texte dans les fenêtres
- ucg.setFontPosTop();
- ucg.setFont(ucg_font_helvB08_hr);
- ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
- ucg.setColor(80, 80, 80); // black color for the text
- ucg.setPrintPos(3*taille_brique+2,7*taille_brique+2);
- ucg.print("Game");
- ucg.setPrintPos(3*taille_brique+2,8*taille_brique+2);
- ucg.print("Over");
- }
- void accueil(){
- //zone de jeu
- ucg.setColor(200,255,255);
- ucg.drawBox(0,0,10*taille_brique,20*taille_brique);
- //le texte dans les fenêtres
- ucg.setFontPosTop();
- ucg.setFont(ucg_font_helvB08_hr);
- ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT);
- ucg.setColor(80, 80, 80); // black color for the text
- ucg.setPrintPos(3*taille_brique+2,7*taille_brique+2);
- ucg.print("Push");
- ucg.setPrintPos(3*taille_brique+2,8*taille_brique+2);
- ucg.print("Start");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement