ELEC2645 (2018/19) / Mbed 2 deprecated el17ajf

Dependencies:   mbed

Fork of el17ajf by Angus Findlay

Committer:
el17ajf
Date:
Tue Apr 23 16:38:32 2019 +0000
Revision:
34:0bb0d010e755
Parent:
31:69fedaa9b171
Child:
36:c854f1f51f43
Documented Block class

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 2:0b5e289ef905 43 Game::~Game() {
el17ajf 6:a54df561f442 44
el17ajf 2:0b5e289ef905 45 }
el17ajf 2:0b5e289ef905 46
el17ajf 2:0b5e289ef905 47 void Game::update() {
el17ajf 15:afeefa3ceb61 48 if (frames++ > last_move_frame + move_frames) {
el17ajf 15:afeefa3ceb61 49 last_move_frame = frames;
el17ajf 15:afeefa3ceb61 50 moveCurrentTetrominoDown();
el17ajf 15:afeefa3ceb61 51 }
el17ajf 15:afeefa3ceb61 52
el17ajf 9:3a7776a29a11 53 if (Input::buttonHit(Input::LEFT)) {
el17ajf 31:69fedaa9b171 54 if (grid.isSpaceForTetromino(current_tetromino.movedLeft())) {
el17ajf 31:69fedaa9b171 55 current_tetromino = current_tetromino.movedLeft();
el17ajf 4:aa433f9865a6 56 }
el17ajf 4:aa433f9865a6 57 }
el17ajf 9:3a7776a29a11 58 if (Input::buttonHit(Input::RIGHT)) {
el17ajf 31:69fedaa9b171 59 if (grid.isSpaceForTetromino(current_tetromino.movedRight())) {
el17ajf 31:69fedaa9b171 60 current_tetromino = current_tetromino.movedRight();
el17ajf 9:3a7776a29a11 61 }
el17ajf 9:3a7776a29a11 62 }
el17ajf 9:3a7776a29a11 63 if (Input::buttonHit(Input::UP)) {
el17ajf 31:69fedaa9b171 64 if (grid.isSpaceForTetromino(current_tetromino.rotatedClockwise())) {
el17ajf 31:69fedaa9b171 65 current_tetromino = current_tetromino.rotatedClockwise();
el17ajf 9:3a7776a29a11 66 }
el17ajf 9:3a7776a29a11 67 }
el17ajf 9:3a7776a29a11 68 if (Input::buttonHit(Input::DOWN)) {
el17ajf 9:3a7776a29a11 69 dropCurrentTetromino();
el17ajf 9:3a7776a29a11 70 }
el17ajf 22:0a474f074553 71 if (Input::buttonHit(Input::START)) {
el17ajf 22:0a474f074553 72 Menus::MenuManager::add(new Menus::PausedMenu());
el17ajf 22:0a474f074553 73 }
el17ajf 4:aa433f9865a6 74 }
el17ajf 4:aa433f9865a6 75
el17ajf 31:69fedaa9b171 76 void Game::addScore(int rows_cleared) {
el17ajf 31:69fedaa9b171 77 score += score_for_row * rows_cleared * rows_cleared;
el17ajf 28:e09b7ac11dea 78 move_frames = Math::lerp(move_frames, 1, (double)score/9999);
el17ajf 19:370d83a8dc33 79 if (score > 9999) {
el17ajf 19:370d83a8dc33 80 score = 9999;
el17ajf 19:370d83a8dc33 81 }
el17ajf 19:370d83a8dc33 82 }
el17ajf 19:370d83a8dc33 83
el17ajf 7:2e37bad816cb 84 void Game::moveCurrentTetrominoDown() {
el17ajf 31:69fedaa9b171 85 if (grid.isSpaceForTetromino(current_tetromino.movedDown())) {
el17ajf 31:69fedaa9b171 86 current_tetromino = current_tetromino.movedDown();
el17ajf 4:aa433f9865a6 87 } else {
el17ajf 31:69fedaa9b171 88 int rows_cleared = grid.placeTetromino(current_tetromino);
el17ajf 31:69fedaa9b171 89 if (rows_cleared != 0) {
el17ajf 31:69fedaa9b171 90 addScore(rows_cleared);
el17ajf 19:370d83a8dc33 91 }
el17ajf 31:69fedaa9b171 92 current_tetromino = Tetromino::getTetrominoOfType(next_tetromino_type);
el17ajf 15:afeefa3ceb61 93 // centre it
el17ajf 31:69fedaa9b171 94 current_tetromino = current_tetromino.teleportedTo(start_x);
el17ajf 31:69fedaa9b171 95 if (!grid.isSpaceForTetromino(current_tetromino)) {
el17ajf 15:afeefa3ceb61 96 // no space for tetromino, game over
el17ajf 15:afeefa3ceb61 97 gameOver();
el17ajf 15:afeefa3ceb61 98 }
el17ajf 31:69fedaa9b171 99 next_tetromino_type = Tetromino::getRandomTetrominoType();
el17ajf 4:aa433f9865a6 100 }
el17ajf 2:0b5e289ef905 101 }
el17ajf 2:0b5e289ef905 102
el17ajf 7:2e37bad816cb 103 void Game::dropCurrentTetromino() {
el17ajf 31:69fedaa9b171 104 while (grid.isSpaceForTetromino(current_tetromino.movedDown())) {
el17ajf 19:370d83a8dc33 105 score += 1;
el17ajf 31:69fedaa9b171 106 current_tetromino = current_tetromino.movedDown();
el17ajf 9:3a7776a29a11 107 }
el17ajf 9:3a7776a29a11 108 moveCurrentTetrominoDown();
el17ajf 29:d59fbe128d1f 109 Graphics::Game::shake(0, 3);
el17ajf 7:2e37bad816cb 110 }
el17ajf 7:2e37bad816cb 111
el17ajf 2:0b5e289ef905 112 void Game::draw() {
el17ajf 31:69fedaa9b171 113 current_tetromino.draw();
el17ajf 4:aa433f9865a6 114 grid.draw();
el17ajf 2:0b5e289ef905 115 }
el17ajf 15:afeefa3ceb61 116
el17ajf 27:2ed9e3c9f4e9 117 void Game::gameOver() {
el17ajf 31:69fedaa9b171 118 Prefs::getInstance()->setKey(Prefs::LAST_PLAYER, player_number);
el17ajf 27:2ed9e3c9f4e9 119 Prefs::getInstance()->setKey(Prefs::LAST_SCORE, score);
el17ajf 28:e09b7ac11dea 120 updateLeaderboard();
el17ajf 27:2ed9e3c9f4e9 121 Menus::MenuManager::add(new Menus::GameOverMenu());
el17ajf 27:2ed9e3c9f4e9 122 }
el17ajf 27:2ed9e3c9f4e9 123
el17ajf 27:2ed9e3c9f4e9 124 void Game::updateLeaderboard() {
el17ajf 27:2ed9e3c9f4e9 125 for (int i = 0; i <= Prefs::HIGHSCORE3; i++) {
el17ajf 21:62d2b5b73160 126 if (score > Prefs::getInstance()->getKey((Prefs::Key)i)) {
el17ajf 28:e09b7ac11dea 127 // move all scores down
el17ajf 28:e09b7ac11dea 128 for (int j = Prefs::HIGHSCORE3 - 1; j >= i; j--) {
el17ajf 27:2ed9e3c9f4e9 129 Prefs::getInstance()->setKey(
el17ajf 27:2ed9e3c9f4e9 130 (Prefs::Key)(j + 1),
el17ajf 27:2ed9e3c9f4e9 131 Prefs::getInstance()->getKey((Prefs::Key)i)
el17ajf 27:2ed9e3c9f4e9 132 );
el17ajf 27:2ed9e3c9f4e9 133 Prefs::getInstance()->setKey(
el17ajf 27:2ed9e3c9f4e9 134 (Prefs::Key)((j + 1) + 3),
el17ajf 27:2ed9e3c9f4e9 135 Prefs::getInstance()->getKey((Prefs::Key)(i + 3))
el17ajf 27:2ed9e3c9f4e9 136 );
el17ajf 27:2ed9e3c9f4e9 137 }
el17ajf 28:e09b7ac11dea 138 // set ith score to the current score
el17ajf 21:62d2b5b73160 139 Prefs::getInstance()->setKey((Prefs::Key)i, score);
el17ajf 31:69fedaa9b171 140 Prefs::getInstance()->setKey((Prefs::Key)(i + 3), player_number);
el17ajf 27:2ed9e3c9f4e9 141 break;
el17ajf 19:370d83a8dc33 142 }
el17ajf 19:370d83a8dc33 143 }
el17ajf 19:370d83a8dc33 144 }