ELEC2645 (2018/19) / Mbed 2 deprecated el17ajf

Dependencies:   mbed

Fork of el17ajf by Angus Findlay

Committer:
el17ajf
Date:
Wed Apr 24 08:06:29 2019 +0000
Revision:
36:c854f1f51f43
Parent:
34:0bb0d010e755
Child:
39:e128071a95b0
Documented all classes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17ajf 4:aa433f9865a6 1 #include "Game.h"
el17ajf 28:e09b7ac11dea 2 #include "Graphics.h"
el17ajf 6:a54df561f442 3 #include "Input.h"
el17ajf 18:24ce897024d0 4 #include "Engine.h"
el17ajf 21:62d2b5b73160 5 #include "MenuManager.h"
el17ajf 21:62d2b5b73160 6 #include "GameOverMenu.h"
el17ajf 22:0a474f074553 7 #include "PausedMenu.h"
el17ajf 19:370d83a8dc33 8 #include "Prefs.h"
el17ajf 28:e09b7ac11dea 9 #include "Math.h"
el17ajf 2:0b5e289ef905 10
el17ajf 34:0bb0d010e755 11 Game::Game(Difficulty difficulty) :
el17ajf 34:0bb0d010e755 12 score(0),
el17ajf 34:0bb0d010e755 13 next_tetromino_type(Tetromino::getRandomTetrominoType()),
el17ajf 34:0bb0d010e755 14 current_tetromino(
el17ajf 34:0bb0d010e755 15 Tetromino::getTetrominoOfType(Tetromino::getRandomTetrominoType())),
el17ajf 34:0bb0d010e755 16 frames(0),
el17ajf 34:0bb0d010e755 17 last_move_frame(0),
el17ajf 34:0bb0d010e755 18 start_x(Grid::GRID_WIDTH / 2 - 1),
el17ajf 34:0bb0d010e755 19 player_number(Prefs::getInstance()->getKey(Prefs::LAST_PLAYER)) {
el17ajf 34:0bb0d010e755 20 current_tetromino = current_tetromino.teleportedTo(start_x);
el17ajf 17:cc448ab7266f 21 switch (difficulty) {
el17ajf 17:cc448ab7266f 22 case EASY:
el17ajf 18:24ce897024d0 23 move_frames = Engine::FPS / 6; // ~ 160ms
el17ajf 31:69fedaa9b171 24 score_for_row = 6;
el17ajf 17:cc448ab7266f 25 break;
el17ajf 17:cc448ab7266f 26 case MEDIUM:
el17ajf 18:24ce897024d0 27 move_frames = Engine::FPS / 9; // ~ 110ms
el17ajf 31:69fedaa9b171 28 score_for_row = 8;
el17ajf 17:cc448ab7266f 29 break;
el17ajf 17:cc448ab7266f 30 case HARD:
el17ajf 18:24ce897024d0 31 move_frames = Engine::FPS / 12; // ~ 80ms
el17ajf 31:69fedaa9b171 32 score_for_row = 10;
el17ajf 17:cc448ab7266f 33 break;
el17ajf 17:cc448ab7266f 34 }
el17ajf 34:0bb0d010e755 35
el17ajf 31:69fedaa9b171 36 if (player_number == Prefs::EMPTY) {
el17ajf 31:69fedaa9b171 37 player_number = 1;
el17ajf 27:2ed9e3c9f4e9 38 } else {
el17ajf 31:69fedaa9b171 39 player_number += 1;
el17ajf 27:2ed9e3c9f4e9 40 }
el17ajf 2:0b5e289ef905 41 }
el17ajf 2:0b5e289ef905 42
el17ajf 36:c854f1f51f43 43 Game::~Game() {}
el17ajf 2:0b5e289ef905 44
el17ajf 2:0b5e289ef905 45 void Game::update() {
el17ajf 15:afeefa3ceb61 46 if (frames++ > last_move_frame + move_frames) {
el17ajf 15:afeefa3ceb61 47 last_move_frame = frames;
el17ajf 15:afeefa3ceb61 48 moveCurrentTetrominoDown();
el17ajf 15:afeefa3ceb61 49 }
el17ajf 15:afeefa3ceb61 50
el17ajf 9:3a7776a29a11 51 if (Input::buttonHit(Input::LEFT)) {
el17ajf 31:69fedaa9b171 52 if (grid.isSpaceForTetromino(current_tetromino.movedLeft())) {
el17ajf 31:69fedaa9b171 53 current_tetromino = current_tetromino.movedLeft();
el17ajf 4:aa433f9865a6 54 }
el17ajf 4:aa433f9865a6 55 }
el17ajf 9:3a7776a29a11 56 if (Input::buttonHit(Input::RIGHT)) {
el17ajf 31:69fedaa9b171 57 if (grid.isSpaceForTetromino(current_tetromino.movedRight())) {
el17ajf 31:69fedaa9b171 58 current_tetromino = current_tetromino.movedRight();
el17ajf 9:3a7776a29a11 59 }
el17ajf 9:3a7776a29a11 60 }
el17ajf 9:3a7776a29a11 61 if (Input::buttonHit(Input::UP)) {
el17ajf 31:69fedaa9b171 62 if (grid.isSpaceForTetromino(current_tetromino.rotatedClockwise())) {
el17ajf 31:69fedaa9b171 63 current_tetromino = current_tetromino.rotatedClockwise();
el17ajf 9:3a7776a29a11 64 }
el17ajf 9:3a7776a29a11 65 }
el17ajf 9:3a7776a29a11 66 if (Input::buttonHit(Input::DOWN)) {
el17ajf 9:3a7776a29a11 67 dropCurrentTetromino();
el17ajf 9:3a7776a29a11 68 }
el17ajf 22:0a474f074553 69 if (Input::buttonHit(Input::START)) {
el17ajf 22:0a474f074553 70 Menus::MenuManager::add(new Menus::PausedMenu());
el17ajf 22:0a474f074553 71 }
el17ajf 4:aa433f9865a6 72 }
el17ajf 4:aa433f9865a6 73
el17ajf 31:69fedaa9b171 74 void Game::addScore(int rows_cleared) {
el17ajf 31:69fedaa9b171 75 score += score_for_row * rows_cleared * rows_cleared;
el17ajf 28:e09b7ac11dea 76 move_frames = Math::lerp(move_frames, 1, (double)score/9999);
el17ajf 19:370d83a8dc33 77 if (score > 9999) {
el17ajf 19:370d83a8dc33 78 score = 9999;
el17ajf 19:370d83a8dc33 79 }
el17ajf 19:370d83a8dc33 80 }
el17ajf 19:370d83a8dc33 81
el17ajf 7:2e37bad816cb 82 void Game::moveCurrentTetrominoDown() {
el17ajf 31:69fedaa9b171 83 if (grid.isSpaceForTetromino(current_tetromino.movedDown())) {
el17ajf 31:69fedaa9b171 84 current_tetromino = current_tetromino.movedDown();
el17ajf 4:aa433f9865a6 85 } else {
el17ajf 31:69fedaa9b171 86 int rows_cleared = grid.placeTetromino(current_tetromino);
el17ajf 31:69fedaa9b171 87 if (rows_cleared != 0) {
el17ajf 31:69fedaa9b171 88 addScore(rows_cleared);
el17ajf 19:370d83a8dc33 89 }
el17ajf 31:69fedaa9b171 90 current_tetromino = Tetromino::getTetrominoOfType(next_tetromino_type);
el17ajf 15:afeefa3ceb61 91 // centre it
el17ajf 31:69fedaa9b171 92 current_tetromino = current_tetromino.teleportedTo(start_x);
el17ajf 31:69fedaa9b171 93 if (!grid.isSpaceForTetromino(current_tetromino)) {
el17ajf 15:afeefa3ceb61 94 // no space for tetromino, game over
el17ajf 15:afeefa3ceb61 95 gameOver();
el17ajf 15:afeefa3ceb61 96 }
el17ajf 31:69fedaa9b171 97 next_tetromino_type = Tetromino::getRandomTetrominoType();
el17ajf 4:aa433f9865a6 98 }
el17ajf 2:0b5e289ef905 99 }
el17ajf 2:0b5e289ef905 100
el17ajf 7:2e37bad816cb 101 void Game::dropCurrentTetromino() {
el17ajf 31:69fedaa9b171 102 while (grid.isSpaceForTetromino(current_tetromino.movedDown())) {
el17ajf 19:370d83a8dc33 103 score += 1;
el17ajf 31:69fedaa9b171 104 current_tetromino = current_tetromino.movedDown();
el17ajf 9:3a7776a29a11 105 }
el17ajf 9:3a7776a29a11 106 moveCurrentTetrominoDown();
el17ajf 29:d59fbe128d1f 107 Graphics::Game::shake(0, 3);
el17ajf 7:2e37bad816cb 108 }
el17ajf 7:2e37bad816cb 109
el17ajf 2:0b5e289ef905 110 void Game::draw() {
el17ajf 31:69fedaa9b171 111 current_tetromino.draw();
el17ajf 4:aa433f9865a6 112 grid.draw();
el17ajf 2:0b5e289ef905 113 }
el17ajf 15:afeefa3ceb61 114
el17ajf 27:2ed9e3c9f4e9 115 void Game::gameOver() {
el17ajf 31:69fedaa9b171 116 Prefs::getInstance()->setKey(Prefs::LAST_PLAYER, player_number);
el17ajf 27:2ed9e3c9f4e9 117 Prefs::getInstance()->setKey(Prefs::LAST_SCORE, score);
el17ajf 28:e09b7ac11dea 118 updateLeaderboard();
el17ajf 27:2ed9e3c9f4e9 119 Menus::MenuManager::add(new Menus::GameOverMenu());
el17ajf 27:2ed9e3c9f4e9 120 }
el17ajf 27:2ed9e3c9f4e9 121
el17ajf 27:2ed9e3c9f4e9 122 void Game::updateLeaderboard() {
el17ajf 27:2ed9e3c9f4e9 123 for (int i = 0; i <= Prefs::HIGHSCORE3; i++) {
el17ajf 21:62d2b5b73160 124 if (score > Prefs::getInstance()->getKey((Prefs::Key)i)) {
el17ajf 28:e09b7ac11dea 125 // move all scores down
el17ajf 28:e09b7ac11dea 126 for (int j = Prefs::HIGHSCORE3 - 1; j >= i; j--) {
el17ajf 27:2ed9e3c9f4e9 127 Prefs::getInstance()->setKey(
el17ajf 27:2ed9e3c9f4e9 128 (Prefs::Key)(j + 1),
el17ajf 27:2ed9e3c9f4e9 129 Prefs::getInstance()->getKey((Prefs::Key)i)
el17ajf 27:2ed9e3c9f4e9 130 );
el17ajf 27:2ed9e3c9f4e9 131 Prefs::getInstance()->setKey(
el17ajf 27:2ed9e3c9f4e9 132 (Prefs::Key)((j + 1) + 3),
el17ajf 27:2ed9e3c9f4e9 133 Prefs::getInstance()->getKey((Prefs::Key)(i + 3))
el17ajf 27:2ed9e3c9f4e9 134 );
el17ajf 27:2ed9e3c9f4e9 135 }
el17ajf 28:e09b7ac11dea 136 // set ith score to the current score
el17ajf 21:62d2b5b73160 137 Prefs::getInstance()->setKey((Prefs::Key)i, score);
el17ajf 31:69fedaa9b171 138 Prefs::getInstance()->setKey((Prefs::Key)(i + 3), player_number);
el17ajf 27:2ed9e3c9f4e9 139 break;
el17ajf 19:370d83a8dc33 140 }
el17ajf 19:370d83a8dc33 141 }
el17ajf 19:370d83a8dc33 142 }