
Completed Snake Program
Dependencies: N5110 PinDetect PowerControl mbed
Fork of DocTest by
main.cpp@6:1de103a19681, 2015-04-27 (annotated)
- 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?
User | Revision | Line number | New 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 | } |