Double Snake Game

Dependencies:   mbed SPI_TFT_ILI9341 Joystick font_big

Revision:
0:fada2b2ed18f
Child:
1:891702b74827
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jun 16 20:26:36 2019 +0000
@@ -0,0 +1,361 @@
+# include "mbed.h"
+# define dp23 P0_0
+# include "stdio.h"
+# include "SPI_TFT_ILI9341.h"
+# include "string"
+# include "Arial12x12.h"
+//# include <Joystick.h>
+//# include "Arial24x23.h"
+//# include "Arial28x28.h"
+//# include "font_big.h"
+#include "stdlib.h"
+#include "time.h"
+
+Timer t;
+
+SPI_TFT_ILI9341 TFT ( dp2 , dp1 , dp6 , dp24 , dp23 , dp25 ," TFT ");
+AnalogIn VRx1(dp11); 
+AnalogIn VRy1(dp10);
+InterruptIn SW1(dp9);
+
+AnalogIn VRx2(dp4); 
+AnalogIn VRy2(dp13);
+InterruptIn SW2(dp17);
+
+enum Pozicija{Centar, Desno, Lijevo, Gore, Dolje};
+Pozicija pozicija1 = Centar, pozicija2 = Centar, pozicija = Centar;
+Pozicija redSnakePos(Desno), yellowSnakePos(Lijevo);
+//dimenzije prostora za igru;
+int najmanja_x=0, najmanja_y=0, najveca_x=320, najveca_y=240;
+int diff(1);
+int multiply[3] = {10, 20, 50};
+int delay[3] = {500,300,150};
+
+void ReadDifficulty(){
+    Pozicija izbor;
+    if(VRx1 < 1.0 / 3.0) izbor=Lijevo;
+    else if(VRx1 > 2.0 / 3.0) izbor=Desno;
+    
+    if(izbor != pozicija) pozicija = izbor;
+}
+
+void LarinIzbor(){
+    ReadDifficulty();
+    if(pozicija == Desno && diff < 2) diff++;
+    else if(pozicija == Lijevo && diff > 0) diff--;
+}
+
+ void ReadPosition1(){
+    Pozicija nova_pozicija1;            
+    if(VRx1 < 1.0 / 3.0) nova_pozicija1=Lijevo;
+    else if(VRx1 > 2.0 / 3.0) nova_pozicija1=Desno;
+    else if(VRy1 < 1.0 / 3.0) nova_pozicija1=Gore;
+    else if(VRy1  > 2.0 / 3.0) nova_pozicija1=Dolje;
+   
+    if(nova_pozicija1 != pozicija1){
+        pozicija1 = nova_pozicija1;
+    }
+}
+
+void ReadPosition2(){
+    Pozicija nova_pozicija2;            
+    if(VRx2 < 1.0 / 3.0) nova_pozicija2=Lijevo;
+    else if(VRx2 > 2.0 / 3.0) nova_pozicija2=Desno;
+    else if(VRy2 < 1.0 / 3.0) nova_pozicija2=Gore;
+    else if(VRy2 > 2.0 / 3.0) nova_pozicija2=Dolje;
+    
+    if(nova_pozicija2 != pozicija2){
+        pozicija2 = nova_pozicija2;
+    }
+}
+
+//koordinate jednog dijela zmije ili njene hrane;
+struct gameItem{
+    int X;
+    int Y;
+};
+
+//default velicina zmije;
+unsigned int yellow_snake_velicina=5;
+unsigned int red_snake_velicina=5;
+bool sw1(true);
+
+//sirina i duzina jednog dijela zimje ili njene hrane;
+const unsigned int dimenzija=5;
+
+//niz za dijelove zmije;
+gameItem red_snake[100]; // random broj 100
+gameItem yellow_snake[100];
+
+//hrana
+gameItem njamnjam;
+
+//stanja igre;
+enum GameState{Welcome, Begin, Proces, MainScreen, GameOver};
+
+GameState stanje=Welcome;
+//funkcija za ispis WelcomeScreena
+void statScreen(){
+    LarinIzbor();
+    TFT.fillrect(10,20,310,220,Yellow);
+    TFT.locate(70,70);
+    TFT.set_font (( unsigned char *) Arial12x12);
+    TFT.printf("Double Snake");
+    TFT.locate(70,90);
+    TFT.printf("Difficulty:");
+    TFT.locate(70,130);
+    TFT.printf("Press the button");
+    TFT.locate(70,150);
+    TFT.printf(" to start.");
+}
+void WelcomeScreen(){
+  //  statScreen();
+    TFT.set_font (( unsigned char *) Arial12x12);
+    TFT.fillrect(70,110,320,122,Yellow);
+    TFT.locate(70,110);
+    if(diff == 1) TFT.printf("Medium");
+    else if(diff == 0) TFT.printf("Low");
+    else if(diff == 2) TFT.printf("High");
+}
+//Funkcije za crtanje
+void crtajCrvenuZmiju(){
+    TFT.fillrect(red_snake[0].X, red_snake[0].Y, red_snake[0].X + dimenzija, red_snake[0].Y + dimenzija, Red);
+    TFT.fillrect(red_snake[1].X, red_snake[1].Y, red_snake[1].X + dimenzija, red_snake[1].Y + dimenzija, Green);
+    TFT.fillrect(red_snake[red_snake_velicina-1].X, red_snake[red_snake_velicina-1].Y, red_snake[red_snake_velicina-1].X + dimenzija, red_snake[red_snake_velicina-1].Y + dimenzija, Green);
+    for(int i=1; i<red_snake_velicina; i++){
+            TFT.rect(red_snake[i].X, red_snake[i].Y, red_snake[i].X + dimenzija, red_snake[i].Y + dimenzija, Red);
+        }
+}
+void crtajZutuZmiju(){
+    TFT.fillrect(yellow_snake[0].X, yellow_snake[0].Y, yellow_snake[0].X+dimenzija, yellow_snake[0].Y+dimenzija,Yellow);
+    TFT.fillrect(yellow_snake[1].X, yellow_snake[1].Y, yellow_snake[1].X+dimenzija, yellow_snake[1].Y+dimenzija, Green);
+    TFT.fillrect(yellow_snake[yellow_snake_velicina-1].X, yellow_snake[yellow_snake_velicina-1].Y, yellow_snake[yellow_snake_velicina-1].X+dimenzija, yellow_snake[yellow_snake_velicina-1].Y+dimenzija, Green);
+    for(int i=1; i<yellow_snake_velicina; i++){
+            TFT.rect(yellow_snake[i].X, yellow_snake[i].Y, yellow_snake[i].X+dimenzija, yellow_snake[i].Y+dimenzija, Yellow);
+        }
+    
+}
+void crtajHranu(){
+    TFT.fillrect(njamnjam.X, njamnjam.Y, njamnjam.X + dimenzija, njamnjam.Y + dimenzija, Blue);    
+}
+
+
+
+//funkcija za slucajeve koji dovode do GameOver stanja
+void Sudari(){
+    //sudar zmije same sa sobom
+    for(int i=1; i<red_snake_velicina; i++){
+            if(red_snake[0].X == red_snake[i].X && red_snake[0].Y == red_snake[i].Y){
+                stanje=GameOver;
+               
+                }  
+        }
+    for(int i=1; i<yellow_snake_velicina; i++){
+            if(yellow_snake[0].X == yellow_snake[i].X && yellow_snake[0].Y == yellow_snake[i].Y){
+                stanje=GameOver;
+        
+                }
+                
+        }
+    //sudar zmije sa zidom
+    if((red_snake[0].X < najmanja_x || red_snake[0].X > najveca_x || red_snake[0].Y < najmanja_y || red_snake[0].Y > najveca_y )) {
+       // prodavnicaGame();
+        stanje=GameOver;
+        }
+    if((yellow_snake[0].X<najmanja_x || yellow_snake[0].X>najveca_x || yellow_snake[0].Y<najmanja_y || yellow_snake[0].Y>najveca_y )) {
+       // prodavnicaGame();
+        stanje=GameOver;
+        }
+    // sudar dvije zmije
+    for(int i=0; i<yellow_snake_velicina; i++){
+            if(red_snake[0].X == yellow_snake[i].X && red_snake[0].Y == yellow_snake[i].Y)
+                stanje=GameOver;
+        }
+    for(int i=0; i<red_snake_velicina; i++){
+            if(yellow_snake[0].X == red_snake[i].X && yellow_snake[0].Y == red_snake[i].Y)
+                stanje=GameOver;
+        }
+    
+}
+
+
+void spawnFood(){
+    njamnjam.X += 50;
+    njamnjam.Y += 50;
+    if(njamnjam.X > najveca_x) njamnjam.X = 10;
+    if(njamnjam.Y > najveca_y) njamnjam.Y = 10;
+}
+
+
+void spawnSnake(){
+    red_snake[0].X = najmanja_x + 4*dimenzija;
+    red_snake[0].Y = najmanja_y;
+    yellow_snake[0].X = najveca_x - 30;
+    yellow_snake[0].Y = najveca_y-10;
+    
+    int defaultSize = 5;
+    for(int i=1; i<defaultSize; i++){
+        red_snake[i].X = red_snake[i-1].X - dimenzija; 
+        red_snake[i].Y = red_snake[i-1].Y;
+    }
+    for(int i=1; i<defaultSize; i++){
+        yellow_snake[i].X = yellow_snake[i-1].X + dimenzija; 
+        yellow_snake[i].Y = yellow_snake[i-1].Y;
+    }
+    red_snake_velicina = defaultSize;
+    yellow_snake_velicina = defaultSize;
+    
+}
+void Setup(){
+    redSnakePos=Desno;
+    yellowSnakePos=Lijevo;
+    spawnSnake();
+    spawnFood();
+    stanje=Proces;
+}
+void prodavnicaGame(){
+    TFT.cls();
+    TFT.locate(100,100);
+    TFT.set_font (( unsigned char *) Arial12x12);
+    TFT.printf("GAME OVER!");
+    TFT.locate(100,150);
+    TFT.printf("Score player 1: %d", (red_snake_velicina-5)*10);
+    TFT.locate(100,170);
+    TFT.printf("Score player 2: %d", (yellow_snake_velicina-5)*10);
+    TFT.locate(120,190);
+    if(red_snake_velicina>yellow_snake_velicina) TFT.printf("Pobjednik je crveni igrac");
+    else if(red_snake_velicina<yellow_snake_velicina) TFT.printf("Pobjednik je zuti igrac");
+    else TFT.printf("Nerijeseno");
+}
+//trenutak kad zmija pojede hranu
+void JediBraco(){
+    if(red_snake[0].X == njamnjam.X && red_snake[0].Y == njamnjam.Y){
+            red_snake_velicina++;
+            TFT.fillrect(njamnjam.X,njamnjam.Y, njamnjam.X + dimenzija, njamnjam.Y + dimenzija, Green);
+            spawnFood();
+        }
+    if(yellow_snake[0].X == njamnjam.X && yellow_snake[0].Y == njamnjam.Y){
+            yellow_snake_velicina++;
+            TFT.fillrect(njamnjam.X,njamnjam.Y, njamnjam.X + dimenzija, njamnjam.Y + dimenzija, Green);
+            spawnFood();
+        }
+}
+void crtaj(){
+    crtajCrvenuZmiju();
+    crtajZutuZmiju();
+    crtajHranu();
+    Sudari();
+}
+void redSnakeMovement(){
+    ReadPosition1();
+    if(pozicija1 == Desno && redSnakePos != Lijevo) {
+        redSnakePos=Desno;
+    }
+    else if(pozicija1 == Lijevo && redSnakePos != Desno){
+        redSnakePos = Lijevo;
+    }
+    else if(pozicija1 == Gore && redSnakePos != Dolje){
+        redSnakePos = Gore;    
+    }
+    else if(pozicija1 == Dolje && redSnakePos != Gore){
+        redSnakePos = Dolje;    
+    }
+}
+
+void yellowSnakeMovement(){
+    ReadPosition2();
+    if(pozicija2 == Desno && yellowSnakePos != Lijevo) {
+        yellowSnakePos=Desno;
+    }
+    else if(pozicija2 == Lijevo && yellowSnakePos != Desno){
+        yellowSnakePos = Lijevo;
+    }
+    else if(pozicija2 == Gore && yellowSnakePos != Dolje){
+        yellowSnakePos = Gore;    
+    }
+    else if(pozicija2 == Dolje && yellowSnakePos != Gore){
+        yellowSnakePos = Dolje;    
+    }
+}
+
+void snakeMovement(){
+    redSnakeMovement();
+    yellowSnakeMovement();
+  //  Sudari();
+    stanje=MainScreen;
+}
+
+void updateRedMovement(){
+    TFT.rect(red_snake[red_snake_velicina-1].X, red_snake[red_snake_velicina-1].Y, red_snake[red_snake_velicina-1].X+dimenzija, red_snake[red_snake_velicina-1].Y+dimenzija,Green);
+    for(int i=red_snake_velicina - 1; i > 0; i--){
+            red_snake[i].X = red_snake[i-1].X;
+            red_snake[i].Y = red_snake[i-1].Y;
+        }
+    if(redSnakePos == Lijevo) red_snake[0].X -= dimenzija;
+    else if(redSnakePos == Desno) red_snake[0].X += dimenzija;
+    else if(redSnakePos == Dolje) red_snake[0].Y += dimenzija;
+    else if(redSnakePos == Gore) red_snake[0].Y -= dimenzija;
+   // TFT.fillrect(red_snake[red_snake_velicina-1].X, red_snake[red_snake_velicina-1].Y, red_snake[red_snake_velicina-1].X+dimenzija, red_snake[red_snake_velicina-1].Y+dimenzija,Green);
+}
+
+void updateYellowMovement(){
+    TFT.rect(yellow_snake[yellow_snake_velicina-1].X, yellow_snake[yellow_snake_velicina-1].Y, yellow_snake[yellow_snake_velicina-1].X+dimenzija, yellow_snake[yellow_snake_velicina-1].Y+dimenzija,Green);
+    for(int i=yellow_snake_velicina - 1; i > 0; i--){
+            yellow_snake[i].X = yellow_snake[i-1].X;
+            yellow_snake[i].Y = yellow_snake[i-1].Y;
+        }
+    if(yellowSnakePos == Lijevo) yellow_snake[0].X -= dimenzija;
+    else if(yellowSnakePos == Desno) yellow_snake[0].X += dimenzija;
+    else if(yellowSnakePos == Dolje) yellow_snake[0].Y += dimenzija;
+    else if(yellowSnakePos == Gore) yellow_snake[0].Y -= dimenzija;
+   // TFT.fillrect(yellow_snake[yellow_snake_velicina-1].X, yellow_snake[yellow_snake_velicina-1].Y, yellow_snake[yellow_snake_velicina-1].X+dimenzija, yellow_snake[yellow_snake_velicina-1].Y+dimenzija,Green);
+}
+
+void updateMovement() {
+    updateRedMovement();
+    updateYellowMovement();
+    JediBraco();
+    //Sudari();
+    stanje=Proces;
+}
+void Igraj(){
+    stanje=Begin;
+}
+
+int main() {
+    SW1.mode(PullUp);
+    SW2.mode(PullUp);
+    TFT.set_orientation(3);
+    TFT.background(Green);
+    TFT.foreground(Blue );
+    TFT.cls();
+    SW1.fall(&Igraj);
+    stanje=Welcome;
+    sw1=true;
+    t.start();
+    njamnjam.X=10;
+    njamnjam.Y=30;
+    while(1) {
+            switch(stanje){
+            case Welcome: 
+                LarinIzbor();
+                if(t.read_ms()%3000==0) {statScreen(); WelcomeScreen(); }
+                break;
+            case Begin:
+                TFT.cls();
+                Setup();
+                break;
+            case Proces:
+                snakeMovement();
+                wait_ms(5);
+                break;
+            case MainScreen:
+                updateMovement();
+                crtaj();
+                wait_ms(delay[diff]);
+                break;
+            case GameOver:
+                prodavnicaGame();
+            }
+    }
+}
\ No newline at end of file