Completed Snake Program

Dependencies:   N5110 PinDetect PowerControl mbed

Fork of DocTest by Craig Evans

Committer:
MBirney
Date:
Thu Apr 09 13:10:14 2015 +0000
Revision:
3:478b090b7e1b
Parent:
2:deb61a34ac31
Child:
4:551dea241d0a
Start Menu working (easy medium hard selectable) need to include start button to enter gameplay

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MBirney 2:deb61a34ac31 1 #include "mbed.h"
MBirney 2:deb61a34ac31 2 #include "N5110.h"
MBirney 2:deb61a34ac31 3
MBirney 3:478b090b7e1b 4 #include "PinDetect.h"
MBirney 3:478b090b7e1b 5
MBirney 3:478b090b7e1b 6 // change this to alter tolerance of joystick direction
MBirney 3:478b090b7e1b 7 #define DIRECTION_TOLERANCE 0.2
MBirney 2:deb61a34ac31 8 // VCC,SCE,RST,D/C,MOSI,SCLK,LED
MBirney 2:deb61a34ac31 9 N5110 lcd(p7,p8,p9,p10,p11,p13,p21);
MBirney 3:478b090b7e1b 10 DigitalOut led2(LED2);
MBirney 3:478b090b7e1b 11 InterruptIn pb(p16);
MBirney 3:478b090b7e1b 12 // connections for joystick
MBirney 3:478b090b7e1b 13 DigitalIn button(p18);
MBirney 3:478b090b7e1b 14 AnalogIn xPot(p19);
MBirney 3:478b090b7e1b 15 AnalogIn yPot(p20);
MBirney 3:478b090b7e1b 16
MBirney 3:478b090b7e1b 17 bool gamePlaying =0;
MBirney 3:478b090b7e1b 18
MBirney 3:478b090b7e1b 19 // timer to regularly read the joystick
MBirney 3:478b090b7e1b 20 Ticker pollJoystick;
MBirney 3:478b090b7e1b 21 /*pin.mode( PullDown );
MBirney 3:478b090b7e1b 22 pin.attach_asserted( &keyPressed );
MBirney 3:478b090b7e1b 23 pin.attach_deasserted( &keyReleased );
MBirney 3:478b090b7e1b 24 pin.attach_asserted_held( &keyPressedHeld );
MBirney 3:478b090b7e1b 25 pin.attach_deasserted_held( &keyReleasedHeld );
MBirney 3:478b090b7e1b 26 pin.setSampleFrequency();*/
MBirney 3:478b090b7e1b 27
eencae 0:b85460bc73b9 28
MBirney 3:478b090b7e1b 29 /*
MBirney 3:478b090b7e1b 30 void keyPressed( void ) {
MBirney 3:478b090b7e1b 31 joystick.direction =DOWN;
MBirney 3:478b090b7e1b 32 led2 = 1;
MBirney 3:478b090b7e1b 33 }
MBirney 3:478b090b7e1b 34
MBirney 3:478b090b7e1b 35 void keyReleased( void ) {
MBirney 3:478b090b7e1b 36 joystick.direction =UNKNOWN;
MBirney 3:478b090b7e1b 37 led2 = 0;
MBirney 3:478b090b7e1b 38 }
MBirney 3:478b090b7e1b 39
MBirney 3:478b090b7e1b 40 void keyPressedHeld( void ) {
MBirney 3:478b090b7e1b 41 led2 = 1;
MBirney 3:478b090b7e1b 42 }
MBirney 3:478b090b7e1b 43
MBirney 3:478b090b7e1b 44 void keyReleasedHeld( void) {
MBirney 3:478b090b7e1b 45 }*/
MBirney 3:478b090b7e1b 46
MBirney 3:478b090b7e1b 47
MBirney 2:deb61a34ac31 48 enum Difficulty {
MBirney 2:deb61a34ac31 49 EASY,
MBirney 2:deb61a34ac31 50 MEDIUM,
MBirney 2:deb61a34ac31 51 HARD,
MBirney 2:deb61a34ac31 52 };
MBirney 3:478b090b7e1b 53
MBirney 2:deb61a34ac31 54 int gameSpeed;//change depending on difficulty selected
eencae 0:b85460bc73b9 55
MBirney 3:478b090b7e1b 56 Difficulty currentDifficulty=EASY;
MBirney 3:478b090b7e1b 57
MBirney 3:478b090b7e1b 58
MBirney 3:478b090b7e1b 59 // create enumerated type (0,1,2,3 etc. for direction)
MBirney 3:478b090b7e1b 60 // could be extended for diagonals etc.
MBirney 3:478b090b7e1b 61 enum DirectionName {
MBirney 3:478b090b7e1b 62 UP,
MBirney 3:478b090b7e1b 63 DOWN,
MBirney 3:478b090b7e1b 64 LEFT,
MBirney 3:478b090b7e1b 65 RIGHT,
MBirney 3:478b090b7e1b 66 CENTRE,
MBirney 3:478b090b7e1b 67 UNKNOWN
MBirney 3:478b090b7e1b 68 };
MBirney 3:478b090b7e1b 69
MBirney 3:478b090b7e1b 70
MBirney 3:478b090b7e1b 71
MBirney 3:478b090b7e1b 72 // struct for Joystick
MBirney 3:478b090b7e1b 73 typedef struct JoyStick Joystick;
MBirney 3:478b090b7e1b 74 struct JoyStick {
MBirney 3:478b090b7e1b 75 float x; // current x value
MBirney 3:478b090b7e1b 76 float x0; // 'centred' x value
MBirney 3:478b090b7e1b 77 float y; // current y value
MBirney 3:478b090b7e1b 78 float y0; // 'centred' y value
MBirney 3:478b090b7e1b 79 int button; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
MBirney 3:478b090b7e1b 80 DirectionName direction; // current direction
MBirney 3:478b090b7e1b 81 };
MBirney 3:478b090b7e1b 82 // create struct variable
MBirney 3:478b090b7e1b 83 Joystick joystick;
MBirney 3:478b090b7e1b 84
MBirney 3:478b090b7e1b 85
MBirney 3:478b090b7e1b 86
MBirney 3:478b090b7e1b 87 // read default positions of the joystick to calibrate later readings
MBirney 3:478b090b7e1b 88 void calibrateJoystick()
MBirney 3:478b090b7e1b 89 {
MBirney 3:478b090b7e1b 90 button.mode(PullDown);
MBirney 3:478b090b7e1b 91 // must not move during calibration
MBirney 3:478b090b7e1b 92 joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
MBirney 3:478b090b7e1b 93 joystick.y0 = yPot;
MBirney 3:478b090b7e1b 94 }
MBirney 3:478b090b7e1b 95 void updateJoystick()
MBirney 3:478b090b7e1b 96 {
MBirney 3:478b090b7e1b 97 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
MBirney 3:478b090b7e1b 98 joystick.x = xPot - joystick.x0;
MBirney 3:478b090b7e1b 99 joystick.y = yPot - joystick.y0;
MBirney 3:478b090b7e1b 100 // read button state
MBirney 3:478b090b7e1b 101 joystick.button = button;
MBirney 3:478b090b7e1b 102
MBirney 3:478b090b7e1b 103 // calculate direction depending on x,y values
MBirney 3:478b090b7e1b 104 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
MBirney 3:478b090b7e1b 105 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
MBirney 3:478b090b7e1b 106 joystick.direction = CENTRE;
MBirney 3:478b090b7e1b 107 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
MBirney 3:478b090b7e1b 108 joystick.direction = UP;
MBirney 3:478b090b7e1b 109 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
MBirney 3:478b090b7e1b 110 joystick.direction = DOWN;
MBirney 3:478b090b7e1b 111 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
MBirney 3:478b090b7e1b 112 joystick.direction = LEFT; // remember switched this with right
MBirney 3:478b090b7e1b 113 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
MBirney 3:478b090b7e1b 114 joystick.direction = RIGHT;
MBirney 3:478b090b7e1b 115 } else {
MBirney 3:478b090b7e1b 116 joystick.direction = UNKNOWN;
MBirney 3:478b090b7e1b 117 }
MBirney 3:478b090b7e1b 118 }
eencae 0:b85460bc73b9 119
MBirney 2:deb61a34ac31 120 void displaySplash()
MBirney 2:deb61a34ac31 121 {
MBirney 2:deb61a34ac31 122 // these are default settings so not strictly needed
MBirney 2:deb61a34ac31 123 lcd.inverseMode(); // normal colour mode
MBirney 2:deb61a34ac31 124 lcd.setBrightness(0.5); // put LED backlight on 50%
MBirney 2:deb61a34ac31 125
MBirney 2:deb61a34ac31 126 //Draw S
MBirney 2:deb61a34ac31 127 lcd.drawRect(28,10,2,5,1);
MBirney 2:deb61a34ac31 128 lcd.drawRect(15,10,15,2,1);
MBirney 2:deb61a34ac31 129 lcd.drawRect(15,10,2,10,1);
MBirney 2:deb61a34ac31 130 lcd.drawRect(15,20,15,2,1);
MBirney 2:deb61a34ac31 131 lcd.drawRect(28,20,2,10,1);
MBirney 2:deb61a34ac31 132 lcd.drawRect(15,28,15,2,1);
MBirney 2:deb61a34ac31 133 lcd.drawRect(15,25,2,3,1);
MBirney 2:deb61a34ac31 134
MBirney 2:deb61a34ac31 135 lcd.printString("NAKE ",34,3);
MBirney 2:deb61a34ac31 136 lcd.printString("By M.Birney",10,5);
MBirney 2:deb61a34ac31 137 lcd.drawRect(10,5,65,30,0);
MBirney 2:deb61a34ac31 138
MBirney 2:deb61a34ac31 139 // need to refresh display after setting pixels
MBirney 2:deb61a34ac31 140
MBirney 2:deb61a34ac31 141 lcd.refresh();
eencae 0:b85460bc73b9 142 }
eencae 0:b85460bc73b9 143
eencae 0:b85460bc73b9 144
MBirney 2:deb61a34ac31 145
MBirney 2:deb61a34ac31 146 void easySelected() // display when easy is selected
MBirney 2:deb61a34ac31 147 {
MBirney 3:478b090b7e1b 148 currentDifficulty=EASY;
MBirney 2:deb61a34ac31 149 lcd.clear();
MBirney 2:deb61a34ac31 150 lcd.printString("Please Select",2,0);
MBirney 2:deb61a34ac31 151 lcd.printString("Difficulty:",2,1);
MBirney 2:deb61a34ac31 152 lcd.printString("Easy",20,3);
MBirney 2:deb61a34ac31 153 lcd.printString("Medium",20,4);
MBirney 2:deb61a34ac31 154 lcd.printString("Hard",20,5);
MBirney 2:deb61a34ac31 155 lcd.refresh();
MBirney 2:deb61a34ac31 156 lcd.drawCircle(10,27,2,1);
MBirney 2:deb61a34ac31 157 lcd.drawCircle(10,35,2,0);
MBirney 2:deb61a34ac31 158 lcd.drawCircle(10,43,2,0);
MBirney 2:deb61a34ac31 159
MBirney 2:deb61a34ac31 160 gameSpeed= 1.0;
MBirney 2:deb61a34ac31 161 }
MBirney 2:deb61a34ac31 162 void mediumSelected() // display when medium is selected
MBirney 2:deb61a34ac31 163 {
MBirney 3:478b090b7e1b 164 currentDifficulty=MEDIUM;
MBirney 2:deb61a34ac31 165 lcd.clear();
MBirney 2:deb61a34ac31 166 lcd.printString("Please Select",2,0);
MBirney 2:deb61a34ac31 167 lcd.printString("Difficulty:",2,1);
MBirney 2:deb61a34ac31 168 lcd.printString("Easy",20,3);
MBirney 2:deb61a34ac31 169 lcd.printString("Medium",20,4);
MBirney 2:deb61a34ac31 170 lcd.printString("Hard",20,5);
MBirney 2:deb61a34ac31 171 lcd.refresh();
MBirney 2:deb61a34ac31 172 lcd.drawCircle(10,27,2,0);
MBirney 2:deb61a34ac31 173 lcd.drawCircle(10,35,2,1);
MBirney 2:deb61a34ac31 174 lcd.drawCircle(10,43,2,0);
MBirney 2:deb61a34ac31 175 gameSpeed=1.0/4;
MBirney 2:deb61a34ac31 176 }
MBirney 2:deb61a34ac31 177
MBirney 2:deb61a34ac31 178 void hardSelected() // display when hard is selected
MBirney 2:deb61a34ac31 179 {
MBirney 3:478b090b7e1b 180 currentDifficulty=HARD;
MBirney 2:deb61a34ac31 181 lcd.clear();
MBirney 2:deb61a34ac31 182 lcd.printString("Please Select",2,0);
MBirney 2:deb61a34ac31 183 lcd.printString("Difficulty:",2,1);
MBirney 2:deb61a34ac31 184 lcd.printString("Easy",20,3);
MBirney 2:deb61a34ac31 185 lcd.printString("Medium",20,4);
MBirney 2:deb61a34ac31 186 lcd.printString("Hard",20,5);
MBirney 2:deb61a34ac31 187 lcd.refresh();
MBirney 2:deb61a34ac31 188 lcd.drawCircle(10,27,2,0);
MBirney 2:deb61a34ac31 189 lcd.drawCircle(10,35,2,0);
MBirney 2:deb61a34ac31 190 lcd.drawCircle(10,43,2,1);
MBirney 2:deb61a34ac31 191 gameSpeed=1.0/8;
MBirney 2:deb61a34ac31 192 }
MBirney 2:deb61a34ac31 193
MBirney 2:deb61a34ac31 194
MBirney 2:deb61a34ac31 195
MBirney 2:deb61a34ac31 196 int main()
MBirney 2:deb61a34ac31 197 {
MBirney 3:478b090b7e1b 198
MBirney 2:deb61a34ac31 199 // first need to initialise display
MBirney 2:deb61a34ac31 200 lcd.init();
MBirney 3:478b090b7e1b 201 // pb.rise(&flip);
MBirney 2:deb61a34ac31 202 displaySplash();
MBirney 2:deb61a34ac31 203 wait(1);
MBirney 2:deb61a34ac31 204 easySelected();
MBirney 3:478b090b7e1b 205 joystick.direction=UNKNOWN;
MBirney 3:478b090b7e1b 206 calibrateJoystick(); // get centred values of joystick
MBirney 3:478b090b7e1b 207 pollJoystick.attach(&updateJoystick,1.0/5.0); // read joystick 10 times per second
MBirney 2:deb61a34ac31 208
MBirney 2:deb61a34ac31 209
MBirney 3:478b090b7e1b 210
MBirney 3:478b090b7e1b 211 while(1) {
MBirney 3:478b090b7e1b 212
MBirney 3:478b090b7e1b 213 if (gamePlaying==0) {
MBirney 2:deb61a34ac31 214
MBirney 2:deb61a34ac31 215
MBirney 3:478b090b7e1b 216 switch(currentDifficulty) {
MBirney 3:478b090b7e1b 217 case EASY:
MBirney 2:deb61a34ac31 218
MBirney 3:478b090b7e1b 219 switch (joystick.direction) {
MBirney 3:478b090b7e1b 220
MBirney 3:478b090b7e1b 221 case UP:
MBirney 3:478b090b7e1b 222 hardSelected();
MBirney 3:478b090b7e1b 223 break;
MBirney 2:deb61a34ac31 224
MBirney 2:deb61a34ac31 225
MBirney 3:478b090b7e1b 226 case DOWN:
MBirney 3:478b090b7e1b 227 mediumSelected();
MBirney 3:478b090b7e1b 228 break;
MBirney 3:478b090b7e1b 229 }
MBirney 3:478b090b7e1b 230 break;
MBirney 2:deb61a34ac31 231
MBirney 2:deb61a34ac31 232
MBirney 3:478b090b7e1b 233 case MEDIUM:
MBirney 3:478b090b7e1b 234
MBirney 3:478b090b7e1b 235 switch (joystick.direction) {
MBirney 3:478b090b7e1b 236
MBirney 3:478b090b7e1b 237 case UP:
MBirney 3:478b090b7e1b 238 easySelected();
MBirney 3:478b090b7e1b 239 break;
MBirney 3:478b090b7e1b 240
MBirney 3:478b090b7e1b 241
MBirney 3:478b090b7e1b 242 case DOWN:
MBirney 3:478b090b7e1b 243 hardSelected();
MBirney 3:478b090b7e1b 244 break;
MBirney 3:478b090b7e1b 245 }
MBirney 2:deb61a34ac31 246
MBirney 2:deb61a34ac31 247
MBirney 2:deb61a34ac31 248
MBirney 3:478b090b7e1b 249 break;
MBirney 3:478b090b7e1b 250 case HARD:
MBirney 3:478b090b7e1b 251 switch (joystick.direction) {
MBirney 2:deb61a34ac31 252
MBirney 3:478b090b7e1b 253 case UP:
MBirney 3:478b090b7e1b 254 mediumSelected();
MBirney 3:478b090b7e1b 255 break;
MBirney 2:deb61a34ac31 256
MBirney 2:deb61a34ac31 257
MBirney 3:478b090b7e1b 258 case DOWN:
MBirney 3:478b090b7e1b 259 easySelected();
MBirney 3:478b090b7e1b 260 break;
MBirney 3:478b090b7e1b 261 }
MBirney 3:478b090b7e1b 262 break;
MBirney 3:478b090b7e1b 263 wait(0.1);
MBirney 3:478b090b7e1b 264 }
MBirney 3:478b090b7e1b 265
MBirney 2:deb61a34ac31 266 }
MBirney 2:deb61a34ac31 267
MBirney 3:478b090b7e1b 268 }
MBirney 2:deb61a34ac31 269
eencae 0:b85460bc73b9 270 }