Jarebica Azra Čilić Zlatan Igrica Labirint

Dependencies:   MMA8451Q N5110 TSI mbed

main.cpp

Committer:
tim008
Date:
2014-06-09
Revision:
0:a24a998fcdb9

File content as of revision 0:a24a998fcdb9:

#include "mbed.h"
#include "N5110.h"
#include "MMA8451Q.h"
#include "TSISensor.h"
#include <string>

#define MMA8451_I2C_ADDRESS (0x1d<<1)

//Deklaracija akcelerometra
MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);

//Deklaracija LCD objekta
//N5110 lcd(VCC,SCE,RST,D/C,MOSI,SCLK,LED)
N5110 lcd (PTA5, PTA12, PTD4, PTA4, PTC6, PTC5, PTC8);

//Deklaracija globalnih varijabli
int staroX(10);
int staroY(10);
int novoX(10);
int novoY(10);

int duzinaPutaXPoz(0);
int duzinaPutaYPoz(0);
int duzinaPutaXNeg(0);
int duzinaPutaYNeg(0);


TSISensor tsi;
Timer sat;
bool pocetakIgre(true);
bool krajIgre(false);
bool labirint[84][48];
float brzina(0.1);

//Crtanje labirinta i punjenje matrice (obavlja se pocetku svake igre)

void postaviRupu()
{
    lcd.setXYAddress(0,0);
    lcd.setPixel(57, 24);
    lcd.setPixel(56, 24);
    lcd.setPixel(58, 24);
    lcd.setPixel(59, 24);
    lcd.setPixel(57, 25);
    lcd.setPixel(58, 25);
    lcd.setPixel(57, 23);
    lcd.setPixel(56, 23);
    lcd.setPixel(58, 23);
    lcd.setPixel(59, 23);
    lcd.setPixel(57, 22);
    lcd.setPixel(58, 22);
    
    lcd.refresh();
}

void inicijalizirajLabirint()
{
    //"Ciscenje" matrice:
    for(int i = 0; i < 84; i++)
        for(int j = 0; j < 48; j++)
            labirint[i][j] = 0;
    //Vanjske granice:
    for(int i = 0; i < 84; i++)
    {
        lcd.setPixel(i,0);
        labirint[i][0] = 1;
    }
    for(int i = 0; i < 84; i++)
    {
        lcd.setPixel(i, 47);
        labirint[i][47] = 1;
    }
    for(int i = 0; i < 48; i++)
    {
        lcd.setPixel(0, i);
        labirint[0][i] = 1;
    }
    for(int i = 0; i < 48; i++)
    {
        lcd.setPixel(83, i);
        labirint[83][i] = 1;
    }
    //Prvi unutrasnji zidovi:
    for(int i = 7; i < 77; i++)
    {
        lcd.setPixel(i,7);
        labirint[i][7] = 1;
    }
    for(int i = 7; i < 77; i++)
    {
        lcd.setPixel(i, 40);
        labirint[i][40] = 1;
    }
    for(int i = 7; i < 40; i++)
    {
        lcd.setPixel(7, i);
        labirint[7][i] = 1;
    }
    for(int i = 7; i < 40; i++)
    {
        lcd.setPixel(76, i);
        labirint[76][i] = 1;
    }
    //Prolazi za prve unutrasnje zidove:
    for(int i = 11; i < 17; i++)
    {
        lcd.clearPixel(76, i);
        labirint[76][i] = 0;
    }
    for(int i = 54; i < 60; i++)
    {
        lcd.clearPixel(i, 40);
        labirint[i][40] = 0;
    }
    //Drugi unutrasnji zidovi:
    for(int i = 14; i < 70; i++)
    {
        lcd.setPixel(i, 14);
        labirint[i][14] = 1;
    }
    for(int i = 14; i < 70; i++)
    {
        lcd.setPixel(i, 33);
        labirint[i][33] = 1;
    }
    for(int i = 14; i < 34; i++)
    {
        lcd.setPixel(14, i);
        labirint[14][i] = 1;
    }
    for(int i = 14; i < 34; i++)
    {
        lcd.setPixel(69, i);
        labirint[69][i] = 1;
    }
    //Prolazi za druge unutrasnje zidove:
    for(int i = 18; i < 25; i++)
    {
        lcd.clearPixel(i, 14);
        labirint[i][14] = 0;
    }
    for(int i = 18; i < 25; i++)
    {
        lcd.clearPixel(69, i);
        labirint[69][i] = 0;
    }
    //Spoj izmedju prvih i drugih unutrasnjih zidova:
    for(int i = 8; i < 14; i++)
    {
        lcd.setPixel(i, 24);
        labirint[i][24] = 1;
    }
    //Treci unutrasnji zidovi:
    for(int i = 21; i < 63; i++)
    {
        lcd.setPixel(i, 21);
        labirint[i][21] = 1;
    }
    for(int i = 21; i < 63; i++)
    {
        lcd.setPixel(i, 26);
        labirint[i][26] = 1;
    }
    for(int i = 21; i < 27; i++)
    {
        lcd.setPixel(21, i);
        labirint[21][i] = 1;
    }
    for(int i = 21; i < 27; i++)
    {
        lcd.setPixel(62, i);
        labirint[62][i] = 1;
    }
    //Prolaz za trece unutrasnje zidove
    for(int i = 25; i < 31; i++)
    {
        lcd.clearPixel(i, 26);
        labirint[i][26] = 0;
    }
    //Spoj izmedju drugih i trecih unutrasnjih zidova:
    for(int i = 27; i < 34; i++)
    {
        lcd.setPixel(48, i);
        labirint[48][i] = 1;
    }
    lcd.refresh();
    //Rupa:
    postaviRupu();
    
    
}
 

