Game codes for Pokemon Academy Yiu Fai Kwok - 201198802 I have read the University Regulations on Plagiarism and state that the work covered by this declaration is my own and does not contain any unacknowledged work from other sources.

Dependencies:   mbed FXOS8700CQ mbed-rtos

Committer:
yfkwok
Date:
Sun Apr 21 11:02:28 2019 +0000
Revision:
17:5d8ff39a0e49
Parent:
11:5a6b9dffd78a
Child:
20:50ad2dad310d
21/04/2019 - Add Doxygen comments for the following classes: Exam, Characters, Score and Start

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yfkwok 2:464c7e62d97d 1 #include "Game_one.h"
yfkwok 2:464c7e62d97d 2
yfkwok 2:464c7e62d97d 3 Game_one::Game_one()
yfkwok 2:464c7e62d97d 4 {
yfkwok 2:464c7e62d97d 5
yfkwok 2:464c7e62d97d 6 }
yfkwok 2:464c7e62d97d 7
yfkwok 2:464c7e62d97d 8 Game_one::~Game_one()
yfkwok 2:464c7e62d97d 9 {
yfkwok 2:464c7e62d97d 10
yfkwok 2:464c7e62d97d 11 }
yfkwok 2:464c7e62d97d 12
yfkwok 17:5d8ff39a0e49 13 //Enumerate instruction menu from page 1 - 4
yfkwok 4:5bc9c4363d31 14 enum Page {
yfkwok 17:5d8ff39a0e49 15 PAGE_1, PAGE_2, PAGE_3, PAGE_4
yfkwok 4:5bc9c4363d31 16 };
yfkwok 4:5bc9c4363d31 17
yfkwok 2:464c7e62d97d 18 void Game_one::init(int speed, int cha, int r)
yfkwok 2:464c7e62d97d 19 {
yfkwok 2:464c7e62d97d 20 // Set the speed of the objects
yfkwok 2:464c7e62d97d 21 _speed = speed;
yfkwok 2:464c7e62d97d 22
yfkwok 2:464c7e62d97d 23 // Set the character being drawn
yfkwok 2:464c7e62d97d 24 _cha = cha;
yfkwok 2:464c7e62d97d 25
yfkwok 2:464c7e62d97d 26 // Set the random parameter for coin/block ratio
yfkwok 2:464c7e62d97d 27 _rand = r;
yfkwok 2:464c7e62d97d 28
yfkwok 17:5d8ff39a0e49 29 // Player's x position defined
yfkwok 2:464c7e62d97d 30 _p1x = 61;
yfkwok 2:464c7e62d97d 31
yfkwok 17:5d8ff39a0e49 32 // Initialize round counter
yfkwok 2:464c7e62d97d 33 _count = 0;
yfkwok 2:464c7e62d97d 34 _alt = 0;
yfkwok 2:464c7e62d97d 35
yfkwok 17:5d8ff39a0e49 36 // Initialize all game objects: character, coin and block
yfkwok 2:464c7e62d97d 37 _p1.init(_p1x);
yfkwok 2:464c7e62d97d 38 _coin.init(_speed);
yfkwok 2:464c7e62d97d 39 _block.init(_speed);
yfkwok 2:464c7e62d97d 40
yfkwok 2:464c7e62d97d 41 // 4 possibilities. 3 for coin, 1 for block.
yfkwok 2:464c7e62d97d 42 srand(time(NULL));
yfkwok 2:464c7e62d97d 43 _type = rand() % 4; // randomise type.
yfkwok 2:464c7e62d97d 44 }
yfkwok 2:464c7e62d97d 45
yfkwok 2:464c7e62d97d 46 void Game_one::render(N5110 &lcd, int cha)
yfkwok 2:464c7e62d97d 47 {
yfkwok 2:464c7e62d97d 48 lcd.clear();
yfkwok 2:464c7e62d97d 49 draw(lcd, cha);
yfkwok 2:464c7e62d97d 50 lcd.refresh();
yfkwok 2:464c7e62d97d 51 }
yfkwok 2:464c7e62d97d 52
yfkwok 2:464c7e62d97d 53 void Game_one::read_input(Gamepad &pad)
yfkwok 2:464c7e62d97d 54 {
yfkwok 17:5d8ff39a0e49 55 // Read input from Gamepad for direction and magnitude of motion control
yfkwok 2:464c7e62d97d 56 _d = pad.get_direction();
yfkwok 2:464c7e62d97d 57 _mag = pad.get_mag();
yfkwok 2:464c7e62d97d 58 }
yfkwok 2:464c7e62d97d 59
yfkwok 2:464c7e62d97d 60 void Game_one::draw(N5110 &lcd, int cha)
yfkwok 2:464c7e62d97d 61 {
yfkwok 2:464c7e62d97d 62 int alt = update_alt();
yfkwok 17:5d8ff39a0e49 63 // Draw player on lcd
yfkwok 2:464c7e62d97d 64 if(alt <= 1){_p1.draw(lcd, cha);}
yfkwok 2:464c7e62d97d 65 else {_p1.draw_alt(lcd, cha);}
yfkwok 2:464c7e62d97d 66 print_scores(lcd);
yfkwok 17:5d8ff39a0e49 67 // Spawn coin if _type < _rand
yfkwok 2:464c7e62d97d 68 if(_type < _rand) {_coin.draw(lcd);}
yfkwok 17:5d8ff39a0e49 69 // Spawn block if _type > _rand
yfkwok 2:464c7e62d97d 70 else {_block.draw(lcd);}
yfkwok 2:464c7e62d97d 71 }
yfkwok 2:464c7e62d97d 72
yfkwok 2:464c7e62d97d 73 void Game_one::update(Gamepad &pad, N5110 &lcd)
yfkwok 2:464c7e62d97d 74 {
yfkwok 2:464c7e62d97d 75 if(_type < _rand) {
yfkwok 2:464c7e62d97d 76 check_miss_coin(pad);
yfkwok 2:464c7e62d97d 77 _p1.update(_d,_mag);
yfkwok 2:464c7e62d97d 78 _coin.update();
yfkwok 2:464c7e62d97d 79 check_player_collect(pad);
yfkwok 2:464c7e62d97d 80 }
yfkwok 2:464c7e62d97d 81 else {
yfkwok 2:464c7e62d97d 82 check_miss_block(pad);
yfkwok 2:464c7e62d97d 83 _p1.update(_d,_mag);
yfkwok 2:464c7e62d97d 84 _block.update();
yfkwok 2:464c7e62d97d 85 check_player_collide(pad, lcd);
yfkwok 2:464c7e62d97d 86 }
yfkwok 2:464c7e62d97d 87 }
yfkwok 2:464c7e62d97d 88
yfkwok 2:464c7e62d97d 89 void Game_one::check_player_collect(Gamepad &pad)
yfkwok 2:464c7e62d97d 90 {
yfkwok 2:464c7e62d97d 91 // read current coin attributes
yfkwok 2:464c7e62d97d 92 Vector2D coin_pos = _coin.get_pos();
yfkwok 2:464c7e62d97d 93 int coin_speed = _coin.get_velocity();
yfkwok 2:464c7e62d97d 94
yfkwok 2:464c7e62d97d 95 // check p1 first
yfkwok 2:464c7e62d97d 96 Vector2D p1_pos = _p1.get_pos();
yfkwok 2:464c7e62d97d 97
yfkwok 2:464c7e62d97d 98 // see if coin has hit the player by checking for overlaps
yfkwok 2:464c7e62d97d 99 if (
yfkwok 2:464c7e62d97d 100 (coin_pos.y >= p1_pos.y) && //top
yfkwok 2:464c7e62d97d 101 (coin_pos.y <= p1_pos.y + 21) && //bottom
yfkwok 2:464c7e62d97d 102 (coin_pos.x >= _p1x) && //left
yfkwok 2:464c7e62d97d 103 (coin_pos.x <= _p1x + 17) //right
yfkwok 2:464c7e62d97d 104 )
yfkwok 2:464c7e62d97d 105 {
yfkwok 2:464c7e62d97d 106 // write new attributes
yfkwok 2:464c7e62d97d 107 _p1.add_score();
yfkwok 2:464c7e62d97d 108 _coin.init(_speed);
yfkwok 2:464c7e62d97d 109 music.coin(pad);
yfkwok 2:464c7e62d97d 110 _count++;
yfkwok 17:5d8ff39a0e49 111 _type = rand() % 8; // re-randomise _type to create new object if coin is being collected
yfkwok 2:464c7e62d97d 112 }
yfkwok 2:464c7e62d97d 113 }
yfkwok 2:464c7e62d97d 114
yfkwok 2:464c7e62d97d 115 void Game_one::check_player_collide(Gamepad &pad, N5110 &lcd)
yfkwok 2:464c7e62d97d 116 {
yfkwok 2:464c7e62d97d 117 // read current block attributes
yfkwok 2:464c7e62d97d 118 Vector2D block_pos = _block.get_pos();
yfkwok 2:464c7e62d97d 119 int block_speed = _block.get_velocity();
yfkwok 2:464c7e62d97d 120
yfkwok 2:464c7e62d97d 121 Vector2D p1_pos = _p1.get_pos();
yfkwok 2:464c7e62d97d 122
yfkwok 2:464c7e62d97d 123 // see if block has hit the player by checking for overlaps
yfkwok 2:464c7e62d97d 124 if (
yfkwok 5:bc0691d02fd5 125 (block_pos.y >= p1_pos.y - 6) && //top
yfkwok 5:bc0691d02fd5 126 (block_pos.y <= p1_pos.y + 14) && //bottom
yfkwok 2:464c7e62d97d 127 (block_pos.x >= _p1x) && //left
yfkwok 2:464c7e62d97d 128 (block_pos.x <= _p1x + 17) //right
yfkwok 2:464c7e62d97d 129 )
yfkwok 2:464c7e62d97d 130 {
yfkwok 17:5d8ff39a0e49 131 // write new attributes, execute gameover screen when block is collided
yfkwok 2:464c7e62d97d 132 _block.init(_speed);
yfkwok 2:464c7e62d97d 133 gameover(lcd, pad);
yfkwok 2:464c7e62d97d 134 }
yfkwok 2:464c7e62d97d 135 }
yfkwok 2:464c7e62d97d 136
yfkwok 2:464c7e62d97d 137 void Game_one::check_miss_coin(Gamepad &pad)
yfkwok 2:464c7e62d97d 138 {
yfkwok 2:464c7e62d97d 139 Vector2D coin_pos = _coin.get_pos();
yfkwok 17:5d8ff39a0e49 140 // Check if the player has missed
yfkwok 2:464c7e62d97d 141 if (coin_pos.x > WIDTH) {
yfkwok 2:464c7e62d97d 142 _coin.init(_speed);
yfkwok 2:464c7e62d97d 143 pad.tone(750.0,0.1);
yfkwok 17:5d8ff39a0e49 144 _count++; // Add 1 to increase coin counter to terminate game loop after 10 coins appeared
yfkwok 2:464c7e62d97d 145 wait(0.1);
yfkwok 17:5d8ff39a0e49 146 _type = rand() % 8; // re-randomise _type to create new object when coin is missed
yfkwok 2:464c7e62d97d 147 }
yfkwok 2:464c7e62d97d 148
yfkwok 2:464c7e62d97d 149 }
yfkwok 2:464c7e62d97d 150
yfkwok 2:464c7e62d97d 151 void Game_one::check_miss_block(Gamepad &pad)
yfkwok 2:464c7e62d97d 152 {
yfkwok 2:464c7e62d97d 153 Vector2D block_pos = _block.get_pos();
yfkwok 17:5d8ff39a0e49 154 // Check if player has missed
yfkwok 2:464c7e62d97d 155 if (block_pos.x > WIDTH) {
yfkwok 2:464c7e62d97d 156 _block.init(_speed);
yfkwok 2:464c7e62d97d 157 pad.tone(750.0,0.1);
yfkwok 2:464c7e62d97d 158 wait(0.1);
yfkwok 17:5d8ff39a0e49 159 _type = rand() % 8; // re-randomise _type to create new object when block is missed
yfkwok 2:464c7e62d97d 160 }
yfkwok 2:464c7e62d97d 161
yfkwok 2:464c7e62d97d 162 }
yfkwok 2:464c7e62d97d 163
yfkwok 2:464c7e62d97d 164 int Game_one::print_scores(N5110 &lcd)
yfkwok 2:464c7e62d97d 165 {
yfkwok 2:464c7e62d97d 166 // get scores from paddles
yfkwok 2:464c7e62d97d 167 int p1_score = _p1.get_score();
yfkwok 2:464c7e62d97d 168 int total = get_count();
yfkwok 2:464c7e62d97d 169
yfkwok 2:464c7e62d97d 170 // print to LCD i
yfkwok 2:464c7e62d97d 171 char buffer1[14];
yfkwok 2:464c7e62d97d 172 sprintf(buffer1,"%2d / %2d",p1_score, total);
yfkwok 2:464c7e62d97d 173 lcd.printString(buffer1,WIDTH/2 - 20,1); // font is 8 wide, so leave 4 pixel gape from middle assuming two digits
yfkwok 2:464c7e62d97d 174 return p1_score;
yfkwok 2:464c7e62d97d 175 }
yfkwok 2:464c7e62d97d 176
yfkwok 2:464c7e62d97d 177 void Game_one::set_count(int count)
yfkwok 2:464c7e62d97d 178 {
yfkwok 2:464c7e62d97d 179 _count = count;
yfkwok 2:464c7e62d97d 180 }
yfkwok 2:464c7e62d97d 181
yfkwok 2:464c7e62d97d 182 int Game_one::get_count()
yfkwok 2:464c7e62d97d 183 {
yfkwok 2:464c7e62d97d 184 int count = _count;
yfkwok 2:464c7e62d97d 185 return count;
yfkwok 2:464c7e62d97d 186 }
yfkwok 2:464c7e62d97d 187
yfkwok 2:464c7e62d97d 188 void Game_one::set_alt(int alt)
yfkwok 2:464c7e62d97d 189 {
yfkwok 2:464c7e62d97d 190 _alt = alt;
yfkwok 2:464c7e62d97d 191 }
yfkwok 2:464c7e62d97d 192
yfkwok 2:464c7e62d97d 193 int Game_one::update_alt()
yfkwok 2:464c7e62d97d 194 {
yfkwok 17:5d8ff39a0e49 195 // _alt parameter to alter the character sprite to create run animation
yfkwok 2:464c7e62d97d 196 if(_alt < 4){_alt = _alt++;}
yfkwok 2:464c7e62d97d 197 else {_alt=0;}
yfkwok 2:464c7e62d97d 198 int alt = _alt;
yfkwok 2:464c7e62d97d 199 return alt;
yfkwok 2:464c7e62d97d 200 }
yfkwok 2:464c7e62d97d 201
yfkwok 2:464c7e62d97d 202 void Game_one::gameover(N5110 &lcd, Gamepad &pad)
yfkwok 2:464c7e62d97d 203 {
yfkwok 17:5d8ff39a0e49 204 // Gameover screen instructions
yfkwok 2:464c7e62d97d 205 while(pad.check_event(Gamepad::B_PRESSED) == false) {
yfkwok 2:464c7e62d97d 206 lcd.clear();
yfkwok 2:464c7e62d97d 207 lcd.printString("You rushed ",0,0);
yfkwok 2:464c7e62d97d 208 lcd.printString("into a block!",0,1);
yfkwok 2:464c7e62d97d 209 lcd.printString("You are late",0,2);
yfkwok 2:464c7e62d97d 210 lcd.printString("for class!",0,3);
yfkwok 2:464c7e62d97d 211 lcd.printString("Press B",0,5);
yfkwok 2:464c7e62d97d 212 lcd.refresh();
yfkwok 2:464c7e62d97d 213 wait(0.1);
yfkwok 2:464c7e62d97d 214 }
yfkwok 2:464c7e62d97d 215 _count = 10;
yfkwok 4:5bc9c4363d31 216 }
yfkwok 4:5bc9c4363d31 217
yfkwok 4:5bc9c4363d31 218 void Game_one::intro(Gamepad &pad, N5110 &lcd)
yfkwok 4:5bc9c4363d31 219 {
yfkwok 17:5d8ff39a0e49 220 // Game 1 instruction pages
yfkwok 4:5bc9c4363d31 221 Page currentPage = PAGE_1;
yfkwok 4:5bc9c4363d31 222 int fps = 8.0;
yfkwok 11:5a6b9dffd78a 223 int instruct_data[4][7] = {
yfkwok 11:5a6b9dffd78a 224 {1,1,1,1,1,1,1},
yfkwok 11:5a6b9dffd78a 225 {0,1,1,1,1,1,0},
yfkwok 11:5a6b9dffd78a 226 {0,0,1,1,1,0,0},
yfkwok 11:5a6b9dffd78a 227 {0,0,0,1,0,0,0},
yfkwok 4:5bc9c4363d31 228 };
yfkwok 4:5bc9c4363d31 229
yfkwok 4:5bc9c4363d31 230 while(pad.check_event(Gamepad::A_PRESSED) == false){
yfkwok 4:5bc9c4363d31 231 switch (currentPage) {
yfkwok 4:5bc9c4363d31 232 case PAGE_1:
yfkwok 4:5bc9c4363d31 233 lcd.clear();
yfkwok 4:5bc9c4363d31 234 lcd.printString("Squirtle",0,0);
yfkwok 4:5bc9c4363d31 235 lcd.printString("is rushing",0,1);
yfkwok 4:5bc9c4363d31 236 lcd.printString("to his lecture",0,2);
yfkwok 4:5bc9c4363d31 237 lcd.printString("Collect coins",0,4);
yfkwok 11:5a6b9dffd78a 238 lcd.drawSprite(39, 44, 4, 7, (int *)instruct_data);
yfkwok 4:5bc9c4363d31 239 lcd.refresh();
yfkwok 4:5bc9c4363d31 240 if(pad.get_direction() == S){currentPage = PAGE_2;}
yfkwok 4:5bc9c4363d31 241 wait(1.0f/fps);
yfkwok 4:5bc9c4363d31 242 break;
yfkwok 4:5bc9c4363d31 243 case PAGE_2:
yfkwok 4:5bc9c4363d31 244 lcd.clear();
yfkwok 4:5bc9c4363d31 245 lcd.printString("so he can have",0,0);
yfkwok 4:5bc9c4363d31 246 lcd.printString("lunch and ",0,1);
yfkwok 4:5bc9c4363d31 247 lcd.printString("reach the",0,2);
yfkwok 4:5bc9c4363d31 248 lcd.printString("classroom in",0,3);
yfkwok 4:5bc9c4363d31 249 lcd.printString("time by ",0,4);
yfkwok 11:5a6b9dffd78a 250 lcd.drawSprite(39, 44, 4, 7, (int *)instruct_data);
yfkwok 4:5bc9c4363d31 251 lcd.refresh();
yfkwok 4:5bc9c4363d31 252 if(pad.get_direction() == S){currentPage = PAGE_3;}
yfkwok 17:5d8ff39a0e49 253 if(pad.get_direction() == N){currentPage = PAGE_1;}
yfkwok 4:5bc9c4363d31 254 wait(1.0f/fps);
yfkwok 4:5bc9c4363d31 255 break;
yfkwok 4:5bc9c4363d31 256 case PAGE_3:
yfkwok 4:5bc9c4363d31 257 lcd.clear();
yfkwok 4:5bc9c4363d31 258 lcd.printString("avoiding the",0,0);
yfkwok 17:5d8ff39a0e49 259 lcd.printString("blocks.",0,1);
yfkwok 17:5d8ff39a0e49 260 lcd.printString("Collect more",0,2);
yfkwok 17:5d8ff39a0e49 261 lcd.printString("than 7 coins",0,3);
yfkwok 17:5d8ff39a0e49 262 lcd.printString("to complete",0,4);
yfkwok 17:5d8ff39a0e49 263 lcd.drawSprite(39, 44, 4, 7, (int *)instruct_data);
yfkwok 17:5d8ff39a0e49 264 lcd.refresh();
yfkwok 17:5d8ff39a0e49 265 if(pad.get_direction() == S){currentPage = PAGE_4;}
yfkwok 17:5d8ff39a0e49 266 if(pad.get_direction() == N){currentPage = PAGE_2;}
yfkwok 17:5d8ff39a0e49 267 wait(1.0f/fps);
yfkwok 17:5d8ff39a0e49 268 break;
yfkwok 17:5d8ff39a0e49 269 case PAGE_4:
yfkwok 17:5d8ff39a0e49 270 lcd.clear();
yfkwok 17:5d8ff39a0e49 271 lcd.printString("the mission",0,0);
yfkwok 17:5d8ff39a0e49 272 lcd.printString("successfully!",0,1);
yfkwok 4:5bc9c4363d31 273 lcd.printString("Press A",0,5);
yfkwok 4:5bc9c4363d31 274 lcd.refresh();
yfkwok 17:5d8ff39a0e49 275 if(pad.get_direction() == N){currentPage = PAGE_3;}
yfkwok 4:5bc9c4363d31 276 wait(1.0f/fps);
yfkwok 17:5d8ff39a0e49 277 break;
yfkwok 4:5bc9c4363d31 278
yfkwok 4:5bc9c4363d31 279 }
yfkwok 4:5bc9c4363d31 280 }
yfkwok 5:bc0691d02fd5 281 }
yfkwok 5:bc0691d02fd5 282