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