//Citanje vrijednosti sa akcelerometra i korigiranje koordinata sukladno ocitanjima
void kreciSe()
{
    //Citanje vrijednosti:
    float xA = acc.getAccX();
    float yA = acc.getAccY();
    //Postavljanje brzine:
    if(xA > 0.2){
    if(xA > 0.2 && xA < 0.3) brzina = 0.3;
    if(xA >= 0.3 && xA < 0.4) brzina = 0.1;
    if(xA >= 0.4 && xA < 0.5) brzina = 0.05;
    if(xA >= 0.5 && xA < 0.7) brzina = 0.01;
    if(xA >= 0.7) brzina = 0.01;}
    else if(yA > 0.2){    
    if(yA > 0.2 && yA < 0.3) brzina = 0.3;
    if(yA >= 0.3 && yA < 0.4) brzina = 0.1;
    if(yA >= 0.4 && yA < 0.5) brzina = 0.05;
    if(yA >= 0.5 && yA < 0.7) brzina = 0.01;
    if(yA >= 0.7) brzina = 0.01;}
    else if(xA < -0.2){
    if(xA <-0.2 && xA >-0.3) brzina = 0.3;
    if(xA <= -0.3 && xA > -0.4) brzina = 0.1;
    if(xA <= -0.4 && xA > -0.5) brzina = 0.05;
    if(xA <= -0.5 && xA > -0.7) brzina = 0.01;
    if(xA <= -0.7) brzina = 0.01;}
    else if(yA < -0.2){
    if(yA <-0.2 && yA >-0.3) brzina = 0.3;
    if(yA <= -0.3 && yA > -0.4) brzina = 0.1;
    if(yA <= -0.4 && yA > -0.5) brzina = 0.05;
    if(yA <= -0.5 && yA > -0.7) brzina = 0.01;
    if(yA <= -0.7) brzina = 0.01;}
    
    
    
    //Transfer koordinata
    staroX = novoX;
    staroY = novoY;
    
    if(xA < -0.2 && labirint[novoX + 2][novoY + 1] == 0 && labirint[novoX + 3][novoY] == 0
                && labirint[novoX + 3][novoY - 1] == 0 && labirint[novoX + 2][novoY  - 2] == 0)
        { 
            novoX++;
        }
    if(xA > 0.2 && labirint[novoX - 1][novoY + 1] == 0 && labirint[novoX - 2][novoY] == 0
                && labirint[novoX - 2][novoY - 1] == 0 && labirint[novoX - 1][novoY - 2] == 0)
        novoX--;
    if(yA > 0.2 && labirint[novoX - 1][novoY + 1] == 0 && labirint[novoX][novoY + 2] == 0
                && labirint[novoX + 1][novoY + 2] == 0 && labirint[novoX + 2][novoY + 1] == 0)
        novoY++;
    if(yA < -0.2 && labirint[novoX - 1][novoY - 2] == 0 && labirint[novoX][novoY - 3] == 0
                && labirint[novoX + 1][novoY - 3] == 0 && labirint[novoX + 2][novoY - 2] == 0)
        novoY--;
    
    
}

//Prebacivanje pozicije loptice prema ocitanim vrijednostima u kreciSe()
void obnovi()
{
    //Brisanje stare pozicije:
    lcd.setXYAddress(0,0);
    lcd.clearPixel(staroX - 1, staroY);
    lcd.clearPixel(staroX - 1, staroY - 1);
    lcd.clearPixel(staroX, staroY + 1);
    lcd.clearPixel(staroX, staroY);
    lcd.clearPixel(staroX, staroY - 1);
    lcd.clearPixel(staroX, staroY - 2);
    lcd.clearPixel(staroX + 1, staroY + 1);
    lcd.clearPixel(staroX + 1, staroY);
    lcd.clearPixel(staroX + 1, staroY - 1);
    lcd.clearPixel(staroX + 1, staroY - 2);
    lcd.clearPixel(staroX + 2, staroY);
    lcd.clearPixel(staroX + 2, staroY - 1);
    lcd.refresh();
    //Postavljanje nove pozicije:
    lcd.setXYAddress(0,0);
    lcd.setPixel(novoX - 1, novoY);
    lcd.setPixel(novoX - 1, novoY - 1);
    lcd.setPixel(novoX, novoY + 1);
    lcd.setPixel(novoX, novoY);
    lcd.setPixel(novoX, novoY - 1);
    lcd.setPixel(novoX, novoY - 2);
    lcd.setPixel(novoX + 1, novoY + 1);
    lcd.setPixel(novoX + 1, novoY);
    lcd.setPixel(novoX + 1, novoY - 1);
    lcd.setPixel(novoX + 1, novoY - 2);
    lcd.setPixel(novoX + 2, novoY);
    lcd.setPixel(novoX + 2, novoY - 1);
    lcd.refresh();

    postaviRupu();
    
    if(novoX == 57 && novoY == 24)
        krajIgre = true;
}

//Kraj igre; cisti ekran, ispisuje poruku, vrijeme i uputsvo za pokretanje nove igre
void zavrsiIgru()
{
    sat.stop();
    int sekunde = sat.read();
    int minute = 0;
    while(sekunde > 60)
    {
        sekunde -= 60;
        minute++;
    }
    char ispisVremena[5];
    int desetice = minute / 10;
    int jedinice = minute % 10;
    char m1 = desetice + '0';
    char m2 = jedinice + '0';
    ispisVremena[0] = m1;
    ispisVremena[1] = m2;
    ispisVremena[2] = ':';
    desetice = sekunde / 10;
    jedinice = sekunde % 10;
    m1 = desetice + '0';
    m2 = jedinice + '0';
    ispisVremena[3] = m1;
    ispisVremena[4] = m2;
    
    lcd.clear();
    lcd.setXYAddress(0,0);
    lcd.printString("BRAVO!!!", 0,0);
    lcd.printString("Vase vrijeme:", 0,1);
    lcd.printString(ispisVremena, 0, 2);
    lcd.printString("Dodirnite TSI", 0, 3);
    lcd.printString("za novu igru!", 0, 4);
    lcd.refresh();
    
    float procenat = 0;
    while(1)
    {
         procenat = tsi.readPercentage();
         if(procenat > 0.8)
         {
             lcd.clear();
             lcd.refresh();
             break;
         }
    }
}


int main()
{
    lcd.init();
    inicijalizirajLabirint();
    while(1)
    {
        if(pocetakIgre)
        {
            sat.reset();
            sat.start();
            lcd.setXYAddress(0,0);
            inicijalizirajLabirint();
            novoX = staroX = 2;
            novoY = staroY = 3;
            pocetakIgre = false;
        }
        kreciSe();
        obnovi();

        if(krajIgre)
        {
            zavrsiIgru();
            krajIgre = false;
            pocetakIgre = true;
        }
        wait(brzina);
    }
}
//686