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