ELEC2645 (2018/19) / Mbed 2 deprecated el17ajf

Dependencies:   mbed

Fork of el17ajf by Angus Findlay

Committer:
el17ajf
Date:
Thu Apr 04 07:08:39 2019 +0000
Revision:
22:0a474f074553
Parent:
21:62d2b5b73160
Child:
27:2ed9e3c9f4e9
Added pause menu

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 21:62d2b5b73160 33 playerNumber = Prefs::getInstance()->getKey(Prefs::LAST_PLAYER) + 1;
el17ajf 2:0b5e289ef905 34 }
el17ajf 2:0b5e289ef905 35
el17ajf 2:0b5e289ef905 36 Game::~Game() {
el17ajf 6:a54df561f442 37
el17ajf 2:0b5e289ef905 38 }
el17ajf 2:0b5e289ef905 39
el17ajf 2:0b5e289ef905 40 void Game::update() {
el17ajf 15:afeefa3ceb61 41 if (frames++ > last_move_frame + move_frames) {
el17ajf 15:afeefa3ceb61 42 last_move_frame = frames;
el17ajf 15:afeefa3ceb61 43 moveCurrentTetrominoDown();
el17ajf 15:afeefa3ceb61 44 }
el17ajf 15:afeefa3ceb61 45
el17ajf 9:3a7776a29a11 46 if (Input::buttonHit(Input::LEFT)) {
el17ajf 7:2e37bad816cb 47 if (grid.isSpaceForTetromino(currentTetromino.movedLeft())) {
el17ajf 4:aa433f9865a6 48 currentTetromino = currentTetromino.movedLeft();
el17ajf 4:aa433f9865a6 49 }
el17ajf 4:aa433f9865a6 50 }
el17ajf 9:3a7776a29a11 51 if (Input::buttonHit(Input::RIGHT)) {
el17ajf 9:3a7776a29a11 52 if (grid.isSpaceForTetromino(currentTetromino.movedRight())) {
el17ajf 9:3a7776a29a11 53 currentTetromino = currentTetromino.movedRight();
el17ajf 9:3a7776a29a11 54 }
el17ajf 9:3a7776a29a11 55 }
el17ajf 9:3a7776a29a11 56 if (Input::buttonHit(Input::UP)) {
el17ajf 9:3a7776a29a11 57 if (grid.isSpaceForTetromino(currentTetromino.rotatedClockwise())) {
el17ajf 9:3a7776a29a11 58 currentTetromino = currentTetromino.rotatedClockwise();
el17ajf 9:3a7776a29a11 59 }
el17ajf 9:3a7776a29a11 60 }
el17ajf 9:3a7776a29a11 61 if (Input::buttonHit(Input::DOWN)) {
el17ajf 9:3a7776a29a11 62 dropCurrentTetromino();
el17ajf 9:3a7776a29a11 63 }
el17ajf 22:0a474f074553 64 if (Input::buttonHit(Input::START)) {
el17ajf 22:0a474f074553 65 Menus::MenuManager::add(new Menus::PausedMenu());
el17ajf 22:0a474f074553 66 }
el17ajf 4:aa433f9865a6 67 }
el17ajf 4:aa433f9865a6 68
el17ajf 19:370d83a8dc33 69 void Game::addScore(int rowsCleared) {
el17ajf 19:370d83a8dc33 70 score += scoreForRow * rowsCleared * rowsCleared;
el17ajf 19:370d83a8dc33 71 if (score > 9999) {
el17ajf 19:370d83a8dc33 72 score = 9999;
el17ajf 19:370d83a8dc33 73 }
el17ajf 19:370d83a8dc33 74 }
el17ajf 19:370d83a8dc33 75
el17ajf 7:2e37bad816cb 76 void Game::moveCurrentTetrominoDown() {
el17ajf 7:2e37bad816cb 77 if (grid.isSpaceForTetromino(currentTetromino.movedDown())) {
el17ajf 4:aa433f9865a6 78 currentTetromino = currentTetromino.movedDown();
el17ajf 4:aa433f9865a6 79 } else {
el17ajf 19:370d83a8dc33 80 int rowsCleared = grid.placeTetromino(currentTetromino);
el17ajf 19:370d83a8dc33 81 if (rowsCleared != 0) {
el17ajf 19:370d83a8dc33 82 addScore(rowsCleared);
el17ajf 19:370d83a8dc33 83 }
el17ajf 7:2e37bad816cb 84 currentTetromino = Tetromino::getTetrominoOfType(nextTetrominoType);
el17ajf 15:afeefa3ceb61 85 // centre it
el17ajf 15:afeefa3ceb61 86 currentTetromino = currentTetromino.teleportedTo(start_x);
el17ajf 15:afeefa3ceb61 87 if (!grid.isSpaceForTetromino(currentTetromino)) {
el17ajf 15:afeefa3ceb61 88 // no space for tetromino, game over
el17ajf 15:afeefa3ceb61 89 gameOver();
el17ajf 15:afeefa3ceb61 90 }
el17ajf 13:59e17cab320a 91 nextTetrominoType = Tetromino::getRandomTetrominoType();
el17ajf 4:aa433f9865a6 92 }
el17ajf 2:0b5e289ef905 93 }
el17ajf 2:0b5e289ef905 94
el17ajf 7:2e37bad816cb 95 void Game::dropCurrentTetromino() {
el17ajf 9:3a7776a29a11 96 while (grid.isSpaceForTetromino(currentTetromino.movedDown())) {
el17ajf 19:370d83a8dc33 97 score += 1;
el17ajf 9:3a7776a29a11 98 currentTetromino = currentTetromino.movedDown();
el17ajf 9:3a7776a29a11 99 }
el17ajf 9:3a7776a29a11 100 moveCurrentTetrominoDown();
el17ajf 7:2e37bad816cb 101 }
el17ajf 7:2e37bad816cb 102
el17ajf 2:0b5e289ef905 103 void Game::draw() {
el17ajf 7:2e37bad816cb 104 currentTetromino.draw();
el17ajf 4:aa433f9865a6 105 grid.draw();
el17ajf 2:0b5e289ef905 106 }
el17ajf 15:afeefa3ceb61 107
el17ajf 19:370d83a8dc33 108 void Game::addScoreToLeaderboard() {
el17ajf 19:370d83a8dc33 109 for (int i = 0; i < Prefs::HIGHSCORE3; i++) {
el17ajf 21:62d2b5b73160 110 if (score > Prefs::getInstance()->getKey((Prefs::Key)i)) {
el17ajf 21:62d2b5b73160 111 Prefs::getInstance()->setKey((Prefs::Key)i, score);
el17ajf 21:62d2b5b73160 112 Prefs::getInstance()->setKey((Prefs::Key)(i + 3), playerNumber);
el17ajf 19:370d83a8dc33 113 }
el17ajf 19:370d83a8dc33 114 }
el17ajf 19:370d83a8dc33 115 }
el17ajf 19:370d83a8dc33 116
el17ajf 15:afeefa3ceb61 117 void Game::gameOver() {
el17ajf 19:370d83a8dc33 118 addScoreToLeaderboard();
el17ajf 21:62d2b5b73160 119 Prefs::getInstance()->setKey(Prefs::LAST_PLAYER, playerNumber);
el17ajf 21:62d2b5b73160 120 Menus::MenuManager::add(new Menus::GameOverMenu());
el17ajf 15:afeefa3ceb61 121 }