Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of el17ajf by
Game/Game.cpp@36:c854f1f51f43, 2019-04-24 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |
