Semplice giochino su uno schermo 16x2

Dependencies:   TextLCD mbed

main.cpp

Committer:
Frileux
Date:
2016-12-05
Revision:
0:bdc469070965

File content as of revision 0:bdc469070965:

#include "mbed.h"
#include "TextLCD.h"


TextLCD lcd(D12, D11, D2, D8, D9, D10, TextLCD::LCD16x2);
DigitalOut Sinistra (D6);
DigitalOut Destra (D7);
SPI acc(D4,D5,D3);
DigitalOut cs(PA_15);

int p=0; //indica la posizione della nostra macchinina sulla pista
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
char buffer[6];  //buffer data e float che servono nella ricezione dati dall'accelerometro
int16_t data[3];
float x;

void PLACE(int C[16][2])  //questa funzione non fa altro che randomizzare la comparsa dei blocchi da evitare
{
    int i= rand()%2;
    C[0][i]=2;
    return;
}



void Visualizza(int C[16][2])   //Interfaccia che stampa sullo schermo la nostra matrice di gioco. Per velocizzare ho messo prima i 15 blocchi
{
    lcd.cls();                  // dopo il controllo a parte della macchina
    for(int i=0; i<15; i++) {
        for(int j=0; j<2; j++) {
            lcd.locate(i,j);
            if(C[i][j]==2)
                lcd.printf("-");
        }
    }
    for(int i=0; i<2; i++)
        if(C[15][i]==1)
            lcd.printf("<");
    return;
}

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
{
    for(int i=14; i>=0; i--) {
        if(C[i][j]==2&&C[i+1][j]==1)
            return false;
        else if(C[i-1][j]==2)
            C[i][j]=2;
        else
            C[i][j]=0;
    }
    return true;
}




void comando()  //questa è da sistemare perchè è possibile inserire il comando ogni scorrimento di blocco, verrebbe meglio con un interrupt.
{
    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.
    cs=0;
    acc.write(0x80|0x40|0x32);
    for (int i = 0; i<=5; i++) {
        buffer[i]=acc.write(0x00);
    }
    cs=1;
    data[0] = buffer[1]<<8 | buffer[0];
    x=0.004*data[0];
    if(x>0.25) {
        Destra=1;
        Sinistra=0;
        p=0;
    } else if(x<-0.25) {
        Sinistra=1;
        Destra=0;
        p=1;
    }
}

bool Excute(int C[16][2])
{
    int h=p;  // controllo per il cambio di posizione
    comando();//chiamata per vedere qual è il comando
    bool ok=true;
    if(p!=h) {
        if(p==0)
            C[15][1]=0;
        else
            C[15][0]=0;
        C[15][p]=1;
    }
    ok=scrol(C,0);
    if(ok) //se l'altra linea ha toppato qui non ci deve proprio entrare.
        ok=scrol(C,1);
    //questo ci serve per il cambio di turno
    if(t==false)
        t=true;
    else
        t=false;
    //riporta nel main la condizione di sconfitta
    if(ok==false)
        return false;
    return true;
}



int main()
{
    int C[16][2]; //Questa è la matrice su cui si svolge il gioco nel caso ci sia memorizzato:
//"1" indica la nostra macchinina
//"2" il blocco contro cui non dobbiamo andare a sbattere.
//Avrei potuto scegliere una matrice di booleani e riconoscere la nostra macchina e i blocchi a seconda della posizione sulle "x" però ho preferito
//utilizzare un int nel caso in futuro volessi aggiornare il gioco con elementi bonus.

    cs=1;
    acc.format(8,3);
    acc.frequency(2000000);
    cs=0;
    acc.write(0x31);
    acc.write(0x0B);
    cs=1;
    cs=0;
    acc.write(0x2D);
    acc.write(0x08);
    cs=1;
//comincia il gioco che va in un loop infinito
    while(true) {
        for(int i=0; i<16; i++) //ogni volta che perdi devi resettare tutte le caselle
            for(int j=0; j<2; j++)
                C[i][j]=0;
        //condizioni iniziali non sono necessarie però preferisco reimpostarle ad ogni sconfitta
        p=0;
        t=0;
        bool ok= true;  //booleana che ci serve per la condizione di sconfitta
        C[15][p]=1; //piazzamento della nostra macchinina
        while(ok) {
            if(t==true) {
                PLACE(C);  //funzione di piazzamento che avviene un ciclo si e uno no
            }
            ok=Excute(C);   //funzione che contiene lo scroll e il controllo della sconfitta
            Visualizza(C);  //funzione di visualizzazione
        }
        //se siamo usciti dal while abbiamo perso ed è bene ricordarlo allo sconfitto
        lcd.cls();
        lcd.locate(0,0);
        lcd.printf("GAME OVER");
        wait(3);
    }

}