Completed Snake Program

Dependencies:   N5110 PinDetect PowerControl mbed

Fork of DocTest by Craig Evans

Committer:
MBirney
Date:
Mon Apr 27 20:27:23 2015 +0000
Revision:
6:1de103a19681
Parent:
5:1bfc306466db
Child:
7:2942e97924f0
Attempting for 2x2 pixel snake

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MBirney 6:1de103a19681 1 #include "main.h"
MBirney 3:478b090b7e1b 2
MBirney 3:478b090b7e1b 3 // create enumerated type (0,1,2,3 etc. for direction)
MBirney 3:478b090b7e1b 4 enum DirectionName {
MBirney 3:478b090b7e1b 5 UP,
MBirney 3:478b090b7e1b 6 DOWN,
MBirney 3:478b090b7e1b 7 LEFT,
MBirney 3:478b090b7e1b 8 RIGHT,
MBirney 3:478b090b7e1b 9 CENTRE,
MBirney 3:478b090b7e1b 10 UNKNOWN
MBirney 3:478b090b7e1b 11 };
MBirney 3:478b090b7e1b 12
MBirney 6:1de103a19681 13 // create enumerated type (0,1,2 for difficulty)
MBirney 6:1de103a19681 14 enum Difficulty {
MBirney 6:1de103a19681 15 EASY,
MBirney 6:1de103a19681 16 MEDIUM,
MBirney 6:1de103a19681 17 HARD,
MBirney 6:1de103a19681 18 };
MBirney 6:1de103a19681 19
MBirney 6:1de103a19681 20 Difficulty currentDifficulty=EASY;
MBirney 6:1de103a19681 21
MBirney 6:1de103a19681 22
MBirney 3:478b090b7e1b 23 // struct for Joystick
MBirney 3:478b090b7e1b 24 typedef struct JoyStick Joystick;
MBirney 3:478b090b7e1b 25 struct JoyStick {
MBirney 3:478b090b7e1b 26 float x; // current x value
MBirney 3:478b090b7e1b 27 float x0; // 'centred' x value
MBirney 3:478b090b7e1b 28 float y; // current y value
MBirney 3:478b090b7e1b 29 float y0; // 'centred' y value
MBirney 3:478b090b7e1b 30 int button; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
MBirney 3:478b090b7e1b 31 DirectionName direction; // current direction
MBirney 3:478b090b7e1b 32 };
MBirney 3:478b090b7e1b 33 // create struct variable
MBirney 3:478b090b7e1b 34 Joystick joystick;
MBirney 3:478b090b7e1b 35
MBirney 4:551dea241d0a 36 DirectionName previousDirection =RIGHT;
MBirney 3:478b090b7e1b 37
MBirney 3:478b090b7e1b 38 // read default positions of the joystick to calibrate later readings
MBirney 3:478b090b7e1b 39 void calibrateJoystick()
MBirney 3:478b090b7e1b 40 {
MBirney 3:478b090b7e1b 41 button.mode(PullDown);
MBirney 3:478b090b7e1b 42 // must not move during calibration
MBirney 3:478b090b7e1b 43 joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
MBirney 3:478b090b7e1b 44 joystick.y0 = yPot;
MBirney 3:478b090b7e1b 45 }
MBirney 3:478b090b7e1b 46 void updateJoystick()
MBirney 3:478b090b7e1b 47 {
MBirney 3:478b090b7e1b 48 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
MBirney 3:478b090b7e1b 49 joystick.x = xPot - joystick.x0;
MBirney 3:478b090b7e1b 50 joystick.y = yPot - joystick.y0;
MBirney 3:478b090b7e1b 51 // read button state
MBirney 3:478b090b7e1b 52 joystick.button = button;
MBirney 3:478b090b7e1b 53
MBirney 3:478b090b7e1b 54 // calculate direction depending on x,y values
MBirney 3:478b090b7e1b 55 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
MBirney 3:478b090b7e1b 56 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
MBirney 3:478b090b7e1b 57 joystick.direction = CENTRE;
MBirney 3:478b090b7e1b 58 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
MBirney 6:1de103a19681 59 joystick.direction = DOWN;
MBirney 3:478b090b7e1b 60 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
MBirney 6:1de103a19681 61 joystick.direction = UP;
MBirney 3:478b090b7e1b 62 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
MBirney 6:1de103a19681 63 joystick.direction = RIGHT; // remember switched this with right
MBirney 3:478b090b7e1b 64 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
MBirney 6:1de103a19681 65 joystick.direction = LEFT;
MBirney 3:478b090b7e1b 66 } else {
MBirney 3:478b090b7e1b 67 joystick.direction = UNKNOWN;
MBirney 3:478b090b7e1b 68 }
MBirney 3:478b090b7e1b 69 }
eencae 0:b85460bc73b9 70
MBirney 6:1de103a19681 71 //GAME FUNCTIONS
MBirney 4:551dea241d0a 72
MBirney 6:1de103a19681 73 //For start MENU
MBirney 4:551dea241d0a 74
MBirney 2:deb61a34ac31 75 void displaySplash()
MBirney 2:deb61a34ac31 76 {
MBirney 2:deb61a34ac31 77 // these are default settings so not strictly needed
MBirney 2:deb61a34ac31 78 lcd.inverseMode(); // normal colour mode
MBirney 2:deb61a34ac31 79 lcd.setBrightness(0.5); // put LED backlight on 50%
MBirney 2:deb61a34ac31 80
MBirney 2:deb61a34ac31 81 //Draw S
MBirney 2:deb61a34ac31 82 lcd.drawRect(28,10,2,5,1);
MBirney 2:deb61a34ac31 83 lcd.drawRect(15,10,15,2,1);
MBirney 2:deb61a34ac31 84 lcd.drawRect(15,10,2,10,1);
MBirney 2:deb61a34ac31 85 lcd.drawRect(15,20,15,2,1);
MBirney 2:deb61a34ac31 86 lcd.drawRect(28,20,2,10,1);
MBirney 2:deb61a34ac31 87 lcd.drawRect(15,28,15,2,1);
MBirney 2:deb61a34ac31 88 lcd.drawRect(15,25,2,3,1);
MBirney 2:deb61a34ac31 89
MBirney 2:deb61a34ac31 90 lcd.printString("NAKE ",34,3);
MBirney 2:deb61a34ac31 91 lcd.printString("By M.Birney",10,5);
MBirney 2:deb61a34ac31 92 lcd.drawRect(10,5,65,30,0);
MBirney 2:deb61a34ac31 93
MBirney 2:deb61a34ac31 94 // need to refresh display after setting pixels
MBirney 2:deb61a34ac31 95
MBirney 2:deb61a34ac31 96 lcd.refresh();
eencae 0:b85460bc73b9 97 }
eencae 0:b85460bc73b9 98
eencae 0:b85460bc73b9 99
MBirney 2:deb61a34ac31 100
MBirney 2:deb61a34ac31 101 void easySelected() // display when easy is selected
MBirney 2:deb61a34ac31 102 {
MBirney 3:478b090b7e1b 103 currentDifficulty=EASY;
MBirney 2:deb61a34ac31 104 lcd.clear();
MBirney 2:deb61a34ac31 105 lcd.printString("Please Select",2,0);
MBirney 2:deb61a34ac31 106 lcd.printString("Difficulty:",2,1);
MBirney 2:deb61a34ac31 107 lcd.printString("Easy",20,3);
MBirney 2:deb61a34ac31 108 lcd.printString("Medium",20,4);
MBirney 2:deb61a34ac31 109 lcd.printString("Hard",20,5);
MBirney 2:deb61a34ac31 110 lcd.refresh();
MBirney 2:deb61a34ac31 111 lcd.drawCircle(10,27,2,1);
MBirney 2:deb61a34ac31 112 lcd.drawCircle(10,35,2,0);
MBirney 2:deb61a34ac31 113 lcd.drawCircle(10,43,2,0);
MBirney 2:deb61a34ac31 114
MBirney 6:1de103a19681 115 gameSpeed= 0.5;
MBirney 2:deb61a34ac31 116 }
MBirney 2:deb61a34ac31 117 void mediumSelected() // display when medium is selected
MBirney 2:deb61a34ac31 118 {
MBirney 3:478b090b7e1b 119 currentDifficulty=MEDIUM;
MBirney 2:deb61a34ac31 120 lcd.clear();
MBirney 2:deb61a34ac31 121 lcd.printString("Please Select",2,0);
MBirney 2:deb61a34ac31 122 lcd.printString("Difficulty:",2,1);
MBirney 2:deb61a34ac31 123 lcd.printString("Easy",20,3);
MBirney 2:deb61a34ac31 124 lcd.printString("Medium",20,4);
MBirney 2:deb61a34ac31 125 lcd.printString("Hard",20,5);
MBirney 2:deb61a34ac31 126 lcd.refresh();
MBirney 2:deb61a34ac31 127 lcd.drawCircle(10,27,2,0);
MBirney 2:deb61a34ac31 128 lcd.drawCircle(10,35,2,1);
MBirney 2:deb61a34ac31 129 lcd.drawCircle(10,43,2,0);
MBirney 6:1de103a19681 130 gameSpeed=0.5;
MBirney 2:deb61a34ac31 131 }
MBirney 2:deb61a34ac31 132
MBirney 2:deb61a34ac31 133 void hardSelected() // display when hard is selected
MBirney 2:deb61a34ac31 134 {
MBirney 3:478b090b7e1b 135 currentDifficulty=HARD;
MBirney 2:deb61a34ac31 136 lcd.clear();
MBirney 2:deb61a34ac31 137 lcd.printString("Please Select",2,0);
MBirney 2:deb61a34ac31 138 lcd.printString("Difficulty:",2,1);
MBirney 2:deb61a34ac31 139 lcd.printString("Easy",20,3);
MBirney 2:deb61a34ac31 140 lcd.printString("Medium",20,4);
MBirney 2:deb61a34ac31 141 lcd.printString("Hard",20,5);
MBirney 2:deb61a34ac31 142 lcd.refresh();
MBirney 2:deb61a34ac31 143 lcd.drawCircle(10,27,2,0);
MBirney 2:deb61a34ac31 144 lcd.drawCircle(10,35,2,0);
MBirney 2:deb61a34ac31 145 lcd.drawCircle(10,43,2,1);
MBirney 6:1de103a19681 146 gameSpeed=1.0/32;
MBirney 4:551dea241d0a 147 }
MBirney 4:551dea241d0a 148
MBirney 6:1de103a19681 149 void checkSelectedDifficulty()
MBirney 6:1de103a19681 150 {
MBirney 4:551dea241d0a 151
MBirney 4:551dea241d0a 152 switch(currentDifficulty) {
MBirney 4:551dea241d0a 153 case EASY:
MBirney 4:551dea241d0a 154
MBirney 4:551dea241d0a 155 switch (joystick.direction) {
MBirney 4:551dea241d0a 156
MBirney 4:551dea241d0a 157 case UP:
MBirney 4:551dea241d0a 158 hardSelected();
MBirney 4:551dea241d0a 159 break;
MBirney 4:551dea241d0a 160
MBirney 4:551dea241d0a 161
MBirney 4:551dea241d0a 162 case DOWN:
MBirney 4:551dea241d0a 163 mediumSelected();
MBirney 4:551dea241d0a 164 break;
MBirney 4:551dea241d0a 165 }
MBirney 4:551dea241d0a 166 break;
MBirney 2:deb61a34ac31 167
MBirney 2:deb61a34ac31 168
MBirney 4:551dea241d0a 169 case MEDIUM:
MBirney 4:551dea241d0a 170
MBirney 4:551dea241d0a 171 switch (joystick.direction) {
MBirney 4:551dea241d0a 172
MBirney 4:551dea241d0a 173 case UP:
MBirney 4:551dea241d0a 174 easySelected();
MBirney 4:551dea241d0a 175 break;
MBirney 4:551dea241d0a 176
MBirney 4:551dea241d0a 177
MBirney 4:551dea241d0a 178 case DOWN:
MBirney 4:551dea241d0a 179 hardSelected();
MBirney 4:551dea241d0a 180 break;
MBirney 4:551dea241d0a 181 }
MBirney 4:551dea241d0a 182
MBirney 4:551dea241d0a 183
MBirney 4:551dea241d0a 184
MBirney 4:551dea241d0a 185 break;
MBirney 4:551dea241d0a 186 case HARD:
MBirney 4:551dea241d0a 187 switch (joystick.direction) {
MBirney 4:551dea241d0a 188
MBirney 4:551dea241d0a 189 case UP:
MBirney 4:551dea241d0a 190 mediumSelected();
MBirney 4:551dea241d0a 191 break;
MBirney 4:551dea241d0a 192
MBirney 4:551dea241d0a 193
MBirney 4:551dea241d0a 194 case DOWN:
MBirney 4:551dea241d0a 195 easySelected();
MBirney 4:551dea241d0a 196 break;
MBirney 4:551dea241d0a 197 }
MBirney 4:551dea241d0a 198 break;
MBirney 4:551dea241d0a 199 }
MBirney 4:551dea241d0a 200 wait(0.2);
MBirney 4:551dea241d0a 201 }
MBirney 4:551dea241d0a 202
MBirney 6:1de103a19681 203
MBirney 6:1de103a19681 204
MBirney 6:1de103a19681 205
MBirney 6:1de103a19681 206 //for gamePLAY
MBirney 6:1de103a19681 207
MBirney 6:1de103a19681 208
MBirney 6:1de103a19681 209
MBirney 6:1de103a19681 210 void startingSnake()
MBirney 6:1de103a19681 211 {
MBirney 6:1de103a19681 212 snakeX[0]=20;
MBirney 6:1de103a19681 213 snakeX[1]=22;
MBirney 6:1de103a19681 214 snakeX[2]=24;
MBirney 6:1de103a19681 215 snakeX[3]=26;
MBirney 6:1de103a19681 216 snakeX[4]=28;
MBirney 6:1de103a19681 217
MBirney 6:1de103a19681 218 for (int i=0; i<5; i++) {
MBirney 6:1de103a19681 219 // lcd.setPixel(snakeX[i],snakeY[i]);
MBirney 6:1de103a19681 220 lcd.drawRect(snakeX[i],snakeY[i],1,1,1);
MBirney 4:551dea241d0a 221 }
MBirney 5:1bfc306466db 222
MBirney 6:1de103a19681 223
MBirney 6:1de103a19681 224 wait(5);
MBirney 6:1de103a19681 225 }
MBirney 6:1de103a19681 226
MBirney 6:1de103a19681 227
MBirney 6:1de103a19681 228 void randomiseFood()
MBirney 6:1de103a19681 229 {
MBirney 6:1de103a19681 230
MBirney 6:1de103a19681 231 srand(time(NULL));
MBirney 6:1de103a19681 232
MBirney 6:1de103a19681 233 int randomX = rand() % (83-1)+1; // generate random number between 1 and 82 // spaces within boundar
MBirney 6:1de103a19681 234
MBirney 6:1de103a19681 235 int randomY = rand() %(46-9)+9;// generate random number betwwen 9 and 46
MBirney 6:1de103a19681 236
MBirney 6:1de103a19681 237 // int r = rand() % (21 - 10) + 10 // 10 -21 inclusive
MBirney 6:1de103a19681 238
MBirney 6:1de103a19681 239 while(lcd.getPixel(randomX,randomY)==1) { // if that pixel is already filled
MBirney 6:1de103a19681 240
MBirney 6:1de103a19681 241 int randomX = rand() % (83-1)+1; // generate random number between 1 and 82 // spaces within boundar
MBirney 6:1de103a19681 242
MBirney 6:1de103a19681 243 int randomY = rand() %(46-9)+9;
MBirney 6:1de103a19681 244
MBirney 6:1de103a19681 245
MBirney 6:1de103a19681 246 }
MBirney 6:1de103a19681 247 // lcd.setPixel(randomX,randomY) ;// set the food
MBirney 6:1de103a19681 248 lcd.drawRect(randomX,randomY,1,1,1);
MBirney 6:1de103a19681 249 food[0]=randomX; // update food position
MBirney 6:1de103a19681 250 food[1]=randomY;// update food position
MBirney 6:1de103a19681 251 lcd.refresh();
MBirney 6:1de103a19681 252
MBirney 6:1de103a19681 253 }
MBirney 6:1de103a19681 254
MBirney 6:1de103a19681 255 void Boundary()
MBirney 6:1de103a19681 256 {
MBirney 6:1de103a19681 257
MBirney 6:1de103a19681 258
MBirney 6:1de103a19681 259 for(int x = 0; x< 84; x++) {
MBirney 6:1de103a19681 260 lcd.setPixel(x,8);
MBirney 6:1de103a19681 261 }
MBirney 6:1de103a19681 262 for(int x = 0; x< 84; x++) {
MBirney 6:1de103a19681 263 lcd.setPixel(x,47);
MBirney 6:1de103a19681 264 }
MBirney 6:1de103a19681 265 for(int y = 8; y< 48; y++) {
MBirney 6:1de103a19681 266 lcd.setPixel(0,y);
MBirney 6:1de103a19681 267 }
MBirney 6:1de103a19681 268 for(int y = 8; y< 48; y++) {
MBirney 6:1de103a19681 269 lcd.setPixel(83,y);
MBirney 6:1de103a19681 270 }
MBirney 6:1de103a19681 271
MBirney 6:1de103a19681 272 lcd.refresh();
MBirney 6:1de103a19681 273
MBirney 6:1de103a19681 274 }
MBirney 6:1de103a19681 275
MBirney 6:1de103a19681 276
MBirney 6:1de103a19681 277
MBirney 6:1de103a19681 278
MBirney 6:1de103a19681 279
MBirney 6:1de103a19681 280 void updateSnakeArray()
MBirney 6:1de103a19681 281 {
MBirney 6:1de103a19681 282
MBirney 6:1de103a19681 283 if (joystick.direction==LEFT && previousDirection==RIGHT) {
MBirney 6:1de103a19681 284 joystick.direction=RIGHT;
MBirney 6:1de103a19681 285 }
MBirney 6:1de103a19681 286
MBirney 6:1de103a19681 287 if (joystick.direction==RIGHT && previousDirection==LEFT) {
MBirney 6:1de103a19681 288 joystick.direction=LEFT;
MBirney 6:1de103a19681 289 }
MBirney 6:1de103a19681 290
MBirney 6:1de103a19681 291 if (joystick.direction==UP && previousDirection==DOWN) {
MBirney 6:1de103a19681 292 joystick.direction=DOWN;
MBirney 6:1de103a19681 293 }
MBirney 6:1de103a19681 294
MBirney 6:1de103a19681 295 if (joystick.direction==DOWN && previousDirection==UP) {
MBirney 6:1de103a19681 296 joystick.direction=UP;
MBirney 6:1de103a19681 297 }
MBirney 6:1de103a19681 298
MBirney 6:1de103a19681 299 if (joystick.direction==UNKNOWN || joystick.direction==CENTRE) {
MBirney 6:1de103a19681 300 joystick.direction= previousDirection;
MBirney 6:1de103a19681 301 }
MBirney 6:1de103a19681 302
MBirney 6:1de103a19681 303
MBirney 6:1de103a19681 304 // lcd.clearPixel(snakeX[0],snakeY[0]);//delete tail
MBirney 6:1de103a19681 305 lcd.drawRect(snakeX[0],snakeY[0],1,1,2);
MBirney 6:1de103a19681 306
MBirney 6:1de103a19681 307 for (int i =0; i<snakeX.size(); i++) { // shift elements
MBirney 6:1de103a19681 308 snakeX[i]=snakeX[i + 1]; // apart from head
MBirney 6:1de103a19681 309 snakeY[i]=snakeY[i+ 1];
MBirney 6:1de103a19681 310 }
MBirney 6:1de103a19681 311
MBirney 6:1de103a19681 312 switch(joystick.direction) {
MBirney 6:1de103a19681 313
MBirney 6:1de103a19681 314 case UP:
MBirney 6:1de103a19681 315 snakeX[snakeX.size()-1]=snakeX[snakeX.size()-2];
MBirney 6:1de103a19681 316 snakeY[snakeY.size()-1]=snakeY[snakeY.size()-2]-2;
MBirney 6:1de103a19681 317 break;
MBirney 6:1de103a19681 318
MBirney 6:1de103a19681 319 case DOWN:
MBirney 6:1de103a19681 320 snakeX[snakeX.size()-1]=snakeX[snakeX.size()-2];
MBirney 6:1de103a19681 321 snakeY[snakeY.size()-1]=snakeY[snakeY.size()-2]+2;
MBirney 6:1de103a19681 322 break;
MBirney 6:1de103a19681 323
MBirney 6:1de103a19681 324 case LEFT:
MBirney 6:1de103a19681 325 snakeX[snakeX.size()-1]=snakeX[snakeX.size()-2]-2;
MBirney 6:1de103a19681 326 snakeY[snakeY.size()-1]=snakeY[snakeY.size()-2];
MBirney 6:1de103a19681 327 break;
MBirney 6:1de103a19681 328
MBirney 6:1de103a19681 329 case RIGHT:
MBirney 6:1de103a19681 330 snakeX[snakeX.size()-1]=snakeX[snakeX.size()-2]+2;
MBirney 6:1de103a19681 331 snakeY[snakeY.size()-1]=snakeY[snakeY.size()-2];
MBirney 6:1de103a19681 332 break;
MBirney 6:1de103a19681 333
MBirney 6:1de103a19681 334 case CENTRE:
MBirney 6:1de103a19681 335 snakeX[snakeX.size()-1]=snakeX[snakeX.size()-2]+2;
MBirney 6:1de103a19681 336 snakeY[snakeY.size()-1]=snakeY[snakeY.size()-2];
MBirney 6:1de103a19681 337 break;
MBirney 6:1de103a19681 338 case UNKNOWN:
MBirney 6:1de103a19681 339 snakeX[snakeX.size()-1]=snakeX[snakeX.size()-2]+2;
MBirney 6:1de103a19681 340 snakeY[snakeY.size()-1]=snakeY[snakeY.size()-2];
MBirney 6:1de103a19681 341 break;
MBirney 6:1de103a19681 342
MBirney 6:1de103a19681 343 }
MBirney 6:1de103a19681 344 }
MBirney 6:1de103a19681 345
MBirney 6:1de103a19681 346 void gameOver()
MBirney 6:1de103a19681 347 {
MBirney 6:1de103a19681 348 startGame.detach();
MBirney 6:1de103a19681 349 lcd.clearPixel(snakeX.back(),snakeY.back());
MBirney 6:1de103a19681 350 wait(0.2);
MBirney 6:1de103a19681 351 lcd.refresh();
MBirney 6:1de103a19681 352 lcd.setPixel(snakeX.back(),snakeY.back());
MBirney 6:1de103a19681 353 wait(0.3);
MBirney 6:1de103a19681 354 lcd.refresh();
MBirney 6:1de103a19681 355 lcd.clearPixel(snakeX.back(),snakeY.back());
MBirney 6:1de103a19681 356 wait(0.2);
MBirney 6:1de103a19681 357 lcd.refresh();
MBirney 6:1de103a19681 358 lcd.setPixel(snakeX.back(),snakeY.back());
MBirney 6:1de103a19681 359 wait(0.2);
MBirney 6:1de103a19681 360 lcd.refresh();
MBirney 6:1de103a19681 361 lcd.clear();
MBirney 6:1de103a19681 362 lcd.inverseMode();
MBirney 6:1de103a19681 363
MBirney 6:1de103a19681 364
MBirney 6:1de103a19681 365 lcd.printString("Your Score" ,12,0);
MBirney 6:1de103a19681 366 lcd.printString("=" ,34,1);
MBirney 6:1de103a19681 367
MBirney 6:1de103a19681 368 int updatedScore=score;
MBirney 6:1de103a19681 369 int length = sprintf(buffer,"%2d",updatedScore);
MBirney 6:1de103a19681 370
MBirney 6:1de103a19681 371 if (length <= 14) // if string will fit on display
MBirney 6:1de103a19681 372 lcd.printString(buffer,40,1);
MBirney 6:1de103a19681 373
MBirney 6:1de103a19681 374 lcd.printString("Press Reset" ,2,3);
MBirney 6:1de103a19681 375 lcd.printString("Button To" ,10,4);
MBirney 6:1de103a19681 376 lcd.printString("Play Again" ,20,5);
MBirney 6:1de103a19681 377 //
MBirney 6:1de103a19681 378 lcd.refresh();
MBirney 6:1de103a19681 379 gamePlaying=0;
MBirney 5:1bfc306466db 380
MBirney 5:1bfc306466db 381
MBirney 6:1de103a19681 382
MBirney 6:1de103a19681 383 }
MBirney 6:1de103a19681 384
MBirney 6:1de103a19681 385 void checkForCollision()
MBirney 6:1de103a19681 386 {
MBirney 6:1de103a19681 387
MBirney 6:1de103a19681 388 if (snakeX.back()<=0 || snakeX.back()>=82 || snakeY.back()<=8 ||snakeY.back()>=47) {
MBirney 6:1de103a19681 389
MBirney 6:1de103a19681 390 gameOver();
MBirney 6:1de103a19681 391 }
MBirney 6:1de103a19681 392 }
MBirney 6:1de103a19681 393
MBirney 6:1de103a19681 394
MBirney 6:1de103a19681 395
MBirney 6:1de103a19681 396 void checkForFood()
MBirney 6:1de103a19681 397 {
MBirney 6:1de103a19681 398
MBirney 6:1de103a19681 399 if (snakeX.back()+1==food[0] && snakeY.back()==food[1]) { // if x and y of head match food
MBirney 6:1de103a19681 400
MBirney 6:1de103a19681 401
MBirney 6:1de103a19681 402 switch(joystick.direction) {
MBirney 6:1de103a19681 403
MBirney 6:1de103a19681 404 case RIGHT:
MBirney 6:1de103a19681 405 snakeX.push_back(food[0]+2);
MBirney 6:1de103a19681 406 snakeY.push_back(food[1]);
MBirney 6:1de103a19681 407 break;
MBirney 6:1de103a19681 408 case LEFT:
MBirney 6:1de103a19681 409
MBirney 6:1de103a19681 410 snakeX.push_back(food[0]-2);
MBirney 6:1de103a19681 411 snakeY.push_back(food[1]);
MBirney 6:1de103a19681 412 break;
MBirney 6:1de103a19681 413
MBirney 6:1de103a19681 414
MBirney 6:1de103a19681 415 case UP:
MBirney 6:1de103a19681 416 snakeX.push_back(food[0]);
MBirney 6:1de103a19681 417 snakeY.push_back(food[1]-2);
MBirney 6:1de103a19681 418 break;
MBirney 6:1de103a19681 419
MBirney 6:1de103a19681 420 case DOWN:
MBirney 6:1de103a19681 421 snakeX.push_back(food[0]);
MBirney 6:1de103a19681 422 snakeY.push_back(food[1]+2);
MBirney 6:1de103a19681 423 break;
MBirney 6:1de103a19681 424 }
MBirney 6:1de103a19681 425
MBirney 6:1de103a19681 426 int updatedScore;
MBirney 6:1de103a19681 427 // snakeX.insert (snakeX.begin() + 0, );
MBirney 6:1de103a19681 428 //snakeY.insert (snakeY.begin() + 0, );
MBirney 6:1de103a19681 429
MBirney 6:1de103a19681 430 updatedScore= score+5;
MBirney 6:1de103a19681 431 score=updatedScore;
MBirney 6:1de103a19681 432 int length = sprintf(buffer,"%2d",updatedScore);
MBirney 6:1de103a19681 433
MBirney 6:1de103a19681 434 if (length <= 14) // if string will fit on display
MBirney 6:1de103a19681 435 lcd.printString(buffer,0,0);
MBirney 6:1de103a19681 436 // lcd.refresh();
MBirney 6:1de103a19681 437
MBirney 6:1de103a19681 438 randomiseFood();
MBirney 6:1de103a19681 439
MBirney 5:1bfc306466db 440 }
MBirney 2:deb61a34ac31 441
MBirney 6:1de103a19681 442
MBirney 6:1de103a19681 443 }
MBirney 6:1de103a19681 444
MBirney 6:1de103a19681 445 void startButtonPressed()
MBirney 6:1de103a19681 446 {
MBirney 6:1de103a19681 447 gamePlaying=1;
MBirney 6:1de103a19681 448 // myleds=15;
MBirney 6:1de103a19681 449 }
MBirney 6:1de103a19681 450
MBirney 6:1de103a19681 451
MBirney 6:1de103a19681 452
MBirney 6:1de103a19681 453
MBirney 6:1de103a19681 454 void updateGameISR()
MBirney 6:1de103a19681 455 {
MBirney 6:1de103a19681 456 updateGameFlag=1;
MBirney 6:1de103a19681 457 }
MBirney 6:1de103a19681 458
MBirney 6:1de103a19681 459 void printVectorContent()
MBirney 6:1de103a19681 460 {
MBirney 6:1de103a19681 461
MBirney 6:1de103a19681 462 for( int i=0; i<snakeX.size(); i++)
MBirney 6:1de103a19681 463 serial.printf( "%d \n \r" ,snakeX[i]);
MBirney 6:1de103a19681 464
MBirney 6:1de103a19681 465 }
MBirney 6:1de103a19681 466
MBirney 6:1de103a19681 467
MBirney 6:1de103a19681 468
MBirney 6:1de103a19681 469 void pauseButtonPressed()
MBirney 6:1de103a19681 470 {
MBirney 6:1de103a19681 471
MBirney 6:1de103a19681 472 if (gamePaused==0) {
MBirney 6:1de103a19681 473
MBirney 6:1de103a19681 474 startGame.detach();
MBirney 6:1de103a19681 475
MBirney 6:1de103a19681 476 gamePaused=1;
MBirney 6:1de103a19681 477 }
MBirney 6:1de103a19681 478
MBirney 6:1de103a19681 479 else {
MBirney 6:1de103a19681 480
MBirney 6:1de103a19681 481
MBirney 6:1de103a19681 482 startGame.attach(&updateGameISR,gameSpeed);
MBirney 6:1de103a19681 483
MBirney 6:1de103a19681 484 gamePaused=0;
MBirney 6:1de103a19681 485 }
MBirney 6:1de103a19681 486
MBirney 6:1de103a19681 487
MBirney 6:1de103a19681 488
MBirney 6:1de103a19681 489 }
MBirney 6:1de103a19681 490
MBirney 6:1de103a19681 491 void checkForCollisionWithSelf(int i)
MBirney 6:1de103a19681 492 {
MBirney 6:1de103a19681 493
MBirney 6:1de103a19681 494 if(snakeX.back()==snakeX[i] && snakeY.back()==snakeY[i]) {
MBirney 6:1de103a19681 495
MBirney 6:1de103a19681 496
MBirney 6:1de103a19681 497 gameOver();
MBirney 6:1de103a19681 498
MBirney 6:1de103a19681 499
MBirney 6:1de103a19681 500 }
MBirney 6:1de103a19681 501
MBirney 6:1de103a19681 502
MBirney 6:1de103a19681 503 }
MBirney 6:1de103a19681 504 void startUpMenu()
MBirney 2:deb61a34ac31 505 {
MBirney 3:478b090b7e1b 506
MBirney 2:deb61a34ac31 507 // first need to initialise display
MBirney 4:551dea241d0a 508
MBirney 2:deb61a34ac31 509 displaySplash();
MBirney 4:551dea241d0a 510 wait(4);
MBirney 2:deb61a34ac31 511 easySelected();
MBirney 3:478b090b7e1b 512 joystick.direction=UNKNOWN;
MBirney 3:478b090b7e1b 513 calibrateJoystick(); // get centred values of joystick
MBirney 6:1de103a19681 514 pollJoystick.attach(&updateJoystick,1.0/5.0);
MBirney 4:551dea241d0a 515 startGame.attach(&updateGameISR,gameSpeed); // read joystick 10 times per second
MBirney 6:1de103a19681 516
MBirney 6:1de103a19681 517
MBirney 6:1de103a19681 518
MBirney 6:1de103a19681 519 }
MBirney 6:1de103a19681 520
MBirney 6:1de103a19681 521 void resetButtonPressed()
MBirney 6:1de103a19681 522 {
MBirney 6:1de103a19681 523 // myleds=0;
MBirney 6:1de103a19681 524 easySelected();
MBirney 6:1de103a19681 525 pollJoystick.attach(&updateJoystick,1.0/5.0);
MBirney 6:1de103a19681 526 }
MBirney 6:1de103a19681 527
MBirney 6:1de103a19681 528
MBirney 6:1de103a19681 529 int main()
MBirney 6:1de103a19681 530 {
MBirney 6:1de103a19681 531 lcd.init();
MBirney 6:1de103a19681 532 startUpMenu();
MBirney 6:1de103a19681 533 resetButton.mode(PullDown);
MBirney 6:1de103a19681 534 startButton.mode(PullDown);
MBirney 6:1de103a19681 535 button.mode(PullDown);
MBirney 4:551dea241d0a 536 startButton.rise(&startButtonPressed);
MBirney 4:551dea241d0a 537 resetButton.rise(&resetButtonPressed);
MBirney 6:1de103a19681 538 button.rise(&pauseButtonPressed);
MBirney 6:1de103a19681 539 serial.printf("starting");
MBirney 4:551dea241d0a 540 while(1) {
MBirney 6:1de103a19681 541 if (gamePlaying==0) {
MBirney 6:1de103a19681 542 checkSelectedDifficulty();
MBirney 6:1de103a19681 543 serial.printf("check difficulty loop");
MBirney 6:1de103a19681 544 }
MBirney 6:1de103a19681 545
MBirney 6:1de103a19681 546 else if (gamePlaying==1) {
MBirney 6:1de103a19681 547 lcd.clear();
MBirney 6:1de103a19681 548 lcd.normalMode(); // normal colour mode
MBirney 6:1de103a19681 549 Boundary();
MBirney 6:1de103a19681 550
MBirney 6:1de103a19681 551 pollJoystick.detach();
MBirney 6:1de103a19681 552 startGame.attach(&updateGameISR,gameSpeed);
MBirney 6:1de103a19681 553 startingSnake();
MBirney 6:1de103a19681 554 randomiseFood();
MBirney 6:1de103a19681 555 if (length <= 14) // if string will fit on display
MBirney 6:1de103a19681 556 lcd.printString(buffer,0,0);
MBirney 6:1de103a19681 557 // lcd.drawRect(0,0,83,7,0);
MBirney 6:1de103a19681 558 lcd.refresh();
MBirney 6:1de103a19681 559 serial.printf("gameplaying=1 game init");
MBirney 6:1de103a19681 560
MBirney 6:1de103a19681 561 //init game start time back food
MBirney 6:1de103a19681 562 while (1) {
MBirney 6:1de103a19681 563 serial.printf("enter game loop");
MBirney 6:1de103a19681 564 if(updateGameFlag==1) {
MBirney 6:1de103a19681 565 //updateJoystick();
MBirney 6:1de103a19681 566 updateGameFlag=0;
MBirney 6:1de103a19681 567 updateJoystick();
MBirney 6:1de103a19681 568 // lcd.clearPixel(snakeX[0],snakeY[0]);
MBirney 6:1de103a19681 569 // updateSnakeDirection();
MBirney 6:1de103a19681 570 updateSnakeArray();
MBirney 6:1de103a19681 571 for (int i=0; i<snakeX.size(); i++) {
MBirney 6:1de103a19681 572 lcd.drawRect(snakeX[i],snakeY[i],1,1,1);
MBirney 6:1de103a19681 573 // lcd.setPixel(snakeX[i],snakeY[i]);
MBirney 6:1de103a19681 574
MBirney 6:1de103a19681 575
MBirney 6:1de103a19681 576 }
MBirney 6:1de103a19681 577 lcd.refresh();
MBirney 6:1de103a19681 578 previousDirection=joystick.direction;
MBirney 6:1de103a19681 579
MBirney 6:1de103a19681 580 checkForFood();
MBirney 6:1de103a19681 581 checkForCollision();
MBirney 6:1de103a19681 582
MBirney 6:1de103a19681 583 for (int i=0; i<snakeX.size()-1; i++) {
MBirney 6:1de103a19681 584 checkForCollisionWithSelf(i);
MBirney 6:1de103a19681 585 }
MBirney 6:1de103a19681 586
MBirney 6:1de103a19681 587
MBirney 6:1de103a19681 588 //serial.printf("%d",snakeX.size());
MBirney 6:1de103a19681 589 // printVectorContent();
MBirney 6:1de103a19681 590
MBirney 6:1de103a19681 591 }
MBirney 6:1de103a19681 592
MBirney 6:1de103a19681 593 }
MBirney 6:1de103a19681 594
MBirney 6:1de103a19681 595 }
MBirney 3:478b090b7e1b 596 }
MBirney 6:1de103a19681 597
MBirney 6:1de103a19681 598
MBirney 2:deb61a34ac31 599
eencae 0:b85460bc73b9 600 }