ELEC2645 (2018/19) / Mbed 2 deprecated el17ajf

Dependencies:   mbed

Fork of el17ajf by Angus Findlay

Committer:
el17ajf
Date:
Fri Apr 05 17:16:59 2019 +0000
Revision:
27:2ed9e3c9f4e9
Parent:
22:0a474f074553
Child:
28:e09b7ac11dea
Highscores working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el17ajf 4:aa433f9865a6 1 #include "Game.h"
el17ajf 6:a54df561f442 2 #include "Input.h"
el17ajf 18:24ce897024d0 3 #include "Engine.h"
el17ajf 21:62d2b5b73160 4 #include "MenuManager.h"
el17ajf 21:62d2b5b73160 5 #include "GameOverMenu.h"
el17ajf 22:0a474f074553 6 #include "PausedMenu.h"
el17ajf 19:370d83a8dc33 7 #include "Prefs.h"
el17ajf 2:0b5e289ef905 8
el17ajf 17:cc448ab7266f 9 Game::Game(Difficulty difficulty) {
el17ajf 7:2e37bad816cb 10 currentTetromino = Tetromino::getTetrominoOfType(
el17ajf 7:2e37bad816cb 11 Tetromino::getRandomTetrominoType());
el17ajf 7:2e37bad816cb 12 nextTetrominoType = Tetromino::getRandomTetrominoType();
el17ajf 17:cc448ab7266f 13
el17ajf 17:cc448ab7266f 14 switch (difficulty) {
el17ajf 17:cc448ab7266f 15 case EASY:
el17ajf 18:24ce897024d0 16 move_frames = Engine::FPS / 6; // ~ 160ms
el17ajf 19:370d83a8dc33 17 scoreForRow = 6;
el17ajf 17:cc448ab7266f 18 break;
el17ajf 17:cc448ab7266f 19 case MEDIUM:
el17ajf 18:24ce897024d0 20 move_frames = Engine::FPS / 9; // ~ 110ms
el17ajf 19:370d83a8dc33 21 scoreForRow = 8;
el17ajf 17:cc448ab7266f 22 break;
el17ajf 17:cc448ab7266f 23 case HARD:
el17ajf 18:24ce897024d0 24 move_frames = Engine::FPS / 12; // ~ 80ms
el17ajf 19:370d83a8dc33 25 scoreForRow = 10;
el17ajf 17:cc448ab7266f 26 break;
el17ajf 17:cc448ab7266f 27 }
el17ajf 15:afeefa3ceb61 28 frames = 0;
el17ajf 15:afeefa3ceb61 29 last_move_frame = 0;
el17ajf 15:afeefa3ceb61 30 start_x = Grid::GRID_WIDTH / 2 - 1;
el17ajf 15:afeefa3ceb61 31 currentTetromino = currentTetromino.teleportedTo(start_x);
el17ajf 19:370d83a8dc33 32 score = 0;
el17ajf 27:2ed9e3c9f4e9 33 playerNumber = Prefs::getInstance()->getKey(Prefs::LAST_PLAYER);
el17ajf 27:2ed9e3c9f4e9 34 if (playerNumber == Prefs::EMPTY) {
el17ajf 27:2ed9e3c9f4e9 35 playerNumber = 1;
el17ajf 27:2ed9e3c9f4e9 36 } else {
el17ajf 27:2ed9e3c9f4e9 37 playerNumber += 1;
el17ajf 27:2ed9e3c9f4e9 38 }
el17ajf 2:0b5e289ef905 39 }
el17ajf 2:0b5e289ef905 40
el17ajf 2:0b5e289ef905 41 Game::~Game() {
el17ajf 6:a54df561f442 42
el17ajf 2:0b5e289ef905 43 }
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 7:2e37bad816cb 52 if (grid.isSpaceForTetromino(currentTetromino.movedLeft())) {
el17ajf 4:aa433f9865a6 53 currentTetromino = currentTetromino.movedLeft();
el17ajf 4:aa433f9865a6 54 }
el17ajf 4:aa433f9865a6 55 }
el17ajf 9:3a7776a29a11 56 if (Input::buttonHit(Input::RIGHT)) {
el17ajf 9:3a7776a29a11 57 if (grid.isSpaceForTetromino(currentTetromino.movedRight())) {
el17ajf 9:3a7776a29a11 58 currentTetromino = currentTetromino.movedRight();
el17ajf 9:3a7776a29a11 59 }
el17ajf 9:3a7776a29a11 60 }
el17ajf 9:3a7776a29a11 61 if (Input::buttonHit(Input::UP)) {
el17ajf 9:3a7776a29a11 62 if (grid.isSpaceForTetromino(currentTetromino.rotatedClockwise())) {
el17ajf 9:3a7776a29a11 63 currentTetromino = currentTetromino.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 19:370d83a8dc33 74 void Game::addScore(int rowsCleared) {
el17ajf 19:370d83a8dc33 75 score += scoreForRow * rowsCleared * rowsCleared;
el17ajf 19:370d83a8dc33 76 if (score > 9999) {
el17ajf 19:370d83a8dc33 77 score = 9999;
el17ajf 19:370d83a8dc33 78 }
el17ajf 19:370d83a8dc33 79 }
el17ajf 19:370d83a8dc33 80
el17ajf 7:2e37bad816cb 81 void Game::moveCurrentTetrominoDown() {
el17ajf 7:2e37bad816cb 82 if (grid.isSpaceForTetromino(currentTetromino.movedDown())) {
el17ajf 4:aa433f9865a6 83 currentTetromino = currentTetromino.movedDown();
el17ajf 4:aa433f9865a6 84 } else {
el17ajf 19:370d83a8dc33 85 int rowsCleared = grid.placeTetromino(currentTetromino);
el17ajf 19:370d83a8dc33 86 if (rowsCleared != 0) {
el17ajf 19:370d83a8dc33 87 addScore(rowsCleared);
el17ajf 19:370d83a8dc33 88 }
el17ajf 7:2e37bad816cb 89 currentTetromino = Tetromino::getTetrominoOfType(nextTetrominoType);
el17ajf 15:afeefa3ceb61 90 // centre it
el17ajf 15:afeefa3ceb61 91 currentTetromino = currentTetromino.teleportedTo(start_x);
el17ajf 15:afeefa3ceb61 92 if (!grid.isSpaceForTetromino(currentTetromino)) {
el17ajf 15:afeefa3ceb61 93 // no space for tetromino, game over
el17ajf 15:afeefa3ceb61 94 gameOver();
el17ajf 15:afeefa3ceb61 95 }
el17ajf 13:59e17cab320a 96 nextTetrominoType = Tetromino::getRandomTetrominoType();
el17ajf 4:aa433f9865a6 97 }
el17ajf 2:0b5e289ef905 98 }
el17ajf 2:0b5e289ef905 99
el17ajf 7:2e37bad816cb 100 void Game::dropCurrentTetromino() {
el17ajf 9:3a7776a29a11 101 while (grid.isSpaceForTetromino(currentTetromino.movedDown())) {
el17ajf 19:370d83a8dc33 102 score += 1;
el17ajf 9:3a7776a29a11 103 currentTetromino = currentTetromino.movedDown();
el17ajf 9:3a7776a29a11 104 }
el17ajf 9:3a7776a29a11 105 moveCurrentTetrominoDown();
el17ajf 7:2e37bad816cb 106 }
el17ajf 7:2e37bad816cb 107
el17ajf 2:0b5e289ef905 108 void Game::draw() {
el17ajf 7:2e37bad816cb 109 currentTetromino.draw();
el17ajf 4:aa433f9865a6 110 grid.draw();
el17ajf 2:0b5e289ef905 111 }
el17ajf 15:afeefa3ceb61 112
el17ajf 27:2ed9e3c9f4e9 113 void Game::gameOver() {
el17ajf 27:2ed9e3c9f4e9 114 updateLeaderboard();
el17ajf 27:2ed9e3c9f4e9 115 printf("Player %i finished game with %i points\n", playerNumber, score);
el17ajf 27:2ed9e3c9f4e9 116 Prefs::getInstance()->setKey(Prefs::LAST_PLAYER, playerNumber);
el17ajf 27:2ed9e3c9f4e9 117 Prefs::getInstance()->setKey(Prefs::LAST_SCORE, score);
el17ajf 27:2ed9e3c9f4e9 118 Menus::MenuManager::add(new Menus::GameOverMenu());
el17ajf 27:2ed9e3c9f4e9 119 }
el17ajf 27:2ed9e3c9f4e9 120
el17ajf 27:2ed9e3c9f4e9 121 void Game::updateLeaderboard() {
el17ajf 27:2ed9e3c9f4e9 122 for (int i = 0; i <= Prefs::HIGHSCORE3; i++) {
el17ajf 21:62d2b5b73160 123 if (score > Prefs::getInstance()->getKey((Prefs::Key)i)) {
el17ajf 27:2ed9e3c9f4e9 124 for (int j = i; j <= Prefs::HIGHSCORE3; j++) {
el17ajf 27:2ed9e3c9f4e9 125 Prefs::getInstance()->setKey(
el17ajf 27:2ed9e3c9f4e9 126 (Prefs::Key)(j + 1),
el17ajf 27:2ed9e3c9f4e9 127 Prefs::getInstance()->getKey((Prefs::Key)i)
el17ajf 27:2ed9e3c9f4e9 128 );
el17ajf 27:2ed9e3c9f4e9 129 Prefs::getInstance()->setKey(
el17ajf 27:2ed9e3c9f4e9 130 (Prefs::Key)((j + 1) + 3),
el17ajf 27:2ed9e3c9f4e9 131 Prefs::getInstance()->getKey((Prefs::Key)(i + 3))
el17ajf 27:2ed9e3c9f4e9 132 );
el17ajf 27:2ed9e3c9f4e9 133 }
el17ajf 21:62d2b5b73160 134 Prefs::getInstance()->setKey((Prefs::Key)i, score);
el17ajf 21:62d2b5b73160 135 Prefs::getInstance()->setKey((Prefs::Key)(i + 3), playerNumber);
el17ajf 27:2ed9e3c9f4e9 136 break;
el17ajf 19:370d83a8dc33 137 }
el17ajf 19:370d83a8dc33 138 }
el17ajf 19:370d83a8dc33 139 }