ELEC2645 (2017/18) / Mbed OS el16ajm
Committer:
Andrew_M
Date:
Tue May 08 13:15:41 2018 +0000
Revision:
14:a57a40ff9430
Parent:
13:81573be8fac6
Child:
15:130900e5c268
Minor restructuring and removal of unneeded functions. Doxygen has been utilised

Who changed what in which revision?

UserRevisionLine numberNew 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 14:a57a40ff9430 152
Andrew_M 14:a57a40ff9430 153 checkGameOverAndSetGrid();
Andrew_M 14:a57a40ff9430 154
Andrew_M 14:a57a40ff9430 155 _grid[_noodles.getY()][_noodles.getY()] = 2;
Andrew_M 14:a57a40ff9430 156
Andrew_M 14:a57a40ff9430 157 if (checkFood()) { //checks if the head has reached food
Andrew_M 14:a57a40ff9430 158
Andrew_M 14:a57a40ff9430 159 growSnake(pad);
Andrew_M 14:a57a40ff9430 160
Andrew_M 14:a57a40ff9430 161 bool empty = false; //makes a varible for finding an empty square
Andrew_M 14:a57a40ff9430 162 while (!empty) { //loops until empty square found
Andrew_M 14:a57a40ff9430 163 _noodles.random(); //randomise position of noodles
Andrew_M 14:a57a40ff9430 164 if ( _grid[_noodles.getY()][_noodles.getY()] == 0) {
Andrew_M 14:a57a40ff9430 165 empty = true; //stops looping when free space is found
Andrew_M 14:a57a40ff9430 166 // no need to set the grid as it will put the noodles in the new location the next time 'update' is called
Andrew_M 14:a57a40ff9430 167 }
Andrew_M 14:a57a40ff9430 168
Andrew_M 14:a57a40ff9430 169 }
Andrew_M 14:a57a40ff9430 170 }
Andrew_M 14:a57a40ff9430 171 }
Andrew_M 14:a57a40ff9430 172
Andrew_M 14:a57a40ff9430 173 void Engine::checkGameOverAndSetGrid()
Andrew_M 14:a57a40ff9430 174 {
Andrew_M 3:6253a2d374fa 175
Andrew_M 4:6353f829c56c 176 int _l =_solid.getLength();
Andrew_M 3:6253a2d374fa 177
Andrew_M 11:b25874e7efe4 178 for (int z = 0; z < _l; z++) {
Andrew_M 11:b25874e7efe4 179
Andrew_M 11:b25874e7efe4 180 if (_solid.getX(z) > 21 || _solid.getX(z) < 0) {
Andrew_M 11:b25874e7efe4 181 _gameOver = true;
Andrew_M 11:b25874e7efe4 182 } else if (_solid.getY(z) > 21 || _solid.getY(z) < 0) {
Andrew_M 11:b25874e7efe4 183 _gameOver = true;
Andrew_M 11:b25874e7efe4 184 }
Andrew_M 11:b25874e7efe4 185
Andrew_M 11:b25874e7efe4 186 if (_grid[_solid.getX(z)][_solid.getY(z)] != 1) {
Andrew_M 11:b25874e7efe4 187 _grid[_solid.getX(z)][_solid.getY(z)] = 1;
Andrew_M 5:a3a9e0417e04 188 } else {
Andrew_M 5:a3a9e0417e04 189 _gameOver = true;
Andrew_M 5:a3a9e0417e04 190 }
Andrew_M 5:a3a9e0417e04 191 }
Andrew_M 1:a14415de3ad5 192 }
Andrew_M 5:a3a9e0417e04 193
Andrew_M 13:81573be8fac6 194 bool Engine::checkFood()
Andrew_M 13:81573be8fac6 195 {
Andrew_M 13:81573be8fac6 196 if (_grid[_solid.getX(0)][_solid.getY(0)] == 2) {
Andrew_M 13:81573be8fac6 197 return true;
Andrew_M 13:81573be8fac6 198 } else {
Andrew_M 13:81573be8fac6 199 return false;
Andrew_M 13:81573be8fac6 200 }
Andrew_M 13:81573be8fac6 201 }
Andrew_M 13:81573be8fac6 202
Andrew_M 13:81573be8fac6 203 void Engine::growSnake(Gamepad &pad)
Andrew_M 13:81573be8fac6 204 {
Andrew_M 13:81573be8fac6 205 pad.tone(750.0,0.1);
Andrew_M 13:81573be8fac6 206 if (_solid.getLength()<484) { //checks if the snake can grow any more
Andrew_M 13:81573be8fac6 207
Andrew_M 13:81573be8fac6 208 _solid.grow(); //makes snake longer
Andrew_M 13:81573be8fac6 209
Andrew_M 13:81573be8fac6 210 }
Andrew_M 13:81573be8fac6 211 }
Andrew_M 13:81573be8fac6 212
Andrew_M 13:81573be8fac6 213 float Engine::getScore()
Andrew_M 12:d3eef5ea3f43 214 {
Andrew_M 11:b25874e7efe4 215 return _score;
Andrew_M 12:d3eef5ea3f43 216 }
Andrew_M 12:d3eef5ea3f43 217
Andrew_M 11:b25874e7efe4 218
Andrew_M 12:d3eef5ea3f43 219 bool Engine::getGameOver()
Andrew_M 12:d3eef5ea3f43 220 {
Andrew_M 12:d3eef5ea3f43 221 return _gameOver;
Andrew_M 12:d3eef5ea3f43 222 }
Andrew_M 12:d3eef5ea3f43 223