Completed Snake Program

Dependencies:   N5110 PinDetect PowerControl mbed

Fork of DocTest by Craig Evans

Committer:
MBirney
Date:
Wed Apr 15 16:34:05 2015 +0000
Revision:
5:1bfc306466db
Parent:
4:551dea241d0a
Child:
6:1de103a19681
Snake eats food !

Who changed what in which revision?

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