ELEC2645 (2018/19) / Mbed 2 deprecated el17ajf

Dependencies:   mbed

Fork of el17ajf by Angus Findlay

Committer:
el17ajf
Date:
Wed Apr 03 16:18:26 2019 +0000
Revision:
19:370d83a8dc33
Parent:
18:24ce897024d0
Child:
21:62d2b5b73160
Added numbers to font

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 17:cc448ab7266f 4 #include "Menus.h"
el17ajf 19:370d83a8dc33 5 #include "Prefs.h"
el17ajf 2:0b5e289ef905 6
el17ajf 17:cc448ab7266f 7 Game::Game(Difficulty difficulty) {
el17ajf 7:2e37bad816cb 8 currentTetromino = Tetromino::getTetrominoOfType(
el17ajf 7:2e37bad816cb 9 Tetromino::getRandomTetrominoType());
el17ajf 7:2e37bad816cb 10 nextTetrominoType = Tetromino::getRandomTetrominoType();
el17ajf 17:cc448ab7266f 11
el17ajf 17:cc448ab7266f 12 switch (difficulty) {
el17ajf 17:cc448ab7266f 13 case EASY:
el17ajf 18:24ce897024d0 14 move_frames = Engine::FPS / 6; // ~ 160ms
el17ajf 19:370d83a8dc33 15 scoreForRow = 6;
el17ajf 17:cc448ab7266f 16 break;
el17ajf 17:cc448ab7266f 17 case MEDIUM:
el17ajf 18:24ce897024d0 18 move_frames = Engine::FPS / 9; // ~ 110ms
el17ajf 19:370d83a8dc33 19 scoreForRow = 8;
el17ajf 17:cc448ab7266f 20 break;
el17ajf 17:cc448ab7266f 21 case HARD:
el17ajf 18:24ce897024d0 22 move_frames = Engine::FPS / 12; // ~ 80ms
el17ajf 19:370d83a8dc33 23 scoreForRow = 10;
el17ajf 17:cc448ab7266f 24 break;
el17ajf 17:cc448ab7266f 25 }
el17ajf 15:afeefa3ceb61 26 frames = 0;
el17ajf 15:afeefa3ceb61 27 last_move_frame = 0;
el17ajf 15:afeefa3ceb61 28 start_x = Grid::GRID_WIDTH / 2 - 1;
el17ajf 15:afeefa3ceb61 29 currentTetromino = currentTetromino.teleportedTo(start_x);
el17ajf 19:370d83a8dc33 30 score = 0;
el17ajf 19:370d83a8dc33 31 Prefs prefs;
el17ajf 19:370d83a8dc33 32 playerNumber = prefs.getKey(Prefs::LAST_PLAYER) + 1;
el17ajf 19:370d83a8dc33 33
el17ajf 19:370d83a8dc33 34 printf(">>>>>>> made game ...\n");
el17ajf 2:0b5e289ef905 35 }
el17ajf 2:0b5e289ef905 36
el17ajf 2:0b5e289ef905 37 Game::~Game() {
el17ajf 6:a54df561f442 38
el17ajf 2:0b5e289ef905 39 }
el17ajf 2:0b5e289ef905 40
el17ajf 2:0b5e289ef905 41 void Game::update() {
el17ajf 15:afeefa3ceb61 42 if (frames++ > last_move_frame + move_frames) {
el17ajf 15:afeefa3ceb61 43 last_move_frame = frames;
el17ajf 15:afeefa3ceb61 44 moveCurrentTetrominoDown();
el17ajf 15:afeefa3ceb61 45 }
el17ajf 15:afeefa3ceb61 46
el17ajf 9:3a7776a29a11 47 if (Input::buttonHit(Input::LEFT)) {
el17ajf 7:2e37bad816cb 48 if (grid.isSpaceForTetromino(currentTetromino.movedLeft())) {
el17ajf 4:aa433f9865a6 49 currentTetromino = currentTetromino.movedLeft();
el17ajf 4:aa433f9865a6 50 }
el17ajf 4:aa433f9865a6 51 }
el17ajf 9:3a7776a29a11 52 if (Input::buttonHit(Input::RIGHT)) {
el17ajf 9:3a7776a29a11 53 if (grid.isSpaceForTetromino(currentTetromino.movedRight())) {
el17ajf 9:3a7776a29a11 54 currentTetromino = currentTetromino.movedRight();
el17ajf 13:59e17cab320a 55 } else {
el17ajf 13:59e17cab320a 56 printf("NO SPACE TO THE RIGHT");
el17ajf 9:3a7776a29a11 57 }
el17ajf 9:3a7776a29a11 58 }
el17ajf 9:3a7776a29a11 59 if (Input::buttonHit(Input::UP)) {
el17ajf 9:3a7776a29a11 60 if (grid.isSpaceForTetromino(currentTetromino.rotatedClockwise())) {
el17ajf 9:3a7776a29a11 61 currentTetromino = currentTetromino.rotatedClockwise();
el17ajf 9:3a7776a29a11 62 }
el17ajf 9:3a7776a29a11 63 }
el17ajf 9:3a7776a29a11 64 if (Input::buttonHit(Input::DOWN)) {
el17ajf 9:3a7776a29a11 65 dropCurrentTetromino();
el17ajf 9:3a7776a29a11 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 Prefs prefs;
el17ajf 19:370d83a8dc33 110 for (int i = 0; i < Prefs::HIGHSCORE3; i++) {
el17ajf 19:370d83a8dc33 111 if (score > prefs.getKey((Prefs::Key)i)) {
el17ajf 19:370d83a8dc33 112 prefs.setKey((Prefs::Key)i, score);
el17ajf 19:370d83a8dc33 113 prefs.setKey((Prefs::Key)(i + 3), playerNumber);
el17ajf 19:370d83a8dc33 114 }
el17ajf 19:370d83a8dc33 115 }
el17ajf 19:370d83a8dc33 116 }
el17ajf 19:370d83a8dc33 117
el17ajf 15:afeefa3ceb61 118 void Game::gameOver() {
el17ajf 19:370d83a8dc33 119 addScoreToLeaderboard();
el17ajf 19:370d83a8dc33 120 Prefs prefs;
el17ajf 19:370d83a8dc33 121 prefs.setKey(Prefs::LAST_PLAYER, playerNumber);
el17ajf 17:cc448ab7266f 122 Menus::add(Menus::GAME_OVER);
el17ajf 15:afeefa3ceb61 123 }