ELEC2645 (2017/18) / Mbed OS el16ajm
Committer:
Andrew_M
Date:
Mon May 07 18:06:50 2018 +0000
Revision:
12:d3eef5ea3f43
Parent:
11:b25874e7efe4
Child:
13:81573be8fac6
Functional level select system with 3 different levels, sprite added to main menu for decoration. Minor reorganising within classes was needed, mainly game engine

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 12:d3eef5ea3f43 29 }
Andrew_M 12:d3eef5ea3f43 30 else if (_lvl == 2) {
Andrew_M 12:d3eef5ea3f43 31 lvlTwo();
Andrew_M 12:d3eef5ea3f43 32 }
Andrew_M 12:d3eef5ea3f43 33 else if (_lvl == 3) {
Andrew_M 12:d3eef5ea3f43 34 lvlThree();
Andrew_M 12:d3eef5ea3f43 35 }
Andrew_M 12:d3eef5ea3f43 36 }
Andrew_M 12:d3eef5ea3f43 37
Andrew_M 12:d3eef5ea3f43 38 void Engine::lvlOne()
Andrew_M 12:d3eef5ea3f43 39 {
Andrew_M 3:6253a2d374fa 40 memset(_grid, 0, sizeof(_grid));
Andrew_M 12:d3eef5ea3f43 41 }
Andrew_M 12:d3eef5ea3f43 42
Andrew_M 12:d3eef5ea3f43 43 void Engine::lvlTwo()
Andrew_M 12:d3eef5ea3f43 44 {
Andrew_M 12:d3eef5ea3f43 45 int _newGrid[22][22] = {
Andrew_M 12:d3eef5ea3f43 46 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
Andrew_M 12:d3eef5ea3f43 47 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
Andrew_M 12:d3eef5ea3f43 48 {0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0},
Andrew_M 12:d3eef5ea3f43 49 {0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0},
Andrew_M 12:d3eef5ea3f43 53 {0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
Andrew_M 12:d3eef5ea3f43 63 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
Andrew_M 12:d3eef5ea3f43 64 {0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0},
Andrew_M 12:d3eef5ea3f43 65 {0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0},
Andrew_M 12:d3eef5ea3f43 66 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
Andrew_M 12:d3eef5ea3f43 67 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
Andrew_M 12:d3eef5ea3f43 68 };
Andrew_M 12:d3eef5ea3f43 69
Andrew_M 12:d3eef5ea3f43 70 for(int i = 0; i < 22; i++) {
Andrew_M 12:d3eef5ea3f43 71 for (int j = 0; j < 22; j++) {
Andrew_M 12:d3eef5ea3f43 72 _grid[i][j] = _newGrid[i][j];
Andrew_M 12:d3eef5ea3f43 73 }
Andrew_M 12:d3eef5ea3f43 74 }
Andrew_M 12:d3eef5ea3f43 75 }
Andrew_M 12:d3eef5ea3f43 76
Andrew_M 12:d3eef5ea3f43 77 void Engine::lvlThree()
Andrew_M 12:d3eef5ea3f43 78 {
Andrew_M 12:d3eef5ea3f43 79 int _newGrid[22][22] = {
Andrew_M 12:d3eef5ea3f43 80 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
Andrew_M 12:d3eef5ea3f43 81 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
Andrew_M 12:d3eef5ea3f43 82 {0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
Andrew_M 12:d3eef5ea3f43 83 {0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0},
Andrew_M 12:d3eef5ea3f43 84 {0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0},
Andrew_M 12:d3eef5ea3f43 85 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0},
Andrew_M 12:d3eef5ea3f43 86 {0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0},
Andrew_M 12:d3eef5ea3f43 87 {0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
Andrew_M 12:d3eef5ea3f43 92 {0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0},
Andrew_M 12:d3eef5ea3f43 95 {0,0,0,0,0,0,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,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0},
Andrew_M 12:d3eef5ea3f43 98 {0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,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 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
Andrew_M 12:d3eef5ea3f43 101 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
Andrew_M 12:d3eef5ea3f43 102 };
Andrew_M 12:d3eef5ea3f43 103
Andrew_M 12:d3eef5ea3f43 104 for(int i = 0; i < 22; i++) {
Andrew_M 12:d3eef5ea3f43 105 for (int j = 0; j < 22; j++) {
Andrew_M 12:d3eef5ea3f43 106 _grid[i][j] = _newGrid[i][j];
Andrew_M 12:d3eef5ea3f43 107 }
Andrew_M 12:d3eef5ea3f43 108 }
Andrew_M 1:a14415de3ad5 109 }
Andrew_M 1:a14415de3ad5 110
Andrew_M 1:a14415de3ad5 111 void Engine::read_input(Gamepad &pad)
Andrew_M 1:a14415de3ad5 112 {
Andrew_M 1:a14415de3ad5 113 _d = pad.get_direction();
Andrew_M 1:a14415de3ad5 114 }
Andrew_M 1:a14415de3ad5 115
Andrew_M 1:a14415de3ad5 116 void Engine::draw(N5110 &lcd)
Andrew_M 1:a14415de3ad5 117 {
Andrew_M 2:9ca5e1c221c3 118 lcd.drawRect(0,0,48,48,FILL_TRANSPARENT);
Andrew_M 11:b25874e7efe4 119
Andrew_M 2:9ca5e1c221c3 120 for (int j = 0; j < 22; j++) {
Andrew_M 2:9ca5e1c221c3 121 for (int i = 0; i < 22; i++) {
Andrew_M 2:9ca5e1c221c3 122 if (_grid[i][j] != 0) {
Andrew_M 4:6353f829c56c 123 lcd.drawRect((2 * i) + 2,(2 * j) + 2,2,2,FILL_BLACK);
Andrew_M 2:9ca5e1c221c3 124 }
Andrew_M 2:9ca5e1c221c3 125 }
Andrew_M 2:9ca5e1c221c3 126 }
Andrew_M 11:b25874e7efe4 127
Andrew_M 11:b25874e7efe4 128 lcd.printString("Score",50,0);
Andrew_M 7:c1e0593bfc99 129
Andrew_M 7:c1e0593bfc99 130
Andrew_M 7:c1e0593bfc99 131 int _score = (_solid.getLength() - 3);
Andrew_M 7:c1e0593bfc99 132
Andrew_M 11:b25874e7efe4 133 char buffer1[21];
Andrew_M 11:b25874e7efe4 134 sprintf(buffer1,"%3d",_score);
Andrew_M 11:b25874e7efe4 135 lcd.printString(buffer1,50,1); // font is 8 wide, so leave 4 pixel gape from middle assuming two digits
Andrew_M 12:d3eef5ea3f43 136 }
Andrew_M 12:d3eef5ea3f43 137
Andrew_M 12:d3eef5ea3f43 138 void Engine::gameOverScreen(N5110 &lcd)
Andrew_M 12:d3eef5ea3f43 139 {
Andrew_M 12:d3eef5ea3f43 140 for (int i = 0; i < 22; i++) {
Andrew_M 12:d3eef5ea3f43 141 for (int j = 0; j < 22; j++) {
Andrew_M 12:d3eef5ea3f43 142 lcd.drawRect((2 * i) + 2,(2 * j) + 2,2,2,FILL_BLACK);
Andrew_M 12:d3eef5ea3f43 143 wait(0.01);
Andrew_M 12:d3eef5ea3f43 144 lcd.refresh();
Andrew_M 5:a3a9e0417e04 145 }
Andrew_M 11:b25874e7efe4 146 }
Andrew_M 1:a14415de3ad5 147 }
Andrew_M 1:a14415de3ad5 148
Andrew_M 1:a14415de3ad5 149 void Engine::update(Gamepad &pad)
Andrew_M 1:a14415de3ad5 150 {
Andrew_M 12:d3eef5ea3f43 151 loadLvl();
Andrew_M 3:6253a2d374fa 152
Andrew_M 3:6253a2d374fa 153 _solid.update(_d);
Andrew_M 3:6253a2d374fa 154
Andrew_M 4:6353f829c56c 155 int _l =_solid.getLength();
Andrew_M 3:6253a2d374fa 156
Andrew_M 11:b25874e7efe4 157 for (int z = 0; z < _l; z++) {
Andrew_M 11:b25874e7efe4 158
Andrew_M 11:b25874e7efe4 159 if (_solid.getX(z) > 21 || _solid.getX(z) < 0) {
Andrew_M 11:b25874e7efe4 160 _gameOver = true;
Andrew_M 11:b25874e7efe4 161 } else if (_solid.getY(z) > 21 || _solid.getY(z) < 0) {
Andrew_M 11:b25874e7efe4 162 _gameOver = true;
Andrew_M 11:b25874e7efe4 163 }
Andrew_M 11:b25874e7efe4 164
Andrew_M 11:b25874e7efe4 165 if (_grid[_solid.getX(z)][_solid.getY(z)] != 1) {
Andrew_M 11:b25874e7efe4 166 _grid[_solid.getX(z)][_solid.getY(z)] = 1;
Andrew_M 5:a3a9e0417e04 167 } else {
Andrew_M 5:a3a9e0417e04 168 _gameOver = true;
Andrew_M 5:a3a9e0417e04 169 }
Andrew_M 5:a3a9e0417e04 170 }
Andrew_M 5:a3a9e0417e04 171
Andrew_M 5:a3a9e0417e04 172 _grid[_noodles.getY()][_noodles.getY()] = 2;
Andrew_M 5:a3a9e0417e04 173
Andrew_M 11:b25874e7efe4 174 if (_grid[_solid.getX(0)][_solid.getY(0)] == 2) { //checks if the head has reached food
Andrew_M 11:b25874e7efe4 175 if (_solid.getLength()<484) { //checks if the snake can grow any more
Andrew_M 7:c1e0593bfc99 176
Andrew_M 7:c1e0593bfc99 177 _solid.grow(); //makes snake longer
Andrew_M 7:c1e0593bfc99 178
Andrew_M 7:c1e0593bfc99 179 bool empty = false; //makes a varible for finding an empty square
Andrew_M 7:c1e0593bfc99 180 while (!empty) { //loops until empty square found
Andrew_M 7:c1e0593bfc99 181 _noodles.random(); //randomise position of noodles
Andrew_M 7:c1e0593bfc99 182 if ( _grid[_noodles.getY()][_noodles.getY()] == 0) {
Andrew_M 7:c1e0593bfc99 183 empty = true; //stops looping when free space is found
Andrew_M 7:c1e0593bfc99 184 // 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 185 }
Andrew_M 7:c1e0593bfc99 186 }
Andrew_M 5:a3a9e0417e04 187 }
Andrew_M 4:6353f829c56c 188 }
Andrew_M 1:a14415de3ad5 189 }
Andrew_M 5:a3a9e0417e04 190
Andrew_M 12:d3eef5ea3f43 191 int Engine::getScore()
Andrew_M 12:d3eef5ea3f43 192 {
Andrew_M 11:b25874e7efe4 193 return _score;
Andrew_M 12:d3eef5ea3f43 194 }
Andrew_M 12:d3eef5ea3f43 195
Andrew_M 11:b25874e7efe4 196
Andrew_M 12:d3eef5ea3f43 197 bool Engine::getGameOver()
Andrew_M 12:d3eef5ea3f43 198 {
Andrew_M 12:d3eef5ea3f43 199 return _gameOver;
Andrew_M 12:d3eef5ea3f43 200 }
Andrew_M 12:d3eef5ea3f43 201