TVZ2018 / Mbed 2 deprecated Dosadna_Igra

Dependencies:   mbed TextLCD

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "TextLCD.h"
00003 #include "spremanje.h"
00004 
00005 
00006 TextLCD lcd(p19, p20, p21, p22, p23, p24); //rs,e,d0,d1,d2,d3 Definiranje lcd pinova
00007 
00008 ////////////////////////////////////////////////////////////////////////////////////////
00009 ////////////////////////// Definiranje custom charactera////////////////////////////////
00010 ////////////////////////////////////////////////////////////////////////////////////////
00011 char custom_char[4][8] = {
00012     {0x0C,0x0C,0x00,0x0E,0x1C,0x0C,0x1A,0x13},      // čovječuljak trk 1
00013     {0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x0C,0x0E},      // čovječuljak trk 2
00014     {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},      // prazan char
00015     {0x00,0x01,0x02,0x7C,0x81,0x7C,0x02,0x01}       // neprijatelj
00016          
00017 };
00018  
00019  
00020 ////////////////////////////////////////////////////////////////////////////////////////
00021 ///////////////////////////// Definiranje varijabli, I/O////////////////////////////////
00022 ////////////////////////////////////////////////////////////////////////////////////////
00023 
00024 BusOut Lcd_pins(p21, p22, p23, p24);                // d4, d5, d6, d7 Definiranje lcd sabirnice za upis charactera
00025 Timer timer1;                                       // Timer za izračun rezultata
00026 DigitalOut rs_pin(p19);                             // LCD pin rs (register select.)
00027 DigitalOut e_pin(p20);                              // LCD pin e (enable).
00028 DigitalIn tipka(p14);                               // Tipka za kontrolu
00029 int red = 1;                                        // Varijabla za trenutačni red
00030 int tempRed= 0;                                     // pomoćna temp varijabla za stanje reda
00031 int stupac = 15;                                    // broj stupaca u igri
00032 int rezultat = 0;                                   // varijabla za rezultat u igri
00033 int highScore = 0;                                  // varijabla za highscore (čitanje/upis -> local/log.txt)
00034 float brzinaLika = 0.20;                            // brzina lika/neprijatelja
00035 bool posBit = false;                                // flag za lokaciju lika na ekranu
00036 bool gameOver = true;                               // flag za kraj igre
00037 
00038 
00039 void igra(void);                                    // funkcija igre
00040 
00041 
00042 
00043 ////////////////////////////////////////////////////////////////////////////////////////
00044 // funkcija za upis custom charactera u memoriju lcd-a, u 2 koraka jer se piše 4+4 bita/
00045 ////////////////////////////////////////////////////////////////////////////////////////
00046 
00047 void writePort(int value) {                         // slanje u 2 koraka jer koristimo 4bit na lcd
00048  
00049     Lcd_pins = value >> 4;                          // shiftaj 4 bita u desno
00050     wait(0.000040f); 
00051     e_pin = 0;
00052     wait(0.000040f);
00053     e_pin = 1;
00054     Lcd_pins = value;
00055     wait(0.000040f);
00056     e_pin = 0;
00057     wait(0.000040f);
00058     e_pin = 1;
00059 }
00060 
00061 /////////////////////////////////////////////////////////////////////////////////////////////////////////
00062 /////////////////////////////////////////////Pojava prepreka/////////////////////////////////////////////
00063 /////////////////////////////////////////////////////////////////////////////////////////////////////////
00064 
00065 void prepreka(void){
00066       
00067     
00068       
00069      tempRed = red;                                     //pospremi aktualnu vrijednost reda u temp(radi manipulacije likom)
00070      red = 1;                                           //prebaci se u donji red 
00071 
00072 ///////////////punjenje donjeg reda/////////////////     
00073          lcd.locate(stupac+1,red);                      //lociraj se na sljedeći stupac
00074          lcd.putc(2);                                   //obriši znak/ stavi prazan char
00075          lcd.locate(stupac,red);                        //lociraj se na sljedeći stupac
00076          lcd.putc(3);                                   //stavi char neprijatelja
00077          
00078           
00079          
00080        
00081      red = tempRed;                                     //radi povratka u main vrati staru vrijednost reda
00082      stupac = stupac--;                                 //umanji vrijednost stupca za 1
00083      
00084      if(stupac == 0 && posBit == false){                //ako je neprijatelj na poziciji i lik je gore = (udarac u lika)
00085          
00086              rezultat = timer1.read_ms()/1000;          // pročitaj vrijednost timera i spremi kao rez
00087              lcd.cls();                                 // briši ekran
00088              lcd.locate(3,0);                           // postavi kursor
00089              lcd.printf("Game over!");                  // poruka
00090              lcd.locate(3,1);                           // kursor novi red
00091              lcd.printf("Rezultat:%i", rezultat);       // poruka
00092              
00093              
00094              wait(2);                                   // pričekaj da se poruka stigne pročitati
00095              
00096              if(rezultat > highScore){                  // ako je trenutni rez veći od rekorda spremi ga kao novi rekord
00097                  highScore = rezultat;
00098                  upis(highScore);
00099                  lcd.cls();
00100                  
00101                      
00102                      lcd.locate(0,0);                    // postavi kursor
00103                      lcd.printf("Novi highscore!!");     // ispiši novi rekord
00104                      lcd.locate(6,1);                    
00105                      lcd.printf("%i",highScore);
00106                      wait(2);                            // pričekaj da se poruka stigne pročitati
00107                                                        
00108                                   }  
00109                  
00110              rezultat = 0;                               // poništi trenutni rezultat
00111              gameOver = true;                            // aktiviraj gameover flag
00112       
00113          igra();                                         // skoči u funkciju igra i kreni ispočetka
00114         
00115          
00116          }
00117 
00118 ////////////////////////////////////////////////////////////////////////////////////////         
00119 ///////////////brisanje zaostalih znakova///////////////////////////////////////////////
00120 ////////////////////////////////////////////////////////////////////////////////////////
00121           
00122      if(stupac < 0){                                //ako je kursor došao na prvo mjesto(0)
00123          
00124          lcd.locate(0,1);                           //lociraj se na sljedeći stupac
00125          lcd.putc(2);  
00126          lcd.locate(4,0);                           //lociraj se na sljedeći stupac
00127          lcd.putc(2);  
00128          stupac = 15;                               //vrati ga natrag na početak
00129          
00130          
00131          }
00132  
00133  } 
00134  
00135 ////////////////////////////////////////////////////////////////////////////////////////
00136 /////////////////////////////////////////////Funkcija igre//////////////////////////////
00137 ////////////////////////////////////////////////////////////////////////////////////////
00138  
00139 void igra(void){
00140     
00141     
00142     lcd.cls();
00143     wait(0.010); 
00144     lcd.locate(1,0);                                // postavi kursor
00145     lcd.printf("Pritisni tipku");                   // ispiši poruku
00146     lcd.locate(4,1);                                
00147     lcd.printf("za start"); 
00148     
00149     while(tipka != 1){                              // ne radi ništa dok se ne pritisne tipka za start
00150         }  
00151     
00152     lcd.cls();
00153     wait(0.010);    
00154     gameOver = false;                               // resetiraj gameover flag
00155     
00156     timer1.reset();                                 // resetiraj timer za rezultat
00157     timer1.start();                                 // ponovo ga pokreni
00158     
00159     while(gameOver == false){                       // vrti petlju dok god nije kraj igre
00160     
00161 ////////////////////////////////////////////////////////////////////////////////////////       
00162 ///////////////////////////////Animacija lika///////////////////////////////////////////
00163 ////////////////////////////////////////////////////////////////////////////////////////      
00164             lcd.locate(1,red);
00165             lcd.putc(0);
00166             wait(brzinaLika);
00167             lcd.locate(1,red);
00168             lcd.putc(1);
00169             wait(brzinaLika);
00170             
00171 ////////////////////////////////////////////////////////////////////////////////////////            
00172 //////////////////////////////Manipulacija likom////////////////////////////////////////  
00173 ////////////////////////////////////////////////////////////////////////////////////////          
00174 
00175             if(tipka == 1){                         //ako je pritisnuta tipka
00176                 lcd.locate(1,red);                  //zadrži lokaciju na liku
00177                 lcd.putc(2);                        //obriši ga (upiši prazan char)
00178                 red = 0;                            //skoči u gornji red
00179                 posBit = true;                      //aktiviraj flag za poziciju
00180                 }
00181                
00182             if(tipka != 1 && posBit == true){       //ako tipka više nije aktivna, a posBit je (bio je u gornjem redu)
00183                 lcd.locate(1,red);                  //zadrži lokaciju na liku
00184                 lcd.putc(2);                        //obriši ga (upiši prazan char)
00185                 posBit = false;                     //resetiraj posbit
00186                 red = 1;                            //vrati lika u donji red
00187                 }   
00188  
00189 ////////////////////////////////////////////////////////////////////////////////////////
00190 ////////////////////Poziv funkcije za pojavu prepreka///////////////////////////////////
00191 ////////////////////////////////////////////////////////////////////////////////////////        
00192             
00193             prepreka(); 
00194             
00195             
00196             
00197         
00198         }
00199  
00200  } 
00201 
00202 ////////////////////////////////////////////////////////////////////////////////////////
00203 /////////////////////////////////Main funkcija//////////////////////////////////////////
00204 ////////////////////////////////////////////////////////////////////////////////////////
00205  
00206 int main() {
00207     
00208     highScore = citaj();                            // pročitaj aktualni rekord iz log.txt i spremi u varijablu
00209     lcd.cls();
00210     lcd.locate(2,0);                                // postavi kursor
00211     lcd.printf("Ucitavanje..");
00212     wait(2);
00213     lcd.cls();
00214     lcd.locate(2,0);                                
00215     lcd.printf("Highscore:%d", highScore);          // ispiši highscore
00216     wait(2);
00217     
00218 
00219 ////////////////////////////////////////////////////////////////////////////////////////
00220 /////////////////////////////Upis custom charactera u mem lcd-a/////////////////////////
00221 ////////////////////////////////////////////////////////////////////////////////////////
00222 
00223     for (int j=0; j<8; j++) {
00224  
00225         rs_pin = 0;                                 // slanje komande
00226  
00227        
00228         writePort(0x40+8*j);                        // 0x40 je početna adresa, za svaki char je potrebno 8 mem lokacija
00229  
00230  
00231 
00232         rs_pin = 1;                                 // slanje charova
00233  
00234  
00235         for (int i=0; i<8; i++) {
00236             writePort(custom_char[j][i]);
00237         }
00238     }
00239  
00240  
00241  
00242     lcd.cls();
00243     wait(0.010);
00244  
00245 
00246     lcd.locate(0,1);
00247  
00248         igra();                                     // skoči u funkciju igre
00249 
00250 
00251 
00252 }