ELEC2645 (2017/18) / Mbed OS el16ajm
Committer:
Andrew_M
Date:
Mon Apr 30 15:07:08 2018 +0000
Revision:
6:ed553fd191c2
Parent:
5:a3a9e0417e04
Child:
7:c1e0593bfc99
Added a score counter on screen so the player knows how many points/ how long the snake is;

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 6:ed553fd191c2 16 _solid.init(10,4);
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 2:9ca5e1c221c3 28 for (int j = 0; j < 22; j++) {
Andrew_M 2:9ca5e1c221c3 29 for (int i = 0; i < 22; i++) {
Andrew_M 2:9ca5e1c221c3 30 if (_grid[i][j] != 0) {
Andrew_M 4:6353f829c56c 31 lcd.drawRect((2 * i) + 2,(2 * j) + 2,2,2,FILL_BLACK);
Andrew_M 2:9ca5e1c221c3 32 }
Andrew_M 2:9ca5e1c221c3 33 }
Andrew_M 2:9ca5e1c221c3 34 }
Andrew_M 5:a3a9e0417e04 35
Andrew_M 5:a3a9e0417e04 36 if (_gameOver) {
Andrew_M 5:a3a9e0417e04 37 for (int i = 0; i <= 22; i++) {
Andrew_M 5:a3a9e0417e04 38 for (int j = 0; j <= 22; j++) {
Andrew_M 5:a3a9e0417e04 39 lcd.drawRect((2 * i) + 1,(2 * j) + 1,2,2,FILL_BLACK);
Andrew_M 5:a3a9e0417e04 40 wait(0.01);
Andrew_M 5:a3a9e0417e04 41 lcd.refresh();
Andrew_M 5:a3a9e0417e04 42 }
Andrew_M 5:a3a9e0417e04 43 }
Andrew_M 5:a3a9e0417e04 44 }
Andrew_M 5:a3a9e0417e04 45
Andrew_M 6:ed553fd191c2 46 lcd.printString("Score",48,0);
Andrew_M 6:ed553fd191c2 47
Andrew_M 5:a3a9e0417e04 48
Andrew_M 6:ed553fd191c2 49 int _score = (_solid.getLength() - 3);
Andrew_M 6:ed553fd191c2 50
Andrew_M 6:ed553fd191c2 51 char buffer1[14];
Andrew_M 6:ed553fd191c2 52 sprintf(buffer1,"%2d",_score);
Andrew_M 6:ed553fd191c2 53 lcd.printString(buffer1,48,1); // font is 8 wide, so leave 4 pixel gape from middle assuming two digits
Andrew_M 1:a14415de3ad5 54 }
Andrew_M 1:a14415de3ad5 55
Andrew_M 1:a14415de3ad5 56 void Engine::update(Gamepad &pad)
Andrew_M 1:a14415de3ad5 57 {
Andrew_M 3:6253a2d374fa 58 memset(_grid, 0, sizeof(_grid));
Andrew_M 3:6253a2d374fa 59
Andrew_M 3:6253a2d374fa 60 _solid.update(_d);
Andrew_M 3:6253a2d374fa 61
Andrew_M 4:6353f829c56c 62 int _l =_solid.getLength();
Andrew_M 3:6253a2d374fa 63
Andrew_M 5:a3a9e0417e04 64 for (int i = 0; i < _l; i++) {
Andrew_M 5:a3a9e0417e04 65 if (_grid[_solid.getX(i)][_solid.getY(i)] != 1) {
Andrew_M 5:a3a9e0417e04 66 _grid[_solid.getX(i)][_solid.getY(i)] = 1;
Andrew_M 5:a3a9e0417e04 67 } else {
Andrew_M 5:a3a9e0417e04 68 _gameOver = true;
Andrew_M 5:a3a9e0417e04 69 }
Andrew_M 5:a3a9e0417e04 70 }
Andrew_M 5:a3a9e0417e04 71
Andrew_M 5:a3a9e0417e04 72 _grid[_noodles.getY()][_noodles.getY()] = 2;
Andrew_M 5:a3a9e0417e04 73
Andrew_M 5:a3a9e0417e04 74 if (_grid[_solid.getX(0)][_solid.getY(0)] == 2) {
Andrew_M 5:a3a9e0417e04 75 if (_solid.getLength()<100) {
Andrew_M 5:a3a9e0417e04 76 _solid.grow();
Andrew_M 5:a3a9e0417e04 77 }
Andrew_M 4:6353f829c56c 78 }
Andrew_M 1:a14415de3ad5 79 }
Andrew_M 5:a3a9e0417e04 80