Kaif Kutchwala 201267448 ELEC2645 Project

Dependencies:   mbed

Committer:
KaifK
Date:
Tue May 19 01:17:31 2020 +0000
Revision:
16:1f196a0e12be
Parent:
15:5bf3f951d337
Child:
17:2fbe40177b9c
GAME COMPLETE, MENU SCREEN DONE, only how-to left + formatting print statements and adding test functions.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
KaifK 4:08a0ff6668df 1 #include "Game.h"
KaifK 8:5ede90f99a27 2
KaifK 9:e6566d09f087 3 Game::Game(N5110 &lcd, Gamepad &pad, Ball &ball) {
KaifK 9:e6566d09f087 4 _lcd = &lcd;
KaifK 9:e6566d09f087 5 _pad = &pad;
KaifK 9:e6566d09f087 6 _ball = &ball;
KaifK 9:e6566d09f087 7 }
KaifK 4:08a0ff6668df 8 Game::~Game() {}
KaifK 4:08a0ff6668df 9
KaifK 4:08a0ff6668df 10 void Game::init() {
KaifK 4:08a0ff6668df 11 _is_goal = false;
KaifK 8:5ede90f99a27 12 _lives = 3;
KaifK 16:1f196a0e12be 13 _new_lives_threshold = 0;
KaifK 12:ca7329a41fc5 14 _level = 1;
KaifK 8:5ede90f99a27 15 _score = 0;
KaifK 16:1f196a0e12be 16 _highscore = 0;
KaifK 9:e6566d09f087 17 _speed = 0.30f;
KaifK 16:1f196a0e12be 18 _new_speed_threshold = 0.00f;
KaifK 9:e6566d09f087 19 _x_val = 42.00f;
KaifK 9:e6566d09f087 20 _y_val = 0.00f;
KaifK 7:2a3b566aedd3 21 _shot_x = 0;
KaifK 7:2a3b566aedd3 22 _shot_y = 0;
KaifK 4:08a0ff6668df 23 }
KaifK 9:e6566d09f087 24 void Game::play() {
KaifK 16:1f196a0e12be 25 updateLives(); //initial update
KaifK 16:1f196a0e12be 26 // if all live are lost game ends
KaifK 16:1f196a0e12be 27 while(_lives > 0) {
KaifK 15:5bf3f951d337 28 _level = random_level_gen(10); //generate random level
KaifK 12:ca7329a41fc5 29 printf("Level (in game) = %d \n", _level);
KaifK 15:5bf3f951d337 30 _ball->set_level(_level); //set level
KaifK 15:5bf3f951d337 31 readInput(); //take input
KaifK 15:5bf3f951d337 32 _ball->isGoal(_level, _shot_x, _shot_y); //check if goal
KaifK 16:1f196a0e12be 33 _is_goal = _ball->get_goal();
KaifK 15:5bf3f951d337 34 //goal scored
KaifK 16:1f196a0e12be 35 if(_is_goal) {
KaifK 12:ca7329a41fc5 36 _score++;
KaifK 12:ca7329a41fc5 37 }
KaifK 15:5bf3f951d337 38 //goal missed
KaifK 15:5bf3f951d337 39 else {
KaifK 15:5bf3f951d337 40 // ball should not go through obstacle hence y value limited to 21
KaifK 15:5bf3f951d337 41 // this is done after calculations to ensure accurate results
KaifK 15:5bf3f951d337 42 if(_shot_y >= 6) { _shot_y = 21; }
KaifK 15:5bf3f951d337 43 _lives--;
KaifK 15:5bf3f951d337 44 }
KaifK 16:1f196a0e12be 45 _ball->playShot(_shot_x, _shot_y);
KaifK 16:1f196a0e12be 46 print_goal_message((int)_is_goal);
KaifK 16:1f196a0e12be 47 updateSpeed();
KaifK 16:1f196a0e12be 48 updateLives();
KaifK 16:1f196a0e12be 49 if(_score > _highscore) { set_highscore(_score); }
KaifK 12:ca7329a41fc5 50 }
KaifK 16:1f196a0e12be 51 _pad->leds(0.0); //turn of all leds
KaifK 8:5ede90f99a27 52 }
KaifK 7:2a3b566aedd3 53
KaifK 9:e6566d09f087 54 void Game::readInput() {
KaifK 16:1f196a0e12be 55 _pad->reset_buttons(); //forced debounce
KaifK 9:e6566d09f087 56 _x_val = 42; //reset x_val
KaifK 9:e6566d09f087 57 _y_val = 0; //reset y_val
KaifK 9:e6566d09f087 58 while(!_pad->A_pressed()) {
KaifK 9:e6566d09f087 59 pointer_input();
KaifK 7:2a3b566aedd3 60 }
KaifK 16:1f196a0e12be 61 _pad->reset_buttons(); //forced debounce
KaifK 9:e6566d09f087 62 wait(0.1);
KaifK 9:e6566d09f087 63 while(!_pad->B_pressed()) {
KaifK 9:e6566d09f087 64 power_meter_input();
KaifK 6:09a555c0d997 65 }
KaifK 9:e6566d09f087 66 wait(0.1);
KaifK 8:5ede90f99a27 67 convert_to_shot_x();
KaifK 7:2a3b566aedd3 68 convert_to_shot_y();
KaifK 9:e6566d09f087 69 printf("x val = %.2f \n",_x_val);
KaifK 7:2a3b566aedd3 70 printf("shot_x val = %d \n",_shot_x);
KaifK 9:e6566d09f087 71 printf("y val = %.2f \n",_y_val);
KaifK 7:2a3b566aedd3 72 printf("shot_y val = %d \n",_shot_y);
KaifK 7:2a3b566aedd3 73
KaifK 6:09a555c0d997 74 }
KaifK 9:e6566d09f087 75 void Game::updateLives() {
KaifK 16:1f196a0e12be 76 // +1 life if score hits a multiple of 5 provided less than 3 lives left
KaifK 16:1f196a0e12be 77 //update threshold so lives don't increase if score stays same
KaifK 16:1f196a0e12be 78 if(_score % 5 == 0 && _score != _new_lives_threshold && _lives != 3) {
KaifK 16:1f196a0e12be 79 _lives++;
KaifK 16:1f196a0e12be 80 _new_lives_threshold = _score;
KaifK 16:1f196a0e12be 81 }
KaifK 16:1f196a0e12be 82 printf("Lives = %d \n", _lives);
KaifK 15:5bf3f951d337 83 _pad->leds(0.0);
KaifK 5:ed71996c0534 84 switch(_lives){
KaifK 14:652fd55aebcf 85 case 0:
KaifK 14:652fd55aebcf 86 break;
KaifK 5:ed71996c0534 87 case 1:
KaifK 9:e6566d09f087 88 _pad->led(1,1.0); //red leds only
KaifK 9:e6566d09f087 89 _pad->led(4,1.0);
KaifK 5:ed71996c0534 90 break;
KaifK 5:ed71996c0534 91 case 2:
KaifK 9:e6566d09f087 92 _pad->led(1,1.0); //red and yellow leds
KaifK 9:e6566d09f087 93 _pad->led(2,1.0);
KaifK 9:e6566d09f087 94 _pad->led(4,1.0);
KaifK 9:e6566d09f087 95 _pad->led(5,1.0);
KaifK 5:ed71996c0534 96 break;
KaifK 5:ed71996c0534 97 case 3:
KaifK 9:e6566d09f087 98 _pad->leds(1.0);
KaifK 5:ed71996c0534 99 break;
KaifK 5:ed71996c0534 100 default:
KaifK 7:2a3b566aedd3 101 error("Invalid Number of Lives");
KaifK 5:ed71996c0534 102 break;
KaifK 5:ed71996c0534 103 }
KaifK 5:ed71996c0534 104 }
KaifK 9:e6566d09f087 105 void Game::updateScore() {
KaifK 5:ed71996c0534 106 char buffer[12];
KaifK 5:ed71996c0534 107 sprintf(buffer,"%d",_score);
KaifK 9:e6566d09f087 108 _lcd->printString(buffer,2,5);
KaifK 9:e6566d09f087 109 }
KaifK 9:e6566d09f087 110 void Game::updateSpeed() {
KaifK 9:e6566d09f087 111 if(abs(_speed) <= 2) { // max speed = 1
KaifK 16:1f196a0e12be 112 if(_score % 3 == 0 && _score != _new_speed_threshold) {
KaifK 16:1f196a0e12be 113 _speed = abs(_speed) + 0.20f;
KaifK 16:1f196a0e12be 114 //update threshold so speed does not increase if score stays same
KaifK 16:1f196a0e12be 115 _new_speed_threshold = _score;
KaifK 9:e6566d09f087 116 }
KaifK 9:e6566d09f087 117 }
KaifK 9:e6566d09f087 118 printf("speed = %.2f \n", _speed);
KaifK 9:e6566d09f087 119 printf("score = %d \n", _score);
KaifK 5:ed71996c0534 120 }
KaifK 16:1f196a0e12be 121 void Game::set_highscore (int score) {
KaifK 16:1f196a0e12be 122 _highscore = score;
KaifK 16:1f196a0e12be 123 }
KaifK 16:1f196a0e12be 124 int Game::get_highscore() {
KaifK 16:1f196a0e12be 125 int val = _highscore;
KaifK 16:1f196a0e12be 126 return val;
KaifK 16:1f196a0e12be 127 }
KaifK 9:e6566d09f087 128 void Game::pointer_input() {
KaifK 9:e6566d09f087 129 updateScore();
KaifK 12:ca7329a41fc5 130 _ball->displayBackground();
KaifK 9:e6566d09f087 131 _ball->init();
KaifK 7:2a3b566aedd3 132 //draw aim pointer
KaifK 9:e6566d09f087 133 _lcd->drawLine(WIDTH / 2 - 5, 41, _x_val, HEIGHT / 2 + 7, 1);//left side
KaifK 9:e6566d09f087 134 _lcd->drawLine(WIDTH / 2 + 5, 41, _x_val, HEIGHT / 2 + 7, 1);//right side
KaifK 12:ca7329a41fc5 135 _lcd->drawLine(WIDTH / 2 + 5, 41, WIDTH / 2 - 5, 41, 1); //base
KaifK 7:2a3b566aedd3 136 _x_val += _speed;
KaifK 9:e6566d09f087 137 //printf("dir = %d \n", _speed);
KaifK 9:e6566d09f087 138 if((int)_x_val >= 70) { _speed = (-1 * _speed); }
KaifK 9:e6566d09f087 139 //pointer points out of screen i.e. 70=84 therefore, switch direction
KaifK 7:2a3b566aedd3 140 //value found through trial and error using print statement
KaifK 9:e6566d09f087 141 else if((int)_x_val <= 12) { _speed = abs(_speed); }
KaifK 9:e6566d09f087 142 _lcd->refresh();
KaifK 9:e6566d09f087 143 _lcd->clear();
KaifK 7:2a3b566aedd3 144 wait(0.01);
KaifK 7:2a3b566aedd3 145 }
KaifK 9:e6566d09f087 146 void Game::power_meter_input() {
KaifK 9:e6566d09f087 147 updateScore();
KaifK 12:ca7329a41fc5 148 _ball->displayBackground();
KaifK 12:ca7329a41fc5 149 _ball->init();
KaifK 7:2a3b566aedd3 150 //keep direction of pointer
KaifK 9:e6566d09f087 151 _lcd->drawLine(WIDTH / 2 - 5, 41, _x_val, HEIGHT / 2 + 7, 1);
KaifK 9:e6566d09f087 152 _lcd->drawLine(WIDTH / 2 + 5, 41, _x_val, HEIGHT / 2 + 7, 1);
KaifK 12:ca7329a41fc5 153 _lcd->drawLine(WIDTH / 2 + 5, 41, WIDTH / 2 - 5, 41, 1);
KaifK 7:2a3b566aedd3 154 //fill and empty power meter
KaifK 9:e6566d09f087 155 _lcd->drawRect(77,27,6,_y_val,FILL_BLACK);
KaifK 9:e6566d09f087 156 _y_val += _speed/2;
KaifK 9:e6566d09f087 157 if((int)_y_val >= 20) { _speed = (-1 * _speed); } //power meter full
KaifK 9:e6566d09f087 158 else if((int)_y_val <= 0) { _speed = abs(_speed); } // power meter empty
KaifK 9:e6566d09f087 159 _lcd->refresh();
KaifK 9:e6566d09f087 160 _lcd->clear();
KaifK 7:2a3b566aedd3 161 wait(0.01);
KaifK 7:2a3b566aedd3 162 }
KaifK 7:2a3b566aedd3 163 void Game::convert_to_shot_x() {
KaifK 9:e6566d09f087 164 //convert from range 12-70 (range of pointer) to 0-84 (range of screen)
KaifK 9:e6566d09f087 165 _shot_x = ((((int)_x_val - 12) * (84)) / (70 - 12));
KaifK 8:5ede90f99a27 166 //ball misses goal completely
KaifK 9:e6566d09f087 167 if(_shot_x <=7) { _shot_x = -20;}
KaifK 9:e6566d09f087 168 else if(_shot_x >=77) { _shot_x = 104;}
KaifK 7:2a3b566aedd3 169 }
KaifK 7:2a3b566aedd3 170 void Game::convert_to_shot_y() {
KaifK 9:e6566d09f087 171 _shot_y = ((((int)_y_val) * (24)) / (20));
KaifK 15:5bf3f951d337 172 if(_shot_y <= 2) {_shot_y = -6; } //shot too high
KaifK 9:e6566d09f087 173 else if (_shot_y >= 19) {_shot_y = 19; }//shot is low, but must enter goal
KaifK 9:e6566d09f087 174 }
KaifK 9:e6566d09f087 175 int Game::random_level_gen(int limit) {
KaifK 15:5bf3f951d337 176 int number = (rand() % limit) + 1; //random level between 1-10
KaifK 15:5bf3f951d337 177 return number;
KaifK 15:5bf3f951d337 178 }
KaifK 15:5bf3f951d337 179 void Game::print_goal_message(int n) {
KaifK 15:5bf3f951d337 180 _ball->displayBackground();
KaifK 15:5bf3f951d337 181 _lcd->drawRect(0,14,84,11,FILL_WHITE);//white background
KaifK 15:5bf3f951d337 182 _lcd->drawRect(0,14,84,11,FILL_TRANSPARENT);//white background
KaifK 15:5bf3f951d337 183
KaifK 15:5bf3f951d337 184 switch(n) {
KaifK 15:5bf3f951d337 185 case 0:
KaifK 15:5bf3f951d337 186 _lcd->printString("MISS!",30,2);
KaifK 15:5bf3f951d337 187 break;
KaifK 15:5bf3f951d337 188 case 1:
KaifK 15:5bf3f951d337 189 _lcd->printString("GOAL!",30,2);
KaifK 15:5bf3f951d337 190 break;
KaifK 15:5bf3f951d337 191 }
KaifK 15:5bf3f951d337 192 _lcd->refresh();
KaifK 15:5bf3f951d337 193 wait(1.5);
KaifK 7:2a3b566aedd3 194 }
KaifK 7:2a3b566aedd3 195
KaifK 8:5ede90f99a27 196