ELEC2645 (2017/18) / Mbed OS el16ajm
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?

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 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