Simple fish eat program

Dependencies:   mbed mbed-rtos N5110 ShiftReg Tone

Committer:
el18a2k
Date:
Wed Apr 21 15:24:31 2021 +0000
Revision:
12:20ac766b3175
Parent:
11:7c1e2a9303d3
Child:
13:183bd19f3d7d
lots of bugs

Who changed what in which revision?

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