Simple fish eat program

Dependencies:   mbed mbed-rtos N5110 ShiftReg Tone

Committer:
el18a2k
Date:
Mon Aug 02 14:35:02 2021 +0000
Revision:
14:f1552b691274
Parent:
13:183bd19f3d7d
final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el18a2k 14:f1552b691274 1 /* Fish Eat Game v2.0
el18a2k 14:f1552b691274 2 * Author: Andrew Knowles
el18a2k 14:f1552b691274 3 * Date: 21/04/2021
el18a2k 14:f1552b691274 4 * Note: See hearder files for additional recognistion */
el18a2k 14:f1552b691274 5
el18a2k 10:e221bd1ce3ec 6 #include "Game.h"
el18a2k 10:e221bd1ce3ec 7
el18a2k 12:20ac766b3175 8 //objects
el18a2k 10:e221bd1ce3ec 9 ShiftReg _shift;
el18a2k 12:20ac766b3175 10 Graphics _graphics;
el18a2k 12:20ac766b3175 11
el18a2k 12:20ac766b3175 12 //attach
el18a2k 11:7c1e2a9303d3 13 BusOut _RGB_led(p24,p23,p22); //RGB bus MSB - LSB, inverted logic 1 = low
el18a2k 11:7c1e2a9303d3 14
el18a2k 10:e221bd1ce3ec 15 //plays the game
el18a2k 13:183bd19f3d7d 16 void Game::gamePlay(N5110 &lcd, DIRECTION direction){
el18a2k 10:e221bd1ce3ec 17 lcd.clear();
el18a2k 10:e221bd1ce3ec 18 lcd.drawRect(0,0,40,9, FILL_TRANSPARENT); //creates the growth bar
el18a2k 10:e221bd1ce3ec 19 lcd.drawRect(0,8,84,40,FILL_TRANSPARENT); //draws screen border
el18a2k 10:e221bd1ce3ec 20 lcd.drawRect(0,0,rect_width,9, FILL_BLACK); //fills the growth bar
el18a2k 10:e221bd1ce3ec 21
el18a2k 10:e221bd1ce3ec 22 //check if enemy fish if fully off screen
el18a2k 10:e221bd1ce3ec 23 if(X == -24){
el18a2k 10:e221bd1ce3ec 24 X = 85; //reset enemy fish position to 85
el18a2k 11:7c1e2a9303d3 25 Y = rand() % 36 + 9; //randomly generate new Y position for enemy fish
el18a2k 10:e221bd1ce3ec 26 E_FISH = rand() % 4 + 1; //randomly select a new enemy fish
el18a2k 10:e221bd1ce3ec 27 }
el18a2k 10:e221bd1ce3ec 28
el18a2k 10:e221bd1ce3ec 29 fishPos(direction);
el18a2k 10:e221bd1ce3ec 30 drawFish(lcd);
el18a2k 10:e221bd1ce3ec 31 enemyFish(lcd);
el18a2k 13:183bd19f3d7d 32 Collision();
el18a2k 10:e221bd1ce3ec 33 Score(lcd);
el18a2k 10:e221bd1ce3ec 34 Lives();
el18a2k 10:e221bd1ce3ec 35
el18a2k 10:e221bd1ce3ec 36 X--;
el18a2k 10:e221bd1ce3ec 37 lcd.refresh();
el18a2k 10:e221bd1ce3ec 38 wait_ms(1000/30);
el18a2k 10:e221bd1ce3ec 39 }
el18a2k 10:e221bd1ce3ec 40
el18a2k 12:20ac766b3175 41 //initialies game. 20, 20, 1
el18a2k 10:e221bd1ce3ec 42 void Game::init(N5110 &lcd, int x, int y, int Fish_size){
el18a2k 10:e221bd1ce3ec 43 _x = x;
el18a2k 10:e221bd1ce3ec 44 _y = y;
el18a2k 10:e221bd1ce3ec 45 X = 85;
el18a2k 10:e221bd1ce3ec 46 Y = 20;
el18a2k 10:e221bd1ce3ec 47 FISH_SIZE = Fish_size;
el18a2k 10:e221bd1ce3ec 48 E_FISH = 1;
el18a2k 10:e221bd1ce3ec 49 SCORE = 0;
el18a2k 10:e221bd1ce3ec 50 check_score = 0;
el18a2k 10:e221bd1ce3ec 51 rect_width = 0;
el18a2k 10:e221bd1ce3ec 52 barIncrement = 0;
el18a2k 10:e221bd1ce3ec 53 check_width = 0;
el18a2k 10:e221bd1ce3ec 54 lives = 3;
el18a2k 12:20ac766b3175 55 _shift.write(0x4F);
el18a2k 10:e221bd1ce3ec 56
el18a2k 10:e221bd1ce3ec 57 //draw fish
el18a2k 10:e221bd1ce3ec 58 drawFish(lcd);
el18a2k 10:e221bd1ce3ec 59 }
el18a2k 10:e221bd1ce3ec 60
el18a2k 10:e221bd1ce3ec 61 //draws player fish
el18a2k 10:e221bd1ce3ec 62 void Game::drawFish(N5110 &lcd){
el18a2k 10:e221bd1ce3ec 63
el18a2k 10:e221bd1ce3ec 64 if (FISH_SIZE == 1){
el18a2k 10:e221bd1ce3ec 65 //draw first fish
el18a2k 10:e221bd1ce3ec 66 _graphics.Fish_1(lcd, _x, _y);
el18a2k 10:e221bd1ce3ec 67 FISH_HEIGHT = 4;
el18a2k 10:e221bd1ce3ec 68 FISH_WIDTH = 9;
el18a2k 10:e221bd1ce3ec 69 CENTRE_X = _x + (FISH_WIDTH/2);
el18a2k 10:e221bd1ce3ec 70 CENTRE_Y = _y + (FISH_HEIGHT/2);
el18a2k 10:e221bd1ce3ec 71
el18a2k 10:e221bd1ce3ec 72 }else if(FISH_SIZE == 2){
el18a2k 10:e221bd1ce3ec 73 //draw second fish
el18a2k 10:e221bd1ce3ec 74 _graphics.Fish_2(lcd, _x, _y);
el18a2k 10:e221bd1ce3ec 75 FISH_HEIGHT = 6;
el18a2k 10:e221bd1ce3ec 76 FISH_WIDTH = 14;
el18a2k 10:e221bd1ce3ec 77 CENTRE_X = _x + (FISH_WIDTH/2);
el18a2k 10:e221bd1ce3ec 78 CENTRE_Y = _y + (FISH_HEIGHT/2);
el18a2k 10:e221bd1ce3ec 79
el18a2k 10:e221bd1ce3ec 80 }else if(FISH_SIZE == 3){
el18a2k 10:e221bd1ce3ec 81 //draw third fish
el18a2k 10:e221bd1ce3ec 82 _graphics.Fish_3(lcd, _x, _y);
el18a2k 10:e221bd1ce3ec 83 FISH_HEIGHT = 8;
el18a2k 10:e221bd1ce3ec 84 FISH_WIDTH = 17;
el18a2k 10:e221bd1ce3ec 85 CENTRE_X = _x + (FISH_WIDTH/2);
el18a2k 10:e221bd1ce3ec 86 CENTRE_Y = _y + (FISH_HEIGHT/2);
el18a2k 10:e221bd1ce3ec 87
el18a2k 10:e221bd1ce3ec 88 }else if(FISH_SIZE == 4){
el18a2k 10:e221bd1ce3ec 89 //draw final fish
el18a2k 10:e221bd1ce3ec 90 _graphics.Fish_4(lcd, _x, _y);
el18a2k 10:e221bd1ce3ec 91 FISH_HEIGHT = 12;
el18a2k 10:e221bd1ce3ec 92 FISH_WIDTH = 23;
el18a2k 10:e221bd1ce3ec 93 CENTRE_X = _x + (FISH_WIDTH/2);
el18a2k 10:e221bd1ce3ec 94 CENTRE_Y = _y + (FISH_HEIGHT/2);
el18a2k 10:e221bd1ce3ec 95 }
el18a2k 10:e221bd1ce3ec 96 }
el18a2k 10:e221bd1ce3ec 97
el18a2k 10:e221bd1ce3ec 98 //updates fish position
el18a2k 10:e221bd1ce3ec 99 void Game::fishPos(DIRECTION direction){
el18a2k 10:e221bd1ce3ec 100
el18a2k 10:e221bd1ce3ec 101 //takes the joystick input and alters the value and x & y accordingly
el18a2k 10:e221bd1ce3ec 102 if(direction.joy == N){
el18a2k 10:e221bd1ce3ec 103 _y--;
el18a2k 10:e221bd1ce3ec 104 }else if(direction.joy == S){
el18a2k 10:e221bd1ce3ec 105 _y++;
el18a2k 10:e221bd1ce3ec 106 }else if(direction.joy == E){
el18a2k 10:e221bd1ce3ec 107 _x++;
el18a2k 10:e221bd1ce3ec 108 }else if(direction.joy == W){
el18a2k 10:e221bd1ce3ec 109 _x--;
el18a2k 10:e221bd1ce3ec 110 }else if(direction.joy == NE){
el18a2k 10:e221bd1ce3ec 111 _y--;
el18a2k 10:e221bd1ce3ec 112 _x++;
el18a2k 10:e221bd1ce3ec 113 }else if(direction.joy == NW){
el18a2k 10:e221bd1ce3ec 114 _y--;
el18a2k 10:e221bd1ce3ec 115 _x--;
el18a2k 10:e221bd1ce3ec 116 }else if(direction.joy == SE){
el18a2k 10:e221bd1ce3ec 117 _y++;
el18a2k 10:e221bd1ce3ec 118 _x++;
el18a2k 10:e221bd1ce3ec 119 }else if(direction.joy == SW){
el18a2k 10:e221bd1ce3ec 120 _y++;
el18a2k 10:e221bd1ce3ec 121 _x--;
el18a2k 10:e221bd1ce3ec 122 }else if(direction.joy == CENTRE){
el18a2k 10:e221bd1ce3ec 123 _x = _x;
el18a2k 10:e221bd1ce3ec 124 _y = _y;
el18a2k 10:e221bd1ce3ec 125 }
el18a2k 10:e221bd1ce3ec 126
el18a2k 10:e221bd1ce3ec 127 //creates the upper x and y boundaries
el18a2k 10:e221bd1ce3ec 128 x_bound = _x + FISH_WIDTH;
el18a2k 10:e221bd1ce3ec 129 y_bound = _y + FISH_HEIGHT;
el18a2k 10:e221bd1ce3ec 130
el18a2k 10:e221bd1ce3ec 131 //check play position agains the boundaries of the playing area
el18a2k 10:e221bd1ce3ec 132 if(_x <= 1){
el18a2k 10:e221bd1ce3ec 133 _x = 1;
el18a2k 11:7c1e2a9303d3 134
el18a2k 10:e221bd1ce3ec 135 }else if (x_bound >= 82){
el18a2k 10:e221bd1ce3ec 136 _x = 82 - FISH_WIDTH;
el18a2k 11:7c1e2a9303d3 137
el18a2k 10:e221bd1ce3ec 138 }else if (_y <= 9){
el18a2k 10:e221bd1ce3ec 139 _y = 9;
el18a2k 11:7c1e2a9303d3 140
el18a2k 10:e221bd1ce3ec 141 }else if (y_bound >= 47){
el18a2k 10:e221bd1ce3ec 142 _y = 47 - FISH_HEIGHT;
el18a2k 10:e221bd1ce3ec 143 }
el18a2k 10:e221bd1ce3ec 144 }
el18a2k 10:e221bd1ce3ec 145
el18a2k 10:e221bd1ce3ec 146 //Keeps score
el18a2k 10:e221bd1ce3ec 147 int Game::Score(N5110 &lcd){
el18a2k 10:e221bd1ce3ec 148 //print score to screen
el18a2k 10:e221bd1ce3ec 149 s_length = sprintf(_score,"%2d",SCORE);
el18a2k 10:e221bd1ce3ec 150 lcd.printString(_score,54,0);
el18a2k 10:e221bd1ce3ec 151
el18a2k 10:e221bd1ce3ec 152 //score limits to grow fish
el18a2k 10:e221bd1ce3ec 153 if (SCORE < 100){
el18a2k 10:e221bd1ce3ec 154 FISH_SIZE = 1; //smallest fish
el18a2k 10:e221bd1ce3ec 155 barIncrement = 4; //increments the width of the growth bar by 4 pixels
el18a2k 11:7c1e2a9303d3 156
el18a2k 10:e221bd1ce3ec 157 }else if(SCORE >= 100 && SCORE < 300){
el18a2k 10:e221bd1ce3ec 158 FISH_SIZE = 2; //fish 2
el18a2k 10:e221bd1ce3ec 159 barIncrement = 2;
el18a2k 11:7c1e2a9303d3 160
el18a2k 10:e221bd1ce3ec 161 }else if (SCORE >= 300 && SCORE <= 700){
el18a2k 10:e221bd1ce3ec 162 FISH_SIZE = 3; //fish 3
el18a2k 10:e221bd1ce3ec 163 barIncrement = 1;
el18a2k 11:7c1e2a9303d3 164
el18a2k 10:e221bd1ce3ec 165 }else if (SCORE >= 700){
el18a2k 10:e221bd1ce3ec 166 FISH_SIZE = 4; //largest fish
el18a2k 10:e221bd1ce3ec 167 barIncrement = 0;
el18a2k 10:e221bd1ce3ec 168 }
el18a2k 10:e221bd1ce3ec 169
el18a2k 10:e221bd1ce3ec 170 //increases the growth bar width each time a the score increases
el18a2k 10:e221bd1ce3ec 171 if(check_score != SCORE){
el18a2k 10:e221bd1ce3ec 172 if(FISH_SIZE == 1){
el18a2k 10:e221bd1ce3ec 173 rect_width = rect_width + 4;
el18a2k 11:7c1e2a9303d3 174
el18a2k 10:e221bd1ce3ec 175 }else if(FISH_SIZE == 2){
el18a2k 10:e221bd1ce3ec 176 rect_width = rect_width + 2;
el18a2k 11:7c1e2a9303d3 177
el18a2k 10:e221bd1ce3ec 178 }else if(FISH_SIZE == 3){
el18a2k 10:e221bd1ce3ec 179 rect_width = rect_width + 1;
el18a2k 11:7c1e2a9303d3 180
el18a2k 10:e221bd1ce3ec 181 }else if(FISH_SIZE == 4){
el18a2k 10:e221bd1ce3ec 182 rect_width = 40;
el18a2k 10:e221bd1ce3ec 183 }
el18a2k 10:e221bd1ce3ec 184
el18a2k 10:e221bd1ce3ec 185 check_score = SCORE;
el18a2k 10:e221bd1ce3ec 186 }
el18a2k 10:e221bd1ce3ec 187
el18a2k 10:e221bd1ce3ec 188 //check for change in bar increment if true reset the width of the growth bar
el18a2k 10:e221bd1ce3ec 189 if(check_width != barIncrement){
el18a2k 10:e221bd1ce3ec 190 if(FISH_SIZE == 4){ //if largest fish than growth bar is max
el18a2k 10:e221bd1ce3ec 191 rect_width = 40;
el18a2k 11:7c1e2a9303d3 192
el18a2k 10:e221bd1ce3ec 193 }else{
el18a2k 10:e221bd1ce3ec 194 rect_width = 0;
el18a2k 10:e221bd1ce3ec 195 }
el18a2k 10:e221bd1ce3ec 196 check_width = barIncrement; //set new check width to new bar increment
el18a2k 10:e221bd1ce3ec 197 }
el18a2k 10:e221bd1ce3ec 198
el18a2k 10:e221bd1ce3ec 199 return SCORE;
el18a2k 10:e221bd1ce3ec 200 }
el18a2k 10:e221bd1ce3ec 201
el18a2k 10:e221bd1ce3ec 202 //keeps track of lives
el18a2k 10:e221bd1ce3ec 203 int Game::Lives(){
el18a2k 10:e221bd1ce3ec 204 if (lives == 3){
el18a2k 10:e221bd1ce3ec 205 _shift.write(0x4F); //write 3
el18a2k 11:7c1e2a9303d3 206
el18a2k 10:e221bd1ce3ec 207 }else if (lives == 2){
el18a2k 10:e221bd1ce3ec 208 _shift.write(0x5B); //write 2
el18a2k 11:7c1e2a9303d3 209
el18a2k 10:e221bd1ce3ec 210 }else if (lives == 1){
el18a2k 10:e221bd1ce3ec 211 _shift.write(0x06); //write 1
el18a2k 11:7c1e2a9303d3 212
el18a2k 10:e221bd1ce3ec 213 }else if (lives == 0){
el18a2k 10:e221bd1ce3ec 214 _shift.write(0x3F); //write 0
el18a2k 10:e221bd1ce3ec 215 }
el18a2k 10:e221bd1ce3ec 216 return lives;
el18a2k 10:e221bd1ce3ec 217 }
el18a2k 10:e221bd1ce3ec 218
el18a2k 10:e221bd1ce3ec 219 //checks for collision with other fish
el18a2k 13:183bd19f3d7d 220 void Game::Collision(){
el18a2k 10:e221bd1ce3ec 221 centre_xpos = E_CENTRE_X - CENTRE_X;
el18a2k 10:e221bd1ce3ec 222 centre_ypos = E_CENTRE_Y - CENTRE_Y;
el18a2k 10:e221bd1ce3ec 223
el18a2k 10:e221bd1ce3ec 224 if((centre_xpos == 2 && centre_ypos <= 1) && (centre_xpos == 2 && centre_ypos >= -1)){
el18a2k 10:e221bd1ce3ec 225 if(FISH_SIZE < E_FISH){
el18a2k 10:e221bd1ce3ec 226 //remove one life
el18a2k 11:7c1e2a9303d3 227 lives--;
el18a2k 12:20ac766b3175 228
el18a2k 11:7c1e2a9303d3 229 //flicker busout
el18a2k 11:7c1e2a9303d3 230 _RGB_led.write(6); //red
el18a2k 11:7c1e2a9303d3 231 wait_ms(100);
el18a2k 11:7c1e2a9303d3 232 _RGB_led.write(7); //off
el18a2k 11:7c1e2a9303d3 233
el18a2k 12:20ac766b3175 234 }else if(FISH_SIZE >= E_FISH){
el18a2k 10:e221bd1ce3ec 235 //increase score by 10
el18a2k 10:e221bd1ce3ec 236 SCORE = SCORE + 10;
el18a2k 13:183bd19f3d7d 237
el18a2k 10:e221bd1ce3ec 238 //remove eaten fish
el18a2k 10:e221bd1ce3ec 239 X = -23;
el18a2k 13:183bd19f3d7d 240
el18a2k 11:7c1e2a9303d3 241 //flicker busout
el18a2k 11:7c1e2a9303d3 242 i = 0;
el18a2k 11:7c1e2a9303d3 243 while(i < 3){
el18a2k 13:183bd19f3d7d 244 colour = rand() % 6 + 1; //generate random colour
el18a2k 11:7c1e2a9303d3 245 _RGB_led.write(colour);
el18a2k 11:7c1e2a9303d3 246 wait_ms(100);
el18a2k 13:183bd19f3d7d 247 _RGB_led.write(7); //turn off led
el18a2k 11:7c1e2a9303d3 248 i++;
el18a2k 11:7c1e2a9303d3 249 }
el18a2k 13:183bd19f3d7d 250 _RGB_led.write(7); //turn off led
el18a2k 11:7c1e2a9303d3 251 i = 0;
el18a2k 10:e221bd1ce3ec 252 }
el18a2k 10:e221bd1ce3ec 253 }
el18a2k 10:e221bd1ce3ec 254 }
el18a2k 10:e221bd1ce3ec 255
el18a2k 10:e221bd1ce3ec 256 //generates enemy fish
el18a2k 10:e221bd1ce3ec 257 void Game::enemyFish(N5110 &lcd){
el18a2k 10:e221bd1ce3ec 258 if (E_FISH == 1){
el18a2k 10:e221bd1ce3ec 259 //draw first fish
el18a2k 10:e221bd1ce3ec 260 _graphics.E_Fish_1(lcd, X, Y);
el18a2k 10:e221bd1ce3ec 261 E_FISH_HEIGHT = 4;
el18a2k 10:e221bd1ce3ec 262 E_FISH_WIDTH = 9;
el18a2k 10:e221bd1ce3ec 263 E_CENTRE_X = X + (E_FISH_WIDTH/2);
el18a2k 10:e221bd1ce3ec 264 E_CENTRE_Y = Y + (E_FISH_HEIGHT/2);
el18a2k 10:e221bd1ce3ec 265
el18a2k 10:e221bd1ce3ec 266 }else if(E_FISH == 2){
el18a2k 10:e221bd1ce3ec 267 //draw second fish
el18a2k 10:e221bd1ce3ec 268 _graphics.E_Fish_2(lcd, X, Y);
el18a2k 10:e221bd1ce3ec 269 E_FISH_HEIGHT = 6;
el18a2k 10:e221bd1ce3ec 270 E_FISH_WIDTH = 14;
el18a2k 10:e221bd1ce3ec 271 E_CENTRE_X = X + (E_FISH_WIDTH/2);
el18a2k 10:e221bd1ce3ec 272 E_CENTRE_Y = Y + (E_FISH_HEIGHT/2);
el18a2k 10:e221bd1ce3ec 273
el18a2k 10:e221bd1ce3ec 274 }else if(E_FISH == 3){
el18a2k 10:e221bd1ce3ec 275 //draw third fish
el18a2k 10:e221bd1ce3ec 276 _graphics.E_Fish_3(lcd, X, Y);
el18a2k 10:e221bd1ce3ec 277 E_FISH_HEIGHT = 8;
el18a2k 10:e221bd1ce3ec 278 E_FISH_WIDTH = 17;
el18a2k 10:e221bd1ce3ec 279 E_CENTRE_X = X + (E_FISH_WIDTH/2);
el18a2k 10:e221bd1ce3ec 280 E_CENTRE_Y = Y + (E_FISH_HEIGHT/2);
el18a2k 10:e221bd1ce3ec 281
el18a2k 10:e221bd1ce3ec 282 }else if(E_FISH == 4){
el18a2k 10:e221bd1ce3ec 283 //draw final fish
el18a2k 10:e221bd1ce3ec 284 _graphics.E_Fish_4(lcd, X, Y);
el18a2k 10:e221bd1ce3ec 285 E_FISH_HEIGHT = 12;
el18a2k 10:e221bd1ce3ec 286 E_FISH_WIDTH = 23;
el18a2k 10:e221bd1ce3ec 287 E_CENTRE_X = X + (E_FISH_WIDTH/2);
el18a2k 10:e221bd1ce3ec 288 E_CENTRE_Y = Y + (E_FISH_HEIGHT/2);
el18a2k 10:e221bd1ce3ec 289 }
el18a2k 10:e221bd1ce3ec 290 }