Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: N5110 PinDetect PowerControl mbed
main.cpp@5:6dd0bec55e52, 2015-05-03 (annotated)
- 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?
| User | Revision | Line number | New 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 |