Semplice giochino su uno schermo 16x2

Dependencies:   TextLCD mbed

Committer:
Frileux
Date:
Mon Dec 05 18:55:46 2016 +0000
Revision:
0:bdc469070965
Gioco

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Frileux 0:bdc469070965 1 #include "mbed.h"
Frileux 0:bdc469070965 2 #include "TextLCD.h"
Frileux 0:bdc469070965 3
Frileux 0:bdc469070965 4
Frileux 0:bdc469070965 5 TextLCD lcd(D12, D11, D2, D8, D9, D10, TextLCD::LCD16x2);
Frileux 0:bdc469070965 6 DigitalOut Sinistra (D6);
Frileux 0:bdc469070965 7 DigitalOut Destra (D7);
Frileux 0:bdc469070965 8 SPI acc(D4,D5,D3);
Frileux 0:bdc469070965 9 DigitalOut cs(PA_15);
Frileux 0:bdc469070965 10
Frileux 0:bdc469070965 11 int p=0; //indica la posizione della nostra macchinina sulla pista
Frileux 0:bdc469070965 12 bool t=false; // poichè usiamo due linee abbiamo la necessità di inserire un blocco da evitare una volta si e una no questa variabile ci serve a questo
Frileux 0:bdc469070965 13 char buffer[6]; //buffer data e float che servono nella ricezione dati dall'accelerometro
Frileux 0:bdc469070965 14 int16_t data[3];
Frileux 0:bdc469070965 15 float x;
Frileux 0:bdc469070965 16
Frileux 0:bdc469070965 17 void PLACE(int C[16][2]) //questa funzione non fa altro che randomizzare la comparsa dei blocchi da evitare
Frileux 0:bdc469070965 18 {
Frileux 0:bdc469070965 19 int i= rand()%2;
Frileux 0:bdc469070965 20 C[0][i]=2;
Frileux 0:bdc469070965 21 return;
Frileux 0:bdc469070965 22 }
Frileux 0:bdc469070965 23
Frileux 0:bdc469070965 24
Frileux 0:bdc469070965 25
Frileux 0:bdc469070965 26 void Visualizza(int C[16][2]) //Interfaccia che stampa sullo schermo la nostra matrice di gioco. Per velocizzare ho messo prima i 15 blocchi
Frileux 0:bdc469070965 27 {
Frileux 0:bdc469070965 28 lcd.cls(); // dopo il controllo a parte della macchina
Frileux 0:bdc469070965 29 for(int i=0; i<15; i++) {
Frileux 0:bdc469070965 30 for(int j=0; j<2; j++) {
Frileux 0:bdc469070965 31 lcd.locate(i,j);
Frileux 0:bdc469070965 32 if(C[i][j]==2)
Frileux 0:bdc469070965 33 lcd.printf("-");
Frileux 0:bdc469070965 34 }
Frileux 0:bdc469070965 35 }
Frileux 0:bdc469070965 36 for(int i=0; i<2; i++)
Frileux 0:bdc469070965 37 if(C[15][i]==1)
Frileux 0:bdc469070965 38 lcd.printf("<");
Frileux 0:bdc469070965 39 return;
Frileux 0:bdc469070965 40 }
Frileux 0:bdc469070965 41
Frileux 0:bdc469070965 42 bool scrol(int C[16][2],int j) //questa funzione ci permette di fare uno scroll di tutti i blocchi e un controllo sulla sconfitta
Frileux 0:bdc469070965 43 {
Frileux 0:bdc469070965 44 for(int i=14; i>=0; i--) {
Frileux 0:bdc469070965 45 if(C[i][j]==2&&C[i+1][j]==1)
Frileux 0:bdc469070965 46 return false;
Frileux 0:bdc469070965 47 else if(C[i-1][j]==2)
Frileux 0:bdc469070965 48 C[i][j]=2;
Frileux 0:bdc469070965 49 else
Frileux 0:bdc469070965 50 C[i][j]=0;
Frileux 0:bdc469070965 51 }
Frileux 0:bdc469070965 52 return true;
Frileux 0:bdc469070965 53 }
Frileux 0:bdc469070965 54
Frileux 0:bdc469070965 55
Frileux 0:bdc469070965 56
Frileux 0:bdc469070965 57
Frileux 0:bdc469070965 58 void comando() //questa è da sistemare perchè è possibile inserire il comando ogni scorrimento di blocco, verrebbe meglio con un interrupt.
Frileux 0:bdc469070965 59 {
Frileux 0:bdc469070965 60 wait(0.5); //Questo è il tempo che regola tutto il gioco, sarebbe carino inserire un potenziomentro esterno tramite il quale appunto velocizzare o diminuire il tutto.
Frileux 0:bdc469070965 61 cs=0;
Frileux 0:bdc469070965 62 acc.write(0x80|0x40|0x32);
Frileux 0:bdc469070965 63 for (int i = 0; i<=5; i++) {
Frileux 0:bdc469070965 64 buffer[i]=acc.write(0x00);
Frileux 0:bdc469070965 65 }
Frileux 0:bdc469070965 66 cs=1;
Frileux 0:bdc469070965 67 data[0] = buffer[1]<<8 | buffer[0];
Frileux 0:bdc469070965 68 x=0.004*data[0];
Frileux 0:bdc469070965 69 if(x>0.25) {
Frileux 0:bdc469070965 70 Destra=1;
Frileux 0:bdc469070965 71 Sinistra=0;
Frileux 0:bdc469070965 72 p=0;
Frileux 0:bdc469070965 73 } else if(x<-0.25) {
Frileux 0:bdc469070965 74 Sinistra=1;
Frileux 0:bdc469070965 75 Destra=0;
Frileux 0:bdc469070965 76 p=1;
Frileux 0:bdc469070965 77 }
Frileux 0:bdc469070965 78 }
Frileux 0:bdc469070965 79
Frileux 0:bdc469070965 80 bool Excute(int C[16][2])
Frileux 0:bdc469070965 81 {
Frileux 0:bdc469070965 82 int h=p; // controllo per il cambio di posizione
Frileux 0:bdc469070965 83 comando();//chiamata per vedere qual è il comando
Frileux 0:bdc469070965 84 bool ok=true;
Frileux 0:bdc469070965 85 if(p!=h) {
Frileux 0:bdc469070965 86 if(p==0)
Frileux 0:bdc469070965 87 C[15][1]=0;
Frileux 0:bdc469070965 88 else
Frileux 0:bdc469070965 89 C[15][0]=0;
Frileux 0:bdc469070965 90 C[15][p]=1;
Frileux 0:bdc469070965 91 }
Frileux 0:bdc469070965 92 ok=scrol(C,0);
Frileux 0:bdc469070965 93 if(ok) //se l'altra linea ha toppato qui non ci deve proprio entrare.
Frileux 0:bdc469070965 94 ok=scrol(C,1);
Frileux 0:bdc469070965 95 //questo ci serve per il cambio di turno
Frileux 0:bdc469070965 96 if(t==false)
Frileux 0:bdc469070965 97 t=true;
Frileux 0:bdc469070965 98 else
Frileux 0:bdc469070965 99 t=false;
Frileux 0:bdc469070965 100 //riporta nel main la condizione di sconfitta
Frileux 0:bdc469070965 101 if(ok==false)
Frileux 0:bdc469070965 102 return false;
Frileux 0:bdc469070965 103 return true;
Frileux 0:bdc469070965 104 }
Frileux 0:bdc469070965 105
Frileux 0:bdc469070965 106
Frileux 0:bdc469070965 107
Frileux 0:bdc469070965 108 int main()
Frileux 0:bdc469070965 109 {
Frileux 0:bdc469070965 110 int C[16][2]; //Questa è la matrice su cui si svolge il gioco nel caso ci sia memorizzato:
Frileux 0:bdc469070965 111 //"1" indica la nostra macchinina
Frileux 0:bdc469070965 112 //"2" il blocco contro cui non dobbiamo andare a sbattere.
Frileux 0:bdc469070965 113 //Avrei potuto scegliere una matrice di booleani e riconoscere la nostra macchina e i blocchi a seconda della posizione sulle "x" però ho preferito
Frileux 0:bdc469070965 114 //utilizzare un int nel caso in futuro volessi aggiornare il gioco con elementi bonus.
Frileux 0:bdc469070965 115
Frileux 0:bdc469070965 116 cs=1;
Frileux 0:bdc469070965 117 acc.format(8,3);
Frileux 0:bdc469070965 118 acc.frequency(2000000);
Frileux 0:bdc469070965 119 cs=0;
Frileux 0:bdc469070965 120 acc.write(0x31);
Frileux 0:bdc469070965 121 acc.write(0x0B);
Frileux 0:bdc469070965 122 cs=1;
Frileux 0:bdc469070965 123 cs=0;
Frileux 0:bdc469070965 124 acc.write(0x2D);
Frileux 0:bdc469070965 125 acc.write(0x08);
Frileux 0:bdc469070965 126 cs=1;
Frileux 0:bdc469070965 127 //comincia il gioco che va in un loop infinito
Frileux 0:bdc469070965 128 while(true) {
Frileux 0:bdc469070965 129 for(int i=0; i<16; i++) //ogni volta che perdi devi resettare tutte le caselle
Frileux 0:bdc469070965 130 for(int j=0; j<2; j++)
Frileux 0:bdc469070965 131 C[i][j]=0;
Frileux 0:bdc469070965 132 //condizioni iniziali non sono necessarie però preferisco reimpostarle ad ogni sconfitta
Frileux 0:bdc469070965 133 p=0;
Frileux 0:bdc469070965 134 t=0;
Frileux 0:bdc469070965 135 bool ok= true; //booleana che ci serve per la condizione di sconfitta
Frileux 0:bdc469070965 136 C[15][p]=1; //piazzamento della nostra macchinina
Frileux 0:bdc469070965 137 while(ok) {
Frileux 0:bdc469070965 138 if(t==true) {
Frileux 0:bdc469070965 139 PLACE(C); //funzione di piazzamento che avviene un ciclo si e uno no
Frileux 0:bdc469070965 140 }
Frileux 0:bdc469070965 141 ok=Excute(C); //funzione che contiene lo scroll e il controllo della sconfitta
Frileux 0:bdc469070965 142 Visualizza(C); //funzione di visualizzazione
Frileux 0:bdc469070965 143 }
Frileux 0:bdc469070965 144 //se siamo usciti dal while abbiamo perso ed è bene ricordarlo allo sconfitto
Frileux 0:bdc469070965 145 lcd.cls();
Frileux 0:bdc469070965 146 lcd.locate(0,0);
Frileux 0:bdc469070965 147 lcd.printf("GAME OVER");
Frileux 0:bdc469070965 148 wait(3);
Frileux 0:bdc469070965 149 }
Frileux 0:bdc469070965 150
Frileux 0:bdc469070965 151 }