Simple fish eat program

Dependencies:   mbed mbed-rtos N5110 ShiftReg Tone

Revision:
10:e221bd1ce3ec
Child:
11:7c1e2a9303d3
diff -r d52c4df02493 -r e221bd1ce3ec classes/Game.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/classes/Game.cpp	Tue Apr 20 15:35:00 2021 +0000
@@ -0,0 +1,254 @@
+#include "Game.h"
+
+ShiftReg _shift;
+Graphics _graphics; 
+
+//plays the game
+void Game::gamePlay(N5110 &lcd, DIRECTION direction){ 
+    lcd.clear();
+    lcd.drawRect(0,0,40,9, FILL_TRANSPARENT); //creates the growth bar
+    lcd.drawRect(0,8,84,40,FILL_TRANSPARENT); //draws screen border
+    lcd.drawRect(0,0,rect_width,9, FILL_BLACK); //fills the growth bar
+    
+    //check if enemy fish if fully off screen
+    if(X == -24){
+        X = 85; //reset enemy fish position to 85
+        Y = rand() % 36 + 9; //randomly generate Y position for enemy fish
+        E_FISH = rand() % 4 + 1; //randomly select a new enemy fish
+    }
+    
+    fishPos(direction);
+    drawFish(lcd);
+    enemyFish(lcd);
+    Collision();
+    Score(lcd);
+    Lives();
+    
+    X--;
+    lcd.refresh();
+    wait_ms(1000/30);
+}
+    
+//initiates game.            20,     20,        1          
+void Game::init(N5110 &lcd, int x, int y, int Fish_size){
+    _x = x;
+    _y = y;
+    X = 85;
+    Y = 20;
+    FISH_SIZE = Fish_size;
+    E_FISH = 1;
+    SCORE = 0;
+    check_score = 0;
+    rect_width = 0;
+    barIncrement = 0;
+    check_width = 0;
+    lives = 3;
+    _shift.write(0x4F); //initiate lives
+    
+    //draw fish 
+    drawFish(lcd);
+}
+    
+//draws player fish
+void Game::drawFish(N5110 &lcd){
+    
+    if (FISH_SIZE == 1){
+        //draw first fish
+        _graphics.Fish_1(lcd, _x, _y);
+        FISH_HEIGHT = 4;
+        FISH_WIDTH = 9; 
+        CENTRE_X = _x + (FISH_WIDTH/2); 
+        CENTRE_Y = _y + (FISH_HEIGHT/2);
+        
+    }else if(FISH_SIZE == 2){
+        //draw second fish
+        _graphics.Fish_2(lcd, _x, _y);
+        FISH_HEIGHT = 6;
+        FISH_WIDTH = 14;
+        CENTRE_X = _x + (FISH_WIDTH/2); 
+        CENTRE_Y = _y + (FISH_HEIGHT/2); 
+        
+    }else if(FISH_SIZE == 3){
+        //draw third fish
+        _graphics.Fish_3(lcd, _x, _y);
+        FISH_HEIGHT = 8;
+        FISH_WIDTH = 17; 
+        CENTRE_X = _x + (FISH_WIDTH/2); 
+        CENTRE_Y = _y + (FISH_HEIGHT/2);
+        
+    }else if(FISH_SIZE == 4){
+        //draw final fish
+        _graphics.Fish_4(lcd, _x, _y);
+        FISH_HEIGHT = 12;
+        FISH_WIDTH = 23;  
+        CENTRE_X = _x + (FISH_WIDTH/2); 
+        CENTRE_Y = _y + (FISH_HEIGHT/2);
+    }      
+}
+    
+//updates fish position
+void Game::fishPos(DIRECTION direction){
+    
+    //takes the joystick input and alters the value and x & y accordingly
+    if(direction.joy == N){
+        _y--;
+    }else if(direction.joy == S){
+        _y++; 
+    }else if(direction.joy == E){
+        _x++;    
+    }else if(direction.joy == W){
+        _x--;
+    }else if(direction.joy == NE){
+        _y--;
+        _x++;    
+    }else if(direction.joy == NW){
+        _y--;
+        _x--;    
+    }else if(direction.joy == SE){
+        _y++;
+        _x++;    
+    }else if(direction.joy == SW){
+        _y++;
+        _x--;   
+    }else if(direction.joy == CENTRE){
+        _x = _x;
+        _y = _y;    
+    }
+    
+    //creates the upper x and y boundaries
+    x_bound = _x + FISH_WIDTH;
+    y_bound = _y + FISH_HEIGHT;
+    
+    //check play position agains the boundaries of the playing area
+    if(_x <= 1){
+        _x = 1;
+    }else if (x_bound >= 82){
+        _x = 82 - FISH_WIDTH;  
+    }else if (_y <= 9){
+        _y = 9;    
+    }else if (y_bound >= 47){
+        _y = 47 - FISH_HEIGHT;
+    }
+}
+    
+//Keeps score
+int Game::Score(N5110 &lcd){
+    //print score to screen
+    s_length = sprintf(_score,"%2d",SCORE);
+    lcd.printString(_score,54,0);
+    
+    //score limits to grow fish
+    if (SCORE < 100){
+        FISH_SIZE = 1;                          //smallest fish
+        barIncrement = 4; //increments the width of the growth bar by 4 pixels
+    }else if(SCORE >= 100 && SCORE < 300){
+        FISH_SIZE = 2;                          //fish 2
+        barIncrement = 2;
+    }else if (SCORE >= 300 && SCORE <= 700){
+        FISH_SIZE = 3;                          //fish 3
+        barIncrement = 1;
+    }else if (SCORE >= 700){
+        FISH_SIZE = 4;                          //largest fish
+        barIncrement = 0;
+    }
+    
+    //increases the growth bar width each time a the score increases
+    if(check_score != SCORE){
+        if(FISH_SIZE == 1){
+            rect_width = rect_width + 4;
+        }else if(FISH_SIZE == 2){
+            rect_width = rect_width + 2;
+        }else if(FISH_SIZE == 3){
+            rect_width = rect_width + 1;
+        }else if(FISH_SIZE == 4){
+            rect_width = 40;
+        }
+        
+        check_score = SCORE;
+    }
+    
+    //check for change in bar increment if true reset the width of the growth bar   
+    if(check_width != barIncrement){
+        if(FISH_SIZE == 4){ //if largest fish than growth bar is max
+            rect_width = 40;
+        }else{
+            rect_width = 0;
+        }
+        check_width = barIncrement; //set new check width to new bar increment     
+    }
+        
+    return SCORE;
+}
+    
+//keeps track of lives
+int Game::Lives(){
+    if (lives == 3){
+        _shift.write(0x4F); //write 3
+    }else if (lives == 2){
+        _shift.write(0x5B); //write 2
+    }else if (lives == 1){
+        _shift.write(0x06); //write 1
+    }else if (lives == 0){
+        _shift.write(0x3F); //write 0
+    }
+    return lives;
+}
+
+//checks for collision with other fish
+int Game::Collision(){
+    centre_xpos = E_CENTRE_X - CENTRE_X;
+    centre_ypos = E_CENTRE_Y - CENTRE_Y;
+    
+    if((centre_xpos == 2 && centre_ypos <= 1) && (centre_xpos == 2 && centre_ypos >= -1)){
+        if(FISH_SIZE < E_FISH){
+            //remove one life
+            lives--;    
+        }else if(FISH_SIZE >= E_FISH){           
+            //increase score by 10
+            SCORE = SCORE + 10;
+            //remove eaten fish
+            X = -23;  
+        }
+
+        collision = 1;
+    }else{
+        collision = 0;
+    }
+    return collision;
+}
+
+//generates enemy fish
+void Game::enemyFish(N5110 &lcd){
+    if (E_FISH == 1){
+        //draw first fish
+        _graphics.E_Fish_1(lcd, X, Y);
+        E_FISH_HEIGHT = 4;
+        E_FISH_WIDTH = 9; 
+        E_CENTRE_X = X + (E_FISH_WIDTH/2);
+        E_CENTRE_Y = Y + (E_FISH_HEIGHT/2);
+        
+    }else if(E_FISH == 2){
+        //draw second fish
+        _graphics.E_Fish_2(lcd, X, Y);
+        E_FISH_HEIGHT = 6;
+        E_FISH_WIDTH = 14; 
+        E_CENTRE_X = X + (E_FISH_WIDTH/2);
+        E_CENTRE_Y = Y + (E_FISH_HEIGHT/2);
+        
+    }else if(E_FISH == 3){
+        //draw third fish
+        _graphics.E_Fish_3(lcd, X, Y);
+        E_FISH_HEIGHT = 8;
+        E_FISH_WIDTH = 17;
+        E_CENTRE_X = X + (E_FISH_WIDTH/2);
+        E_CENTRE_Y = Y + (E_FISH_HEIGHT/2); 
+        
+    }else if(E_FISH == 4){
+        //draw final fish
+        _graphics.E_Fish_4(lcd, X, Y);
+        E_FISH_HEIGHT = 12;
+        E_FISH_WIDTH = 23;  
+        E_CENTRE_X = X + (E_FISH_WIDTH/2);
+        E_CENTRE_Y = Y + (E_FISH_HEIGHT/2);
+    }  
+}
\ No newline at end of file