Clemente D'Angelo
/
GiochinoASchermo
Semplice giochino su uno schermo 16x2
main.cpp@0:bdc469070965, 2016-12-05 (annotated)
- Committer:
- Frileux
- Date:
- Mon Dec 05 18:55:46 2016 +0000
- Revision:
- 0:bdc469070965
Gioco
Who changed what in which revision?
User | Revision | Line number | New 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 | } |