Fiifi Mills / Mbed 2 deprecated Snake

Dependencies:   N5110 PinDetect PowerControl mbed

Committer:
fiifimills
Date:
Sun May 03 19:59:04 2015 +0000
Revision:
5:6dd0bec55e52
Parent:
4:07acce768fb6
Child:
6:f3cebcce5c9a
3rd MAY: 20.58 - Sorting out Menu implementation still. Bug with moving selection circle

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fiifimills 0:3bcffeeec36d 1 #include "mbed.h"
fiifimills 0:3bcffeeec36d 2 #include "N5110.h"
fiifimills 0:3bcffeeec36d 3 #include "PinDetect.h"
fiifimills 3:8fa09c9a93f3 4 #include "PowerControl/PowerControl.h"
fiifimills 3:8fa09c9a93f3 5 #include "PowerControl/EthernetPowerControl.h"
fiifimills 0:3bcffeeec36d 6 #include <vector>
fiifimills 0:3bcffeeec36d 7 #include <stdlib.h> /* srand, rand */
fiifimills 0:3bcffeeec36d 8 #include <time.h>
fiifimills 0:3bcffeeec36d 9
fiifimills 0:3bcffeeec36d 10 /* Code for Snake game
fiifimills 0:3bcffeeec36d 11
fiifimills 0:3bcffeeec36d 12 B.F. Mills
fiifimills 0:3bcffeeec36d 13
fiifimills 0:3bcffeeec36d 14 April 12th 2015
fiifimills 0:3bcffeeec36d 15
fiifimills 0:3bcffeeec36d 16 */
fiifimills 0:3bcffeeec36d 17
fiifimills 0:3bcffeeec36d 18 // change this to alter tolerance of joystick direction
fiifimills 0:3bcffeeec36d 19 #define DIRECTION_TOLERANCE 0.05
fiifimills 0:3bcffeeec36d 20
fiifimills 0:3bcffeeec36d 21 // vcc, sce, rst, dc, mosi, sck, backlight
fiifimills 0:3bcffeeec36d 22 N5110 lcd(p7, p8, p9, p10, p11, p13, p26);
fiifimills 0:3bcffeeec36d 23
fiifimills 0:3bcffeeec36d 24 // joystick connections
fiifimills 0:3bcffeeec36d 25 AnalogIn yPot(p15);
fiifimills 0:3bcffeeec36d 26 AnalogIn xPot(p16);
fiifimills 0:3bcffeeec36d 27 DigitalIn button(p17);
fiifimills 0:3bcffeeec36d 28
fiifimills 0:3bcffeeec36d 29 // leds
fiifimills 0:3bcffeeec36d 30 DigitalOut led1(p24);
fiifimills 0:3bcffeeec36d 31 DigitalOut led2(p23);
fiifimills 0:3bcffeeec36d 32
fiifimills 0:3bcffeeec36d 33 // buttons
fiifimills 0:3bcffeeec36d 34 PinDetect buttonA(p30);
fiifimills 0:3bcffeeec36d 35 PinDetect buttonB(p29);
fiifimills 0:3bcffeeec36d 36
fiifimills 0:3bcffeeec36d 37 // timer to regularly read the joystick
fiifimills 0:3bcffeeec36d 38 Ticker pollJoystick;
fiifimills 0:3bcffeeec36d 39 // Serial for debug
fiifimills 0:3bcffeeec36d 40 Serial serial(USBTX,USBRX);
fiifimills 0:3bcffeeec36d 41
fiifimills 0:3bcffeeec36d 42 // create enumerated type (0,1,2,3 etc. for direction)
fiifimills 0:3bcffeeec36d 43 // could be extended for diagonals etc.
fiifimills 0:3bcffeeec36d 44 enum DirectionName {
fiifimills 0:3bcffeeec36d 45 UP,
fiifimills 0:3bcffeeec36d 46 DOWN,
fiifimills 0:3bcffeeec36d 47 LEFT,
fiifimills 0:3bcffeeec36d 48 RIGHT,
fiifimills 0:3bcffeeec36d 49 CENTRE,
fiifimills 0:3bcffeeec36d 50 UNKNOWN
fiifimills 0:3bcffeeec36d 51 };
fiifimills 0:3bcffeeec36d 52
fiifimills 0:3bcffeeec36d 53 // enumerated type for game menu screen to be displayed
fiifimills 0:3bcffeeec36d 54 enum GameMenu {
fiifimills 0:3bcffeeec36d 55 STARTUP, // 0
fiifimills 3:8fa09c9a93f3 56 SELECTSPEED, // 1
fiifimills 3:8fa09c9a93f3 57 GAMEPLAY, // 2
fiifimills 0:3bcffeeec36d 58 };
fiifimills 0:3bcffeeec36d 59
fiifimills 0:3bcffeeec36d 60 // struct for Joystick
fiifimills 0:3bcffeeec36d 61 typedef struct JoyStick Joystick;
fiifimills 0:3bcffeeec36d 62 struct JoyStick {
fiifimills 0:3bcffeeec36d 63 float x; // current x value
fiifimills 0:3bcffeeec36d 64 float x0; // 'centred' x value
fiifimills 0:3bcffeeec36d 65 float y; // current y value
fiifimills 0:3bcffeeec36d 66 float y0; // 'centred' y value
fiifimills 0:3bcffeeec36d 67 int button; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
fiifimills 0:3bcffeeec36d 68 DirectionName direction; // current direction
fiifimills 0:3bcffeeec36d 69 };
fiifimills 0:3bcffeeec36d 70 // create struct variable
fiifimills 0:3bcffeeec36d 71 Joystick joystick;
fiifimills 0:3bcffeeec36d 72
fiifimills 5:6dd0bec55e52 73 GameMenu currentGameMenu; // create game menu object
fiifimills 5:6dd0bec55e52 74
fiifimills 0:3bcffeeec36d 75 int printFlag = 0;
fiifimills 0:3bcffeeec36d 76
fiifimills 4:07acce768fb6 77 int score = 0;
fiifimills 4:07acce768fb6 78 char buffer [14];
fiifimills 0:3bcffeeec36d 79 bool gameOver; // boolean variable for game over
fiifimills 5:6dd0bec55e52 80 int xCentre = 4;
fiifimills 5:6dd0bec55e52 81 int yCentre = 11;
fiifimills 0:3bcffeeec36d 82
fiifimills 0:3bcffeeec36d 83 void pressedA()
fiifimills 0:3bcffeeec36d 84 {
fiifimills 5:6dd0bec55e52 85 if (currentGameMenu == STARTUP) { // if currentGameMenu is startup and A is pressed, segue to gameplay
fiifimills 1:e250a8a33766 86 lcd.clear();
fiifimills 4:07acce768fb6 87 currentGameMenu = SELECTSPEED;
fiifimills 5:6dd0bec55e52 88 }
fiifimills 5:6dd0bec55e52 89
fiifimills 5:6dd0bec55e52 90 else if (currentGameMenu == SELECTSPEED) {
fiifimills 4:07acce768fb6 91 lcd.clear();
fiifimills 4:07acce768fb6 92 currentGameMenu = GAMEPLAY;
fiifimills 5:6dd0bec55e52 93 }
fiifimills 0:3bcffeeec36d 94 }
fiifimills 0:3bcffeeec36d 95
fiifimills 0:3bcffeeec36d 96 void pressedB()
fiifimills 0:3bcffeeec36d 97 {
fiifimills 0:3bcffeeec36d 98 if (currentGameMenu == GAMEPLAY && gameOver == true) { // if current game menu is gameplay AND the game is over, segue to startup
fiifimills 1:e250a8a33766 99 lcd.clear();
fiifimills 0:3bcffeeec36d 100 gameOver = false; // set gameOver to false
fiifimills 4:07acce768fb6 101 currentGameMenu = STARTUP; // go back to startup screen/select speed screen?
fiifimills 4:07acce768fb6 102 score = 0;
fiifimills 0:3bcffeeec36d 103 }
fiifimills 0:3bcffeeec36d 104
fiifimills 0:3bcffeeec36d 105 }
fiifimills 0:3bcffeeec36d 106
fiifimills 0:3bcffeeec36d 107
fiifimills 0:3bcffeeec36d 108 // function prototypes
fiifimills 0:3bcffeeec36d 109 void calibrateJoystick();
fiifimills 0:3bcffeeec36d 110 void updateJoystick();
fiifimills 0:3bcffeeec36d 111 void moveSnake();
fiifimills 5:6dd0bec55e52 112 void speedSelect();
fiifimills 5:6dd0bec55e52 113 void pause();
fiifimills 0:3bcffeeec36d 114
fiifimills 0:3bcffeeec36d 115
fiifimills 0:3bcffeeec36d 116 // struct for coordinates of snake
fiifimills 0:3bcffeeec36d 117 struct coordinate {
fiifimills 0:3bcffeeec36d 118 int x; // x coordinate
fiifimills 0:3bcffeeec36d 119 int y; // y coordinate
fiifimills 0:3bcffeeec36d 120 };
fiifimills 0:3bcffeeec36d 121
fiifimills 0:3bcffeeec36d 122 std::vector<coordinate> Snake; // create a vector that stores coordinate structs
fiifimills 0:3bcffeeec36d 123
fiifimills 0:3bcffeeec36d 124 DirectionName currentDirection; // enum object for current direction of movement for snake
fiifimills 0:3bcffeeec36d 125 DirectionName previousDirection; // enum object for previous direction " " " "
fiifimills 0:3bcffeeec36d 126
fiifimills 0:3bcffeeec36d 127 int main()
fiifimills 0:3bcffeeec36d 128 {
fiifimills 0:3bcffeeec36d 129
fiifimills 0:3bcffeeec36d 130 calibrateJoystick(); // get centred values of joystick
fiifimills 0:3bcffeeec36d 131 pollJoystick.attach(&updateJoystick,1.0/10.0); // read joystick 10 times per second
fiifimills 0:3bcffeeec36d 132
fiifimills 0:3bcffeeec36d 133 lcd.init(); // initialise display
fiifimills 0:3bcffeeec36d 134 lcd.setBrightness(0.5); // set brightness of backlight
fiifimills 0:3bcffeeec36d 135
fiifimills 0:3bcffeeec36d 136 buttonA.mode(PullDown);
fiifimills 0:3bcffeeec36d 137 buttonB.mode(PullDown);
fiifimills 0:3bcffeeec36d 138 buttonA.attach_asserted(&pressedA); // if button A is pressed, call pressedA function
fiifimills 0:3bcffeeec36d 139 buttonB.attach_asserted(&pressedB); // if button B is pressed, call pressedB function
fiifimills 0:3bcffeeec36d 140 buttonA.setSampleFrequency();
fiifimills 0:3bcffeeec36d 141 buttonB.setSampleFrequency();
fiifimills 0:3bcffeeec36d 142
fiifimills 0:3bcffeeec36d 143 currentGameMenu = STARTUP; // initialise game menu to be splash screen
fiifimills 0:3bcffeeec36d 144 gameOver = false;
fiifimills 0:3bcffeeec36d 145
fiifimills 0:3bcffeeec36d 146 while (1) { // infinite loop
fiifimills 0:3bcffeeec36d 147
fiifimills 0:3bcffeeec36d 148 if (currentGameMenu == STARTUP) { // start up screen
fiifimills 0:3bcffeeec36d 149
fiifimills 0:3bcffeeec36d 150 // splash screen for startup
fiifimills 5:6dd0bec55e52 151
fiifimills 3:8fa09c9a93f3 152 lcd.printString("SNAKE",28,1); // x-value, bank from 0 - 6
fiifimills 5:6dd0bec55e52 153 lcd.printString("PRESS A",21,5);
fiifimills 5:6dd0bec55e52 154
fiifimills 3:8fa09c9a93f3 155 // x-origin, y-origin, width, height, fill: 0 - just outline, 1 - filled black, 2 - filled white
fiifimills 3:8fa09c9a93f3 156 lcd.drawRect(26,27,5,5,0); // bottom rect of snake
fiifimills 3:8fa09c9a93f3 157 lcd.drawRect(26,22,5,5,0); // directly above
fiifimills 3:8fa09c9a93f3 158 lcd.drawRect(31,22,5,5,0); // one to the right
fiifimills 3:8fa09c9a93f3 159 lcd.drawRect(36,22,5,5,0); // one to the right (3)
fiifimills 3:8fa09c9a93f3 160 lcd.drawRect(41,22,5,5,0); // one to the right (4)
fiifimills 3:8fa09c9a93f3 161 lcd.drawRect(51,22,5,5,1); // food
fiifimills 3:8fa09c9a93f3 162 lcd.refresh();
fiifimills 5:6dd0bec55e52 163
fiifimills 3:8fa09c9a93f3 164 Sleep();
fiifimills 5:6dd0bec55e52 165
fiifimills 5:6dd0bec55e52 166 }
fiifimills 5:6dd0bec55e52 167
fiifimills 5:6dd0bec55e52 168 if (currentGameMenu == SELECTSPEED) {
fiifimills 5:6dd0bec55e52 169
fiifimills 5:6dd0bec55e52 170 // code for speed select
fiifimills 5:6dd0bec55e52 171 lcd.printString("SLOW",10,1);
fiifimills 5:6dd0bec55e52 172 lcd.printString("MEDIUM",10,3);
fiifimills 5:6dd0bec55e52 173 lcd.printString("FAST",10,5);
fiifimills 5:6dd0bec55e52 174 lcd.printString("INSANE",46,1);
fiifimills 5:6dd0bec55e52 175
fiifimills 5:6dd0bec55e52 176 lcd.drawCircle(xCentre,yCentre,3,1); // slow selection circle
fiifimills 5:6dd0bec55e52 177 lcd.refresh();
fiifimills 3:8fa09c9a93f3 178
fiifimills 0:3bcffeeec36d 179 }
fiifimills 5:6dd0bec55e52 180
fiifimills 5:6dd0bec55e52 181 if (currentGameMenu == GAMEPLAY) { // in game
fiifimills 5:6dd0bec55e52 182
fiifimills 5:6dd0bec55e52 183 if (gameOver == false) { // whilst game is playing
fiifimills 0:3bcffeeec36d 184
fiifimills 5:6dd0bec55e52 185 previousDirection = RIGHT; // initialise first direction to be right
fiifimills 0:3bcffeeec36d 186
fiifimills 5:6dd0bec55e52 187 // set of initial coordinates
fiifimills 5:6dd0bec55e52 188 coordinate cord0 = {45, 24};
fiifimills 5:6dd0bec55e52 189 coordinate cord1 = {46, 24};
fiifimills 5:6dd0bec55e52 190 coordinate cord2 = {47, 24};
fiifimills 5:6dd0bec55e52 191 coordinate cord3 = {48, 24};
fiifimills 0:3bcffeeec36d 192
fiifimills 5:6dd0bec55e52 193 // add these coordinates to end of snake vector
fiifimills 5:6dd0bec55e52 194 Snake.push_back(cord0);
fiifimills 5:6dd0bec55e52 195 Snake.push_back(cord1);
fiifimills 5:6dd0bec55e52 196 Snake.push_back(cord2);
fiifimills 5:6dd0bec55e52 197 Snake.push_back(cord3);
fiifimills 0:3bcffeeec36d 198
fiifimills 5:6dd0bec55e52 199 // set these co-ordinate's pixels
fiifimills 5:6dd0bec55e52 200 for (int i=0; i<Snake.size(); i++) {
fiifimills 5:6dd0bec55e52 201 lcd.setPixel(Snake.at(i).x, Snake.at(i).y);
fiifimills 5:6dd0bec55e52 202 lcd.refresh();
fiifimills 5:6dd0bec55e52 203 }
fiifimills 0:3bcffeeec36d 204
fiifimills 5:6dd0bec55e52 205 moveSnake();
fiifimills 0:3bcffeeec36d 206 }
fiifimills 0:3bcffeeec36d 207
fiifimills 5:6dd0bec55e52 208 if (gameOver == true) {
fiifimills 5:6dd0bec55e52 209
fiifimills 5:6dd0bec55e52 210 Snake.clear(); // clear snake vector
fiifimills 5:6dd0bec55e52 211
fiifimills 5:6dd0bec55e52 212 // game over splash screen
fiifimills 5:6dd0bec55e52 213 lcd.printString("Game Over!",14,1);
fiifimills 5:6dd0bec55e52 214 lcd.printString("Press B",23,4);
fiifimills 5:6dd0bec55e52 215 int printScore = sprintf(buffer,"Score = %d",score*5);
fiifimills 5:6dd0bec55e52 216 if (printScore <= 14)
fiifimills 5:6dd0bec55e52 217 lcd.printString(buffer,16,3);
fiifimills 5:6dd0bec55e52 218
fiifimills 5:6dd0bec55e52 219 Sleep();
fiifimills 5:6dd0bec55e52 220 }
fiifimills 0:3bcffeeec36d 221 }
fiifimills 0:3bcffeeec36d 222
fiifimills 0:3bcffeeec36d 223 }
fiifimills 0:3bcffeeec36d 224 }
fiifimills 0:3bcffeeec36d 225
fiifimills 0:3bcffeeec36d 226 // read default positions of the joystick to calibrate later readings
fiifimills 5:6dd0bec55e52 227 void calibrateJoystick() {
fiifimills 5:6dd0bec55e52 228 button.mode(PullDown);
fiifimills 5:6dd0bec55e52 229 // must not move during calibration
fiifimills 5:6dd0bec55e52 230 joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
fiifimills 5:6dd0bec55e52 231 joystick.y0 = yPot;
fiifimills 0:3bcffeeec36d 232 }
fiifimills 0:3bcffeeec36d 233
fiifimills 5:6dd0bec55e52 234 void updateJoystick() {
fiifimills 5:6dd0bec55e52 235 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
fiifimills 5:6dd0bec55e52 236 joystick.x = xPot - joystick.x0;
fiifimills 5:6dd0bec55e52 237 joystick.y = yPot - joystick.y0;
fiifimills 5:6dd0bec55e52 238 // read button state
fiifimills 5:6dd0bec55e52 239 joystick.button = button;
fiifimills 0:3bcffeeec36d 240
fiifimills 5:6dd0bec55e52 241 // calculate direction depending on x,y values
fiifimills 5:6dd0bec55e52 242 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
fiifimills 5:6dd0bec55e52 243 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
fiifimills 5:6dd0bec55e52 244 joystick.direction = CENTRE;
fiifimills 5:6dd0bec55e52 245 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
fiifimills 5:6dd0bec55e52 246 joystick.direction = RIGHT;
fiifimills 5:6dd0bec55e52 247 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
fiifimills 5:6dd0bec55e52 248 joystick.direction = LEFT;
fiifimills 5:6dd0bec55e52 249 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
fiifimills 5:6dd0bec55e52 250 joystick.direction = DOWN;
fiifimills 5:6dd0bec55e52 251 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
fiifimills 5:6dd0bec55e52 252 joystick.direction = UP;
fiifimills 5:6dd0bec55e52 253 } else {
fiifimills 5:6dd0bec55e52 254 joystick.direction = UNKNOWN;
fiifimills 0:3bcffeeec36d 255 }
fiifimills 0:3bcffeeec36d 256
fiifimills 5:6dd0bec55e52 257 // set flag for printing
fiifimills 5:6dd0bec55e52 258 printFlag = 1;
fiifimills 5:6dd0bec55e52 259 }
fiifimills 0:3bcffeeec36d 260
fiifimills 5:6dd0bec55e52 261 void moveSnake() {
fiifimills 5:6dd0bec55e52 262 srand(time(NULL));
fiifimills 0:3bcffeeec36d 263
fiifimills 5:6dd0bec55e52 264 int foodX = rand()%83+1; // random x coordinate between 1-83
fiifimills 5:6dd0bec55e52 265 int foodY = rand()%47+1; // random y coordinate between 1-47
fiifimills 0:3bcffeeec36d 266
fiifimills 5:6dd0bec55e52 267
fiifimills 5:6dd0bec55e52 268 lcd.setPixel(foodX,foodY); // set pixel of this coordinate (used for food)
fiifimills 5:6dd0bec55e52 269 lcd.refresh();
fiifimills 5:6dd0bec55e52 270
fiifimills 5:6dd0bec55e52 271 // draw border
fiifimills 5:6dd0bec55e52 272 lcd.drawRect(0,0,83,47,0); // x-origin, y-origin, width, height, fill
fiifimills 5:6dd0bec55e52 273 lcd.refresh();
fiifimills 5:6dd0bec55e52 274
fiifimills 5:6dd0bec55e52 275 while (1) {
fiifimills 0:3bcffeeec36d 276
fiifimills 5:6dd0bec55e52 277 if (joystick.direction == CENTRE) { // if the joystick is in the centre
fiifimills 5:6dd0bec55e52 278 currentDirection = previousDirection; // current direction is the previous direction of movement
fiifimills 5:6dd0bec55e52 279 }
fiifimills 5:6dd0bec55e52 280 if (joystick.direction == UNKNOWN) { // same for when joystick direction is unknown
fiifimills 5:6dd0bec55e52 281 currentDirection = previousDirection; // current direction is the previous direction
fiifimills 5:6dd0bec55e52 282 }
fiifimills 5:6dd0bec55e52 283 if (joystick.direction == LEFT) { // if joystick direction is left, right, up or down
fiifimills 5:6dd0bec55e52 284 currentDirection = joystick.direction; // set the current direction to be th joystick's direction
fiifimills 5:6dd0bec55e52 285 }
fiifimills 5:6dd0bec55e52 286 if (joystick.direction == RIGHT) {
fiifimills 5:6dd0bec55e52 287 currentDirection = joystick.direction;
fiifimills 5:6dd0bec55e52 288 }
fiifimills 5:6dd0bec55e52 289 if (joystick.direction == UP) {
fiifimills 5:6dd0bec55e52 290 currentDirection = joystick.direction;
fiifimills 5:6dd0bec55e52 291 }
fiifimills 5:6dd0bec55e52 292 if (joystick.direction == DOWN) {
fiifimills 5:6dd0bec55e52 293 currentDirection = joystick.direction;
fiifimills 5:6dd0bec55e52 294 }
fiifimills 0:3bcffeeec36d 295
fiifimills 5:6dd0bec55e52 296 lcd.clearPixel(Snake.front().x, Snake.front().y); // clearing tail pixel of snake
fiifimills 0:3bcffeeec36d 297
fiifimills 5:6dd0bec55e52 298 for (int i=0; i<Snake.size()-1; i++) { // shift along each element in the vector so that..
fiifimills 5:6dd0bec55e52 299 Snake.at(i) = Snake.at(i+1); // value of element 0=1, 1=2 etc.
fiifimills 5:6dd0bec55e52 300 }
fiifimills 0:3bcffeeec36d 301
fiifimills 0:3bcffeeec36d 302
fiifimills 5:6dd0bec55e52 303
fiifimills 0:3bcffeeec36d 304 switch (currentDirection) { // check the current direction
fiifimills 0:3bcffeeec36d 305
fiifimills 5:6dd0bec55e52 306 case UP: // if up
fiifimills 5:6dd0bec55e52 307 if (previousDirection == DOWN) { // check if the previous direction was opposite
fiifimills 5:6dd0bec55e52 308 currentDirection = DOWN; // if so, "do nothing"
fiifimills 5:6dd0bec55e52 309 Snake.back().y++;
fiifimills 5:6dd0bec55e52 310 } else {
fiifimills 5:6dd0bec55e52 311 previousDirection = UP; // else, set the previous direction
fiifimills 5:6dd0bec55e52 312 Snake.back().y--; // increment appropiate coordinate value
fiifimills 5:6dd0bec55e52 313 }
fiifimills 0:3bcffeeec36d 314 break;
fiifimills 0:3bcffeeec36d 315
fiifimills 0:3bcffeeec36d 316 case DOWN:
fiifimills 5:6dd0bec55e52 317 if (previousDirection == UP) {
fiifimills 5:6dd0bec55e52 318 currentDirection = UP;
fiifimills 5:6dd0bec55e52 319 Snake.back().y--;
fiifimills 5:6dd0bec55e52 320 } else {
fiifimills 5:6dd0bec55e52 321 previousDirection = DOWN;
fiifimills 5:6dd0bec55e52 322 Snake.back().y++;
fiifimills 5:6dd0bec55e52 323 }
fiifimills 0:3bcffeeec36d 324 break;
fiifimills 0:3bcffeeec36d 325
fiifimills 0:3bcffeeec36d 326 case LEFT:
fiifimills 5:6dd0bec55e52 327 if (previousDirection == RIGHT) {
fiifimills 5:6dd0bec55e52 328 currentDirection = RIGHT;
fiifimills 5:6dd0bec55e52 329 Snake.back().x++;
fiifimills 5:6dd0bec55e52 330 } else {
fiifimills 5:6dd0bec55e52 331 previousDirection = LEFT;
fiifimills 5:6dd0bec55e52 332 Snake.back().x--;
fiifimills 5:6dd0bec55e52 333 }
fiifimills 0:3bcffeeec36d 334 break;
fiifimills 0:3bcffeeec36d 335
fiifimills 0:3bcffeeec36d 336 case RIGHT:
fiifimills 5:6dd0bec55e52 337 if (previousDirection == LEFT) {
fiifimills 5:6dd0bec55e52 338 currentDirection = LEFT;
fiifimills 5:6dd0bec55e52 339 Snake.back().x--;
fiifimills 5:6dd0bec55e52 340 } else {
fiifimills 5:6dd0bec55e52 341 previousDirection = RIGHT;
fiifimills 5:6dd0bec55e52 342 Snake.back().x++;
fiifimills 5:6dd0bec55e52 343 }
fiifimills 0:3bcffeeec36d 344 break;
fiifimills 0:3bcffeeec36d 345
fiifimills 0:3bcffeeec36d 346 default:
fiifimills 0:3bcffeeec36d 347 break;
fiifimills 0:3bcffeeec36d 348 }
fiifimills 0:3bcffeeec36d 349
fiifimills 5:6dd0bec55e52 350 if (Snake.back().x == foodX && Snake.back().y == foodY) { // if the snake head's coordinates are equal to that of the food's coordinates
fiifimills 5:6dd0bec55e52 351
fiifimills 5:6dd0bec55e52 352 switch (currentDirection) { // check the current direction
fiifimills 5:6dd0bec55e52 353
fiifimills 5:6dd0bec55e52 354 case UP:
fiifimills 5:6dd0bec55e52 355 Snake.push_back(Snake.back()); // add an element to the vector past the last element, equal to snakeHead's coordinates
fiifimills 5:6dd0bec55e52 356 Snake.back().y--; // increment appropiate coordinate
fiifimills 5:6dd0bec55e52 357 foodX = rand()%83 + 1; // x coordinate of food is now a new random number between 1-83
fiifimills 5:6dd0bec55e52 358 foodY = rand()%47 + 1; // y coordinate of food is now a new random number between 1-47
fiifimills 5:6dd0bec55e52 359
fiifimills 5:6dd0bec55e52 360 lcd.setPixel(foodX,foodY); // set pixel of new food
fiifimills 5:6dd0bec55e52 361 lcd.refresh();
fiifimills 5:6dd0bec55e52 362 score++;
fiifimills 5:6dd0bec55e52 363 break;
fiifimills 5:6dd0bec55e52 364
fiifimills 5:6dd0bec55e52 365 case DOWN:
fiifimills 5:6dd0bec55e52 366 Snake.push_back(Snake.back());
fiifimills 5:6dd0bec55e52 367 Snake.back().y++;
fiifimills 5:6dd0bec55e52 368 foodX = rand()%83 + 1;
fiifimills 5:6dd0bec55e52 369 foodY = rand()%47 + 1;
fiifimills 5:6dd0bec55e52 370
fiifimills 5:6dd0bec55e52 371 lcd.setPixel(foodX,foodY);
fiifimills 5:6dd0bec55e52 372 lcd.refresh();
fiifimills 5:6dd0bec55e52 373 score++;
fiifimills 5:6dd0bec55e52 374 break;
fiifimills 5:6dd0bec55e52 375
fiifimills 5:6dd0bec55e52 376 case LEFT:
fiifimills 5:6dd0bec55e52 377 Snake.push_back(Snake.back());
fiifimills 5:6dd0bec55e52 378 Snake.back().x--;
fiifimills 5:6dd0bec55e52 379 foodX = rand()%83 + 1;
fiifimills 5:6dd0bec55e52 380 foodY = rand()%47 + 1;
fiifimills 5:6dd0bec55e52 381
fiifimills 5:6dd0bec55e52 382 lcd.setPixel(foodX,foodY);
fiifimills 5:6dd0bec55e52 383 lcd.refresh();
fiifimills 5:6dd0bec55e52 384 score++;
fiifimills 5:6dd0bec55e52 385 break;
fiifimills 5:6dd0bec55e52 386
fiifimills 5:6dd0bec55e52 387 case RIGHT:
fiifimills 5:6dd0bec55e52 388 Snake.push_back(Snake.back());
fiifimills 5:6dd0bec55e52 389 Snake.back().x++;
fiifimills 5:6dd0bec55e52 390 foodX = rand()%83 + 1;
fiifimills 5:6dd0bec55e52 391 foodY = rand()%47 + 1;
fiifimills 5:6dd0bec55e52 392
fiifimills 5:6dd0bec55e52 393 lcd.setPixel(foodX,foodY);
fiifimills 5:6dd0bec55e52 394 lcd.refresh();
fiifimills 5:6dd0bec55e52 395 score++;
fiifimills 5:6dd0bec55e52 396 break;
fiifimills 5:6dd0bec55e52 397
fiifimills 5:6dd0bec55e52 398 default:
fiifimills 5:6dd0bec55e52 399 break;
fiifimills 5:6dd0bec55e52 400 }
fiifimills 5:6dd0bec55e52 401
fiifimills 5:6dd0bec55e52 402 }
fiifimills 0:3bcffeeec36d 403
fiifimills 0:3bcffeeec36d 404
fiifimills 5:6dd0bec55e52 405 if (Snake.back().x > 82) { // if snakeHead's x coordinate is larger than 83 (i.e touching the right hand side border)
fiifimills 5:6dd0bec55e52 406 gameOver = true; // game over is true
fiifimills 5:6dd0bec55e52 407 break; // break out of infinite loop
fiifimills 5:6dd0bec55e52 408 }
fiifimills 0:3bcffeeec36d 409
fiifimills 5:6dd0bec55e52 410 if (Snake.back().x < 1) { // touching left hand side border
fiifimills 5:6dd0bec55e52 411 gameOver = true;
fiifimills 5:6dd0bec55e52 412 break;
fiifimills 5:6dd0bec55e52 413 }
fiifimills 0:3bcffeeec36d 414
fiifimills 5:6dd0bec55e52 415 if (Snake.back().y > 46) { // touching top border
fiifimills 5:6dd0bec55e52 416 gameOver = true;
fiifimills 5:6dd0bec55e52 417 break;
fiifimills 5:6dd0bec55e52 418 }
fiifimills 5:6dd0bec55e52 419
fiifimills 5:6dd0bec55e52 420 if (Snake.back().y < 1) { // touching bottom border
fiifimills 1:e250a8a33766 421 gameOver = true;
fiifimills 1:e250a8a33766 422 break;
fiifimills 5:6dd0bec55e52 423 }
fiifimills 5:6dd0bec55e52 424
fiifimills 5:6dd0bec55e52 425 for (int i = 0; i < Snake.size()-1; i++) {
fiifimills 5:6dd0bec55e52 426 if (Snake.back().x == Snake.at(i).x && Snake.back().y == Snake.at(i).y) {
fiifimills 5:6dd0bec55e52 427 serial.printf("Snake has hit itself");
fiifimills 5:6dd0bec55e52 428 gameOver = true;
fiifimills 5:6dd0bec55e52 429 break;
fiifimills 5:6dd0bec55e52 430 }
fiifimills 5:6dd0bec55e52 431 break;
fiifimills 5:6dd0bec55e52 432 }
fiifimills 5:6dd0bec55e52 433
fiifimills 5:6dd0bec55e52 434 lcd.setPixel(Snake.back().x, Snake.back().y); // set snakeHead's pixel
fiifimills 5:6dd0bec55e52 435 lcd.refresh();
fiifimills 5:6dd0bec55e52 436 wait(0.1);
fiifimills 5:6dd0bec55e52 437
fiifimills 5:6dd0bec55e52 438
fiifimills 1:e250a8a33766 439 }
fiifimills 1:e250a8a33766 440 }
fiifimills 0:3bcffeeec36d 441
fiifimills 5:6dd0bec55e52 442 void speedSelect() {
fiifimills 5:6dd0bec55e52 443
fiifimills 5:6dd0bec55e52 444 if (yCentre == 11){
fiifimills 5:6dd0bec55e52 445 lcd.clear();
fiifimills 5:6dd0bec55e52 446 lcd.printString("SLOW",10,1);
fiifimills 5:6dd0bec55e52 447 lcd.printString("MEDIUM",10,3);
fiifimills 5:6dd0bec55e52 448 lcd.printString("FAST",10,5);
fiifimills 5:6dd0bec55e52 449 lcd.printString("INSANE",46,1);
fiifimills 5:6dd0bec55e52 450 yCentre = 27;
fiifimills 5:6dd0bec55e52 451 lcd.drawCircle(xCentre,yCentre,3,1);
fiifimills 5:6dd0bec55e52 452 lcd.refresh();
fiifimills 5:6dd0bec55e52 453 wait(0.3);
fiifimills 5:6dd0bec55e52 454
fiifimills 5:6dd0bec55e52 455
fiifimills 5:6dd0bec55e52 456 serial.printf("xCentre = %d, yCentre = %d\n",xCentre,yCentre);
fiifimills 5:6dd0bec55e52 457 }
fiifimills 0:3bcffeeec36d 458
fiifimills 5:6dd0bec55e52 459 else if (yCentre == 27){
fiifimills 5:6dd0bec55e52 460 lcd.clear();
fiifimills 5:6dd0bec55e52 461 lcd.printString("SLOW",10,1);
fiifimills 5:6dd0bec55e52 462 lcd.printString("MEDIUM",10,3);
fiifimills 5:6dd0bec55e52 463 lcd.printString("FAST",10,5);
fiifimills 5:6dd0bec55e52 464 lcd.printString("INSANE!",46,1);
fiifimills 5:6dd0bec55e52 465 yCentre = 43;
fiifimills 5:6dd0bec55e52 466 lcd.drawCircle(xCentre,yCentre,3,1);
fiifimills 5:6dd0bec55e52 467 lcd.refresh();
fiifimills 5:6dd0bec55e52 468 wait(0.3);
fiifimills 5:6dd0bec55e52 469
fiifimills 5:6dd0bec55e52 470 serial.printf("xCentre = %d, yCentre = %d\n",xCentre,yCentre);
fiifimills 5:6dd0bec55e52 471 }
fiifimills 0:3bcffeeec36d 472
fiifimills 5:6dd0bec55e52 473 else if (yCentre == 43){
fiifimills 5:6dd0bec55e52 474 lcd.clear();
fiifimills 5:6dd0bec55e52 475 lcd.printString("SLOW",10,1);
fiifimills 5:6dd0bec55e52 476 lcd.printString("MEDIUM",10,3);
fiifimills 5:6dd0bec55e52 477 lcd.printString("FAST",10,5);
fiifimills 5:6dd0bec55e52 478 lcd.printString("INSANE",46,1);
fiifimills 5:6dd0bec55e52 479 xCentre = 42;
fiifimills 5:6dd0bec55e52 480 yCentre = 11;
fiifimills 5:6dd0bec55e52 481 lcd.drawCircle(xCentre,yCentre,3,1);
fiifimills 5:6dd0bec55e52 482 lcd.refresh();
fiifimills 5:6dd0bec55e52 483 wait(0.3);
fiifimills 5:6dd0bec55e52 484
fiifimills 5:6dd0bec55e52 485 serial.printf("xCentre = %d, yCentre = %d\n",xCentre,yCentre);
fiifimills 5:6dd0bec55e52 486 }
fiifimills 5:6dd0bec55e52 487
fiifimills 5:6dd0bec55e52 488 else {
fiifimills 5:6dd0bec55e52 489
fiifimills 5:6dd0bec55e52 490 lcd.clear();
fiifimills 5:6dd0bec55e52 491 lcd.printString("SLOW",10,1);
fiifimills 5:6dd0bec55e52 492 lcd.printString("MEDIUM",10,3);
fiifimills 5:6dd0bec55e52 493 lcd.printString("FAST",10,5);
fiifimills 5:6dd0bec55e52 494 lcd.printString("INSANE",46,1);
fiifimills 5:6dd0bec55e52 495 xCentre = 4;
fiifimills 5:6dd0bec55e52 496
fiifimills 5:6dd0bec55e52 497 lcd.drawCircle(xCentre,yCentre,3,1);
fiifimills 5:6dd0bec55e52 498 lcd.refresh();
fiifimills 5:6dd0bec55e52 499 wait(0.3);
fiifimills 5:6dd0bec55e52 500 serial.printf("Setting xCentre to 4");
fiifimills 5:6dd0bec55e52 501 }
fiifimills 0:3bcffeeec36d 502 }
fiifimills 0:3bcffeeec36d 503
fiifimills 0:3bcffeeec36d 504
fiifimills 0:3bcffeeec36d 505
fiifimills 0:3bcffeeec36d 506
fiifimills 0:3bcffeeec36d 507
fiifimills 0:3bcffeeec36d 508
fiifimills 0:3bcffeeec36d 509
fiifimills 0:3bcffeeec36d 510
fiifimills 0:3bcffeeec36d 511
fiifimills 5:6dd0bec55e52 512
fiifimills 5:6dd0bec55e52 513