ELEC2645 (2017/18) / Mbed OS el16ajm
Committer:
Andrew_M
Date:
Mon May 07 00:10:25 2018 +0000
Revision:
11:b25874e7efe4
Parent:
8:9d01fd4a63ad
Child:
12:d3eef5ea3f43
Difficulty is now selectable, uses FPS to speed up game. Adaptive difficulty changes speed depending on score

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 3:6253a2d374fa 15 memset(_grid, 0, sizeof(_grid));
Andrew_M 11:b25874e7efe4 16 _solid.init(5,15);
Andrew_M 5:a3a9e0417e04 17 _noodles.init(10,10);
Andrew_M 1:a14415de3ad5 18 }
Andrew_M 1:a14415de3ad5 19
Andrew_M 1:a14415de3ad5 20 void Engine::read_input(Gamepad &pad)
Andrew_M 1:a14415de3ad5 21 {
Andrew_M 1:a14415de3ad5 22 _d = pad.get_direction();
Andrew_M 1:a14415de3ad5 23 }
Andrew_M 1:a14415de3ad5 24
Andrew_M 1:a14415de3ad5 25 void Engine::draw(N5110 &lcd)
Andrew_M 1:a14415de3ad5 26 {
Andrew_M 2:9ca5e1c221c3 27 lcd.drawRect(0,0,48,48,FILL_TRANSPARENT);
Andrew_M 11:b25874e7efe4 28
Andrew_M 2:9ca5e1c221c3 29 for (int j = 0; j < 22; j++) {
Andrew_M 2:9ca5e1c221c3 30 for (int i = 0; i < 22; i++) {
Andrew_M 2:9ca5e1c221c3 31 if (_grid[i][j] != 0) {
Andrew_M 4:6353f829c56c 32 lcd.drawRect((2 * i) + 2,(2 * j) + 2,2,2,FILL_BLACK);
Andrew_M 2:9ca5e1c221c3 33 }
Andrew_M 2:9ca5e1c221c3 34 }
Andrew_M 2:9ca5e1c221c3 35 }
Andrew_M 11:b25874e7efe4 36
Andrew_M 11:b25874e7efe4 37 lcd.printString("Score",50,0);
Andrew_M 7:c1e0593bfc99 38
Andrew_M 7:c1e0593bfc99 39
Andrew_M 7:c1e0593bfc99 40 int _score = (_solid.getLength() - 3);
Andrew_M 7:c1e0593bfc99 41
Andrew_M 11:b25874e7efe4 42 char buffer1[21];
Andrew_M 11:b25874e7efe4 43 sprintf(buffer1,"%3d",_score);
Andrew_M 11:b25874e7efe4 44 lcd.printString(buffer1,50,1); // font is 8 wide, so leave 4 pixel gape from middle assuming two digits
Andrew_M 11:b25874e7efe4 45
Andrew_M 5:a3a9e0417e04 46 if (_gameOver) {
Andrew_M 11:b25874e7efe4 47 for (int i = 0; i < 22; i++) {
Andrew_M 11:b25874e7efe4 48 for (int j = 0; j < 22; j++) {
Andrew_M 11:b25874e7efe4 49 lcd.drawRect((2 * i) + 3,(2 * j) + 3,2,2,FILL_BLACK);
Andrew_M 5:a3a9e0417e04 50 wait(0.01);
Andrew_M 5:a3a9e0417e04 51 lcd.refresh();
Andrew_M 5:a3a9e0417e04 52 }
Andrew_M 5:a3a9e0417e04 53 }
Andrew_M 11:b25874e7efe4 54 }
Andrew_M 11:b25874e7efe4 55
Andrew_M 1:a14415de3ad5 56 }
Andrew_M 1:a14415de3ad5 57
Andrew_M 1:a14415de3ad5 58 void Engine::update(Gamepad &pad)
Andrew_M 1:a14415de3ad5 59 {
Andrew_M 3:6253a2d374fa 60 memset(_grid, 0, sizeof(_grid));
Andrew_M 3:6253a2d374fa 61
Andrew_M 3:6253a2d374fa 62 _solid.update(_d);
Andrew_M 3:6253a2d374fa 63
Andrew_M 4:6353f829c56c 64 int _l =_solid.getLength();
Andrew_M 3:6253a2d374fa 65
Andrew_M 11:b25874e7efe4 66 for (int z = 0; z < _l; z++) {
Andrew_M 11:b25874e7efe4 67
Andrew_M 11:b25874e7efe4 68 if (_solid.getX(z) > 21 || _solid.getX(z) < 0) {
Andrew_M 11:b25874e7efe4 69 _gameOver = true;
Andrew_M 11:b25874e7efe4 70 } else if (_solid.getY(z) > 21 || _solid.getY(z) < 0) {
Andrew_M 11:b25874e7efe4 71 _gameOver = true;
Andrew_M 11:b25874e7efe4 72 }
Andrew_M 11:b25874e7efe4 73
Andrew_M 11:b25874e7efe4 74 if (_grid[_solid.getX(z)][_solid.getY(z)] != 1) {
Andrew_M 11:b25874e7efe4 75 _grid[_solid.getX(z)][_solid.getY(z)] = 1;
Andrew_M 5:a3a9e0417e04 76 } else {
Andrew_M 5:a3a9e0417e04 77 _gameOver = true;
Andrew_M 5:a3a9e0417e04 78 }
Andrew_M 5:a3a9e0417e04 79 }
Andrew_M 5:a3a9e0417e04 80
Andrew_M 5:a3a9e0417e04 81 _grid[_noodles.getY()][_noodles.getY()] = 2;
Andrew_M 5:a3a9e0417e04 82
Andrew_M 11:b25874e7efe4 83 if (_grid[_solid.getX(0)][_solid.getY(0)] == 2) { //checks if the head has reached food
Andrew_M 11:b25874e7efe4 84 if (_solid.getLength()<484) { //checks if the snake can grow any more
Andrew_M 7:c1e0593bfc99 85
Andrew_M 7:c1e0593bfc99 86 _solid.grow(); //makes snake longer
Andrew_M 7:c1e0593bfc99 87
Andrew_M 7:c1e0593bfc99 88 bool empty = false; //makes a varible for finding an empty square
Andrew_M 7:c1e0593bfc99 89 while (!empty) { //loops until empty square found
Andrew_M 7:c1e0593bfc99 90 _noodles.random(); //randomise position of noodles
Andrew_M 7:c1e0593bfc99 91 if ( _grid[_noodles.getY()][_noodles.getY()] == 0) {
Andrew_M 7:c1e0593bfc99 92 empty = true; //stops looping when free space is found
Andrew_M 7:c1e0593bfc99 93 // 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 94 }
Andrew_M 7:c1e0593bfc99 95 }
Andrew_M 5:a3a9e0417e04 96 }
Andrew_M 4:6353f829c56c 97 }
Andrew_M 1:a14415de3ad5 98 }
Andrew_M 5:a3a9e0417e04 99
Andrew_M 11:b25874e7efe4 100 int Engine::getScore(){
Andrew_M 11:b25874e7efe4 101 return _score;
Andrew_M 11:b25874e7efe4 102 }
Andrew_M 11:b25874e7efe4 103