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.
Engine/Engine.cpp@13:81573be8fac6, 2018-05-07 (annotated)
- Committer:
- Andrew_M
- Date:
- Mon May 07 19:41:09 2018 +0000
- Revision:
- 13:81573be8fac6
- Parent:
- 12:d3eef5ea3f43
- Child:
- 14:a57a40ff9430
Restructuring and reorganising of code, adaptive difficulty doesn't work as intended and needs reworking. Sound effect has been added when food is consumed and menu items are selected. Game is finished, code needs further organisation
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Andrew_M | 1:a14415de3ad5 | 1 | #include "Engine.h" |
Andrew_M | 1:a14415de3ad5 | 2 | |
Andrew_M | 1:a14415de3ad5 | 3 | Engine::Engine() |
Andrew_M | 1:a14415de3ad5 | 4 | { |
Andrew_M | 1:a14415de3ad5 | 5 | |
Andrew_M | 1:a14415de3ad5 | 6 | } |
Andrew_M | 1:a14415de3ad5 | 7 | |
Andrew_M | 1:a14415de3ad5 | 8 | Engine::~Engine() |
Andrew_M | 1:a14415de3ad5 | 9 | { |
Andrew_M | 1:a14415de3ad5 | 10 | |
Andrew_M | 1:a14415de3ad5 | 11 | } |
Andrew_M | 1:a14415de3ad5 | 12 | |
Andrew_M | 2:9ca5e1c221c3 | 13 | void Engine::init() // initialise the game parameters |
Andrew_M | 1:a14415de3ad5 | 14 | { |
Andrew_M | 12:d3eef5ea3f43 | 15 | _solid.init(10,15); |
Andrew_M | 12:d3eef5ea3f43 | 16 | _noodles.init(10,10); |
Andrew_M | 12:d3eef5ea3f43 | 17 | _gameOver = false; |
Andrew_M | 12:d3eef5ea3f43 | 18 | lvlTwo() ; |
Andrew_M | 12:d3eef5ea3f43 | 19 | } |
Andrew_M | 12:d3eef5ea3f43 | 20 | void Engine::setLvl(int _levelToSet) |
Andrew_M | 12:d3eef5ea3f43 | 21 | { |
Andrew_M | 12:d3eef5ea3f43 | 22 | _lvl = _levelToSet; |
Andrew_M | 12:d3eef5ea3f43 | 23 | } |
Andrew_M | 12:d3eef5ea3f43 | 24 | |
Andrew_M | 12:d3eef5ea3f43 | 25 | void Engine::loadLvl() |
Andrew_M | 12:d3eef5ea3f43 | 26 | { |
Andrew_M | 12:d3eef5ea3f43 | 27 | if (_lvl == 1) { |
Andrew_M | 12:d3eef5ea3f43 | 28 | lvlOne(); |
Andrew_M | 13:81573be8fac6 | 29 | } else if (_lvl == 2) { |
Andrew_M | 12:d3eef5ea3f43 | 30 | lvlTwo(); |
Andrew_M | 13:81573be8fac6 | 31 | } else if (_lvl == 3) { |
Andrew_M | 12:d3eef5ea3f43 | 32 | lvlThree(); |
Andrew_M | 12:d3eef5ea3f43 | 33 | } |
Andrew_M | 12:d3eef5ea3f43 | 34 | } |
Andrew_M | 12:d3eef5ea3f43 | 35 | |
Andrew_M | 12:d3eef5ea3f43 | 36 | void Engine::lvlOne() |
Andrew_M | 12:d3eef5ea3f43 | 37 | { |
Andrew_M | 3:6253a2d374fa | 38 | memset(_grid, 0, sizeof(_grid)); |
Andrew_M | 12:d3eef5ea3f43 | 39 | } |
Andrew_M | 12:d3eef5ea3f43 | 40 | |
Andrew_M | 12:d3eef5ea3f43 | 41 | void Engine::lvlTwo() |
Andrew_M | 12:d3eef5ea3f43 | 42 | { |
Andrew_M | 12:d3eef5ea3f43 | 43 | int _newGrid[22][22] = { |
Andrew_M | 12:d3eef5ea3f43 | 44 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 45 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 46 | {0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 47 | {0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 48 | {0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 49 | {0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 50 | {0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 51 | {0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 52 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 53 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 54 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 55 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 56 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 57 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 58 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 59 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 60 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 61 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 62 | {0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 63 | {0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 64 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 65 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} |
Andrew_M | 12:d3eef5ea3f43 | 66 | }; |
Andrew_M | 12:d3eef5ea3f43 | 67 | |
Andrew_M | 12:d3eef5ea3f43 | 68 | for(int i = 0; i < 22; i++) { |
Andrew_M | 12:d3eef5ea3f43 | 69 | for (int j = 0; j < 22; j++) { |
Andrew_M | 12:d3eef5ea3f43 | 70 | _grid[i][j] = _newGrid[i][j]; |
Andrew_M | 12:d3eef5ea3f43 | 71 | } |
Andrew_M | 12:d3eef5ea3f43 | 72 | } |
Andrew_M | 12:d3eef5ea3f43 | 73 | } |
Andrew_M | 12:d3eef5ea3f43 | 74 | |
Andrew_M | 12:d3eef5ea3f43 | 75 | void Engine::lvlThree() |
Andrew_M | 12:d3eef5ea3f43 | 76 | { |
Andrew_M | 12:d3eef5ea3f43 | 77 | int _newGrid[22][22] = { |
Andrew_M | 12:d3eef5ea3f43 | 78 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 79 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 80 | {0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 81 | {0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 82 | {0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 83 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 84 | {0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 85 | {0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 86 | {0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 87 | {0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 88 | {0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 89 | {0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 90 | {0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 91 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 92 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 93 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 94 | {0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 95 | {0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 96 | {0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 97 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 98 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |
Andrew_M | 12:d3eef5ea3f43 | 99 | {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} |
Andrew_M | 12:d3eef5ea3f43 | 100 | }; |
Andrew_M | 12:d3eef5ea3f43 | 101 | |
Andrew_M | 12:d3eef5ea3f43 | 102 | for(int i = 0; i < 22; i++) { |
Andrew_M | 12:d3eef5ea3f43 | 103 | for (int j = 0; j < 22; j++) { |
Andrew_M | 12:d3eef5ea3f43 | 104 | _grid[i][j] = _newGrid[i][j]; |
Andrew_M | 12:d3eef5ea3f43 | 105 | } |
Andrew_M | 12:d3eef5ea3f43 | 106 | } |
Andrew_M | 1:a14415de3ad5 | 107 | } |
Andrew_M | 1:a14415de3ad5 | 108 | |
Andrew_M | 1:a14415de3ad5 | 109 | void Engine::read_input(Gamepad &pad) |
Andrew_M | 1:a14415de3ad5 | 110 | { |
Andrew_M | 1:a14415de3ad5 | 111 | _d = pad.get_direction(); |
Andrew_M | 1:a14415de3ad5 | 112 | } |
Andrew_M | 1:a14415de3ad5 | 113 | |
Andrew_M | 1:a14415de3ad5 | 114 | void Engine::draw(N5110 &lcd) |
Andrew_M | 1:a14415de3ad5 | 115 | { |
Andrew_M | 2:9ca5e1c221c3 | 116 | lcd.drawRect(0,0,48,48,FILL_TRANSPARENT); |
Andrew_M | 11:b25874e7efe4 | 117 | |
Andrew_M | 2:9ca5e1c221c3 | 118 | for (int j = 0; j < 22; j++) { |
Andrew_M | 2:9ca5e1c221c3 | 119 | for (int i = 0; i < 22; i++) { |
Andrew_M | 2:9ca5e1c221c3 | 120 | if (_grid[i][j] != 0) { |
Andrew_M | 4:6353f829c56c | 121 | lcd.drawRect((2 * i) + 2,(2 * j) + 2,2,2,FILL_BLACK); |
Andrew_M | 2:9ca5e1c221c3 | 122 | } |
Andrew_M | 2:9ca5e1c221c3 | 123 | } |
Andrew_M | 2:9ca5e1c221c3 | 124 | } |
Andrew_M | 11:b25874e7efe4 | 125 | |
Andrew_M | 11:b25874e7efe4 | 126 | lcd.printString("Score",50,0); |
Andrew_M | 7:c1e0593bfc99 | 127 | |
Andrew_M | 7:c1e0593bfc99 | 128 | |
Andrew_M | 7:c1e0593bfc99 | 129 | int _score = (_solid.getLength() - 3); |
Andrew_M | 7:c1e0593bfc99 | 130 | |
Andrew_M | 11:b25874e7efe4 | 131 | char buffer1[21]; |
Andrew_M | 11:b25874e7efe4 | 132 | sprintf(buffer1,"%3d",_score); |
Andrew_M | 11:b25874e7efe4 | 133 | lcd.printString(buffer1,50,1); // font is 8 wide, so leave 4 pixel gape from middle assuming two digits |
Andrew_M | 12:d3eef5ea3f43 | 134 | } |
Andrew_M | 12:d3eef5ea3f43 | 135 | |
Andrew_M | 12:d3eef5ea3f43 | 136 | void Engine::gameOverScreen(N5110 &lcd) |
Andrew_M | 12:d3eef5ea3f43 | 137 | { |
Andrew_M | 12:d3eef5ea3f43 | 138 | for (int i = 0; i < 22; i++) { |
Andrew_M | 12:d3eef5ea3f43 | 139 | for (int j = 0; j < 22; j++) { |
Andrew_M | 12:d3eef5ea3f43 | 140 | lcd.drawRect((2 * i) + 2,(2 * j) + 2,2,2,FILL_BLACK); |
Andrew_M | 12:d3eef5ea3f43 | 141 | wait(0.01); |
Andrew_M | 12:d3eef5ea3f43 | 142 | lcd.refresh(); |
Andrew_M | 5:a3a9e0417e04 | 143 | } |
Andrew_M | 11:b25874e7efe4 | 144 | } |
Andrew_M | 1:a14415de3ad5 | 145 | } |
Andrew_M | 1:a14415de3ad5 | 146 | |
Andrew_M | 1:a14415de3ad5 | 147 | void Engine::update(Gamepad &pad) |
Andrew_M | 1:a14415de3ad5 | 148 | { |
Andrew_M | 12:d3eef5ea3f43 | 149 | loadLvl(); |
Andrew_M | 3:6253a2d374fa | 150 | |
Andrew_M | 3:6253a2d374fa | 151 | _solid.update(_d); |
Andrew_M | 3:6253a2d374fa | 152 | |
Andrew_M | 4:6353f829c56c | 153 | int _l =_solid.getLength(); |
Andrew_M | 3:6253a2d374fa | 154 | |
Andrew_M | 11:b25874e7efe4 | 155 | for (int z = 0; z < _l; z++) { |
Andrew_M | 11:b25874e7efe4 | 156 | |
Andrew_M | 11:b25874e7efe4 | 157 | if (_solid.getX(z) > 21 || _solid.getX(z) < 0) { |
Andrew_M | 11:b25874e7efe4 | 158 | _gameOver = true; |
Andrew_M | 11:b25874e7efe4 | 159 | } else if (_solid.getY(z) > 21 || _solid.getY(z) < 0) { |
Andrew_M | 11:b25874e7efe4 | 160 | _gameOver = true; |
Andrew_M | 11:b25874e7efe4 | 161 | } |
Andrew_M | 11:b25874e7efe4 | 162 | |
Andrew_M | 11:b25874e7efe4 | 163 | if (_grid[_solid.getX(z)][_solid.getY(z)] != 1) { |
Andrew_M | 11:b25874e7efe4 | 164 | _grid[_solid.getX(z)][_solid.getY(z)] = 1; |
Andrew_M | 5:a3a9e0417e04 | 165 | } else { |
Andrew_M | 5:a3a9e0417e04 | 166 | _gameOver = true; |
Andrew_M | 5:a3a9e0417e04 | 167 | } |
Andrew_M | 5:a3a9e0417e04 | 168 | } |
Andrew_M | 5:a3a9e0417e04 | 169 | |
Andrew_M | 5:a3a9e0417e04 | 170 | _grid[_noodles.getY()][_noodles.getY()] = 2; |
Andrew_M | 5:a3a9e0417e04 | 171 | |
Andrew_M | 13:81573be8fac6 | 172 | if (checkFood()) { //checks if the head has reached food |
Andrew_M | 13:81573be8fac6 | 173 | |
Andrew_M | 13:81573be8fac6 | 174 | growSnake(pad); |
Andrew_M | 7:c1e0593bfc99 | 175 | |
Andrew_M | 13:81573be8fac6 | 176 | bool empty = false; //makes a varible for finding an empty square |
Andrew_M | 13:81573be8fac6 | 177 | while (!empty) { //loops until empty square found |
Andrew_M | 13:81573be8fac6 | 178 | _noodles.random(); //randomise position of noodles |
Andrew_M | 13:81573be8fac6 | 179 | if ( _grid[_noodles.getY()][_noodles.getY()] == 0) { |
Andrew_M | 13:81573be8fac6 | 180 | empty = true; //stops looping when free space is found |
Andrew_M | 13:81573be8fac6 | 181 | // no need to set the grid as it will put the noodles in the new location the next time 'update' is called |
Andrew_M | 7:c1e0593bfc99 | 182 | } |
Andrew_M | 13:81573be8fac6 | 183 | |
Andrew_M | 5:a3a9e0417e04 | 184 | } |
Andrew_M | 4:6353f829c56c | 185 | } |
Andrew_M | 1:a14415de3ad5 | 186 | } |
Andrew_M | 5:a3a9e0417e04 | 187 | |
Andrew_M | 13:81573be8fac6 | 188 | bool Engine::checkFood() |
Andrew_M | 13:81573be8fac6 | 189 | { |
Andrew_M | 13:81573be8fac6 | 190 | if (_grid[_solid.getX(0)][_solid.getY(0)] == 2) { |
Andrew_M | 13:81573be8fac6 | 191 | return true; |
Andrew_M | 13:81573be8fac6 | 192 | } else { |
Andrew_M | 13:81573be8fac6 | 193 | return false; |
Andrew_M | 13:81573be8fac6 | 194 | } |
Andrew_M | 13:81573be8fac6 | 195 | } |
Andrew_M | 13:81573be8fac6 | 196 | |
Andrew_M | 13:81573be8fac6 | 197 | void Engine::growSnake(Gamepad &pad) |
Andrew_M | 13:81573be8fac6 | 198 | { |
Andrew_M | 13:81573be8fac6 | 199 | pad.tone(750.0,0.1); |
Andrew_M | 13:81573be8fac6 | 200 | if (_solid.getLength()<484) { //checks if the snake can grow any more |
Andrew_M | 13:81573be8fac6 | 201 | |
Andrew_M | 13:81573be8fac6 | 202 | _solid.grow(); //makes snake longer |
Andrew_M | 13:81573be8fac6 | 203 | |
Andrew_M | 13:81573be8fac6 | 204 | } |
Andrew_M | 13:81573be8fac6 | 205 | } |
Andrew_M | 13:81573be8fac6 | 206 | |
Andrew_M | 13:81573be8fac6 | 207 | float Engine::getScore() |
Andrew_M | 12:d3eef5ea3f43 | 208 | { |
Andrew_M | 11:b25874e7efe4 | 209 | return _score; |
Andrew_M | 12:d3eef5ea3f43 | 210 | } |
Andrew_M | 12:d3eef5ea3f43 | 211 | |
Andrew_M | 11:b25874e7efe4 | 212 | |
Andrew_M | 12:d3eef5ea3f43 | 213 | bool Engine::getGameOver() |
Andrew_M | 12:d3eef5ea3f43 | 214 | { |
Andrew_M | 12:d3eef5ea3f43 | 215 | return _gameOver; |
Andrew_M | 12:d3eef5ea3f43 | 216 | } |
Andrew_M | 12:d3eef5ea3f43 | 217 |