ELEC2645 Embedded Systems Project (JOYSTICK)

Dependencies:   N5110 SDFileSystem mbed

Committer:
wuchyi
Date:
Sat May 07 14:35:21 2016 +0000
Revision:
2:537b8388dc6a
Parent:
1:06958b7bbf65
Child:
4:f17082a43006
final1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wuchyi 2:537b8388dc6a 1 #include "main.h"
wuchyi 0:1719e11ef162 2
wuchyi 2:537b8388dc6a 3 int main()
wuchyi 2:537b8388dc6a 4 {
wuchyi 2:537b8388dc6a 5 Butt1.rise(butt1_isr); ///initializes the buttons IntterruptIn
wuchyi 2:537b8388dc6a 6 Butt1.mode(PullDown);
wuchyi 2:537b8388dc6a 7 Butt2.rise(butt2_isr);
wuchyi 2:537b8388dc6a 8 Butt2.mode(PullDown);
wuchyi 2:537b8388dc6a 9 init_display();
wuchyi 2:537b8388dc6a 10 joystickTimer.attach(joystick_pos,0.1);
wuchyi 2:537b8388dc6a 11 calibrate_joystick();
wuchyi 2:537b8388dc6a 12 gamemode = 0;
wuchyi 2:537b8388dc6a 13 LED = 0;
wuchyi 2:537b8388dc6a 14 level = 2.0; ///default level
wuchyi 2:537b8388dc6a 15 levelcalc = 0.4; /// default speed
wuchyi 2:537b8388dc6a 16 main_menu();
wuchyi 2:537b8388dc6a 17 }
wuchyi 0:1719e11ef162 18
wuchyi 0:1719e11ef162 19 void init_display()
wuchyi 0:1719e11ef162 20 {
wuchyi 0:1719e11ef162 21 lcd.init();
wuchyi 2:537b8388dc6a 22 lcd.normalMode(); /// normal colour mode
wuchyi 2:537b8388dc6a 23 lcd.setBrightness(0.5); /// put LED backlight on 50%
wuchyi 2:537b8388dc6a 24 lcd.clear(); /// clear screen (init)
wuchyi 0:1719e11ef162 25 }
wuchyi 0:1719e11ef162 26
wuchyi 0:1719e11ef162 27
wuchyi 0:1719e11ef162 28 void draw_screen()
wuchyi 0:1719e11ef162 29 {
wuchyi 0:1719e11ef162 30 lcd.clear();
wuchyi 1:06958b7bbf65 31
wuchyi 2:537b8388dc6a 32 lcd.drawRect(0,1,83,45,0); /// borders square
wuchyi 0:1719e11ef162 33
wuchyi 2:537b8388dc6a 34 for (int q = 0; q < snake.length ; q++) { ///print snake
wuchyi 2:537b8388dc6a 35
wuchyi 1:06958b7bbf65 36 lcd.drawRect ((snake.tailx[q]*2),(snake.taily[q]*2),1,1,1);
wuchyi 1:06958b7bbf65 37
wuchyi 0:1719e11ef162 38 }
wuchyi 2:537b8388dc6a 39
wuchyi 2:537b8388dc6a 40 lcd.drawRect ((fx * 2), (fy * 2), 1,1,1); /// print food position
wuchyi 2:537b8388dc6a 41
wuchyi 2:537b8388dc6a 42 lcd.refresh(); /// update display
wuchyi 0:1719e11ef162 43
wuchyi 0:1719e11ef162 44 }
wuchyi 0:1719e11ef162 45
wuchyi 0:1719e11ef162 46
wuchyi 0:1719e11ef162 47 void calibrate_joystick()
wuchyi 0:1719e11ef162 48 {
wuchyi 2:537b8388dc6a 49 ///get initial joystick position as offset
wuchyi 0:1719e11ef162 50 joystick.x0 = xAxis;
wuchyi 0:1719e11ef162 51 joystick.y0 = yAxis;
wuchyi 0:1719e11ef162 52
wuchyi 0:1719e11ef162 53 }
wuchyi 0:1719e11ef162 54
wuchyi 0:1719e11ef162 55 void joystick_pos()
wuchyi 0:1719e11ef162 56 {
wuchyi 0:1719e11ef162 57 joystick.x = xAxis - joystick.x0;
wuchyi 0:1719e11ef162 58 joystick.y = yAxis - joystick.y0;
wuchyi 0:1719e11ef162 59
wuchyi 0:1719e11ef162 60 if ( fabs(joystick.y) <= JOYSTICK_TOLERANCE && fabs(joystick.x) < JOYSTICK_TOLERANCE) {
wuchyi 0:1719e11ef162 61 joystick.direction = CENTRE;
wuchyi 0:1719e11ef162 62 } else if ( joystick.y > JOYSTICK_TOLERANCE && fabs(joystick.x) < JOYSTICK_TOLERANCE) {
wuchyi 0:1719e11ef162 63 joystick.direction = UP;
wuchyi 0:1719e11ef162 64 } else if ( joystick.y < JOYSTICK_TOLERANCE && fabs(joystick.x) < JOYSTICK_TOLERANCE) {
wuchyi 0:1719e11ef162 65 joystick.direction = DOWN;
wuchyi 0:1719e11ef162 66 } else if ( joystick.x > JOYSTICK_TOLERANCE && fabs(joystick.y) < JOYSTICK_TOLERANCE) {
wuchyi 0:1719e11ef162 67 joystick.direction = RIGHT;
wuchyi 0:1719e11ef162 68 } else if ( joystick.x < JOYSTICK_TOLERANCE && fabs(joystick.y) < JOYSTICK_TOLERANCE) {
wuchyi 0:1719e11ef162 69 joystick.direction = LEFT;
wuchyi 0:1719e11ef162 70 } else {
wuchyi 0:1719e11ef162 71 joystick.direction = UNKNOWN;
wuchyi 0:1719e11ef162 72 }
wuchyi 0:1719e11ef162 73
wuchyi 0:1719e11ef162 74 }
wuchyi 0:1719e11ef162 75
wuchyi 0:1719e11ef162 76
wuchyi 2:537b8388dc6a 77 void snake_move() ///move the coordinate of the snake head, if CENTRE, checks for pdirection and repeats.
wuchyi 0:1719e11ef162 78 {
wuchyi 2:537b8388dc6a 79 if (pdirection == 0 && ( joystick.direction == RIGHT || joystick.direction == UNKNOWN ) ) { /// disable going backwards
wuchyi 1:06958b7bbf65 80 snake.hx--;
wuchyi 2:537b8388dc6a 81 } else if (pdirection == 1 && ( joystick.direction == DOWN || joystick.direction == UNKNOWN ) ) {
wuchyi 1:06958b7bbf65 82 snake.hy++;
wuchyi 2:537b8388dc6a 83 } else if (pdirection == 2 && ( joystick.direction == LEFT || joystick.direction == UNKNOWN ) ) {
wuchyi 1:06958b7bbf65 84 snake.hx++;
wuchyi 2:537b8388dc6a 85 } else if (pdirection == 3 && ( joystick.direction == UP || joystick.direction == UNKNOWN ) ) {
wuchyi 1:06958b7bbf65 86 snake.hy--;
wuchyi 0:1719e11ef162 87 } else {
wuchyi 1:06958b7bbf65 88
wuchyi 1:06958b7bbf65 89 if (joystick.direction == CENTRE) {
wuchyi 1:06958b7bbf65 90 if (pdirection == 0) {
wuchyi 1:06958b7bbf65 91 snake.hx-- ;
wuchyi 1:06958b7bbf65 92 } else if (pdirection == 1) {
wuchyi 1:06958b7bbf65 93 snake.hy++ ;
wuchyi 1:06958b7bbf65 94 } else if (pdirection == 2) {
wuchyi 1:06958b7bbf65 95 snake.hx++ ;
wuchyi 1:06958b7bbf65 96 } else if (pdirection == 3) {
wuchyi 1:06958b7bbf65 97 snake.hy-- ;
wuchyi 1:06958b7bbf65 98 } else {
wuchyi 1:06958b7bbf65 99 }
wuchyi 0:1719e11ef162 100 } else {
wuchyi 1:06958b7bbf65 101 if (joystick.direction == LEFT) {
wuchyi 1:06958b7bbf65 102 snake.hx-- ;
wuchyi 1:06958b7bbf65 103 pdirection = 0;
wuchyi 1:06958b7bbf65 104 } else if (joystick.direction == UP) {
wuchyi 1:06958b7bbf65 105 snake.hy++ ;
wuchyi 1:06958b7bbf65 106 pdirection = 1;
wuchyi 1:06958b7bbf65 107 } else if (joystick.direction == RIGHT) {
wuchyi 1:06958b7bbf65 108 snake.hx++ ;
wuchyi 1:06958b7bbf65 109 pdirection = 2;
wuchyi 1:06958b7bbf65 110 } else if (joystick.direction == DOWN) {
wuchyi 1:06958b7bbf65 111 snake.hy-- ;
wuchyi 1:06958b7bbf65 112 pdirection = 3;
wuchyi 2:537b8388dc6a 113 } else if (joystick.direction == UNKNOWN) {
wuchyi 1:06958b7bbf65 114 } else {
wuchyi 1:06958b7bbf65 115 }
wuchyi 1:06958b7bbf65 116
wuchyi 0:1719e11ef162 117 }
wuchyi 0:1719e11ef162 118 }
wuchyi 0:1719e11ef162 119 }
wuchyi 0:1719e11ef162 120
wuchyi 0:1719e11ef162 121 void game()
wuchyi 0:1719e11ef162 122 {
wuchyi 2:537b8388dc6a 123
wuchyi 1:06958b7bbf65 124 joystickTimer.detach();
wuchyi 1:06958b7bbf65 125 gameTimer.detach();
wuchyi 1:06958b7bbf65 126 gameTimer1.detach();
wuchyi 1:06958b7bbf65 127 gameTimer2.detach();
wuchyi 1:06958b7bbf65 128 joystick.direction = CENTRE;
wuchyi 2:537b8388dc6a 129 gamemode = 0;
wuchyi 0:1719e11ef162 130 gameOver = false;
wuchyi 2:537b8388dc6a 131 snake.hx = width / 2; /// initial position of snake head
wuchyi 0:1719e11ef162 132 snake.hy = height / 2;
wuchyi 0:1719e11ef162 133 food_pos();
wuchyi 0:1719e11ef162 134 score = 0;
wuchyi 0:1719e11ef162 135 pdirection = 1;
wuchyi 2:537b8388dc6a 136 snake.length = 4; ///length including head and tail
wuchyi 2:537b8388dc6a 137 for (int w = 0 ; w < snake.length ; w++) { ///set initial snake position
wuchyi 0:1719e11ef162 138 snake.tailx[w] = (snake.hx - w) ;
wuchyi 0:1719e11ef162 139 snake.taily[w] = snake.hy;
wuchyi 1:06958b7bbf65 140
wuchyi 0:1719e11ef162 141 }
wuchyi 0:1719e11ef162 142
wuchyi 0:1719e11ef162 143 if (gamemode == 0) {
wuchyi 2:537b8388dc6a 144 joystickTimer.attach(&joystick_pos, 0.1);
wuchyi 2:537b8388dc6a 145 gameTimer1.attach(&snake_logic_1, levelcalc);
wuchyi 2:537b8388dc6a 146 gameTimer2.attach(&draw_screen, 0.1);
wuchyi 2:537b8388dc6a 147
wuchyi 0:1719e11ef162 148 while (!gameOver) {
wuchyi 2:537b8388dc6a 149 butt2_flag = 0;
wuchyi 1:06958b7bbf65 150 sleep();
wuchyi 2:537b8388dc6a 151
wuchyi 2:537b8388dc6a 152 if (butt2_flag == 1) {
wuchyi 2:537b8388dc6a 153 butt2_flag = 0;
wuchyi 2:537b8388dc6a 154 gameTimer1.detach();
wuchyi 2:537b8388dc6a 155 gameTimer2.detach();
wuchyi 2:537b8388dc6a 156 gamePaused_screen();
wuchyi 2:537b8388dc6a 157 }
wuchyi 2:537b8388dc6a 158
wuchyi 1:06958b7bbf65 159 }
wuchyi 1:06958b7bbf65 160 if (gameOver == true) {
wuchyi 1:06958b7bbf65 161 gameTimer1.detach();
wuchyi 1:06958b7bbf65 162 gameTimer2.detach();
wuchyi 2:537b8388dc6a 163 gameOver_screen();
wuchyi 1:06958b7bbf65 164 }
wuchyi 1:06958b7bbf65 165 }
wuchyi 2:537b8388dc6a 166 }
wuchyi 1:06958b7bbf65 167
wuchyi 2:537b8388dc6a 168 void snake_logic_1()
wuchyi 2:537b8388dc6a 169 {
wuchyi 0:1719e11ef162 170
wuchyi 2:537b8388dc6a 171 snake_move();
wuchyi 2:537b8388dc6a 172 for (int d = (snake.length) ; d > 0 ; d--) { ///move all snake body one position back
wuchyi 2:537b8388dc6a 173 snake.tailx[d] = snake.tailx[d - 1];
wuchyi 2:537b8388dc6a 174 snake.taily[d] = snake.taily[d - 1];
wuchyi 1:06958b7bbf65 175
wuchyi 2:537b8388dc6a 176 }
wuchyi 2:537b8388dc6a 177 snake.tailx[0] = snake.hx;
wuchyi 2:537b8388dc6a 178 snake.taily[0] = snake.hy;
wuchyi 1:06958b7bbf65 179
wuchyi 2:537b8388dc6a 180 for (int p = 1; p < snake.length + 1; p++) { ///snake dies when come in contact with tail
wuchyi 2:537b8388dc6a 181 if (snake.tailx[0] == snake.tailx[p] && snake.taily[0] == snake.taily[p]) {
wuchyi 1:06958b7bbf65 182 gameOver = true;
wuchyi 1:06958b7bbf65 183 }
wuchyi 1:06958b7bbf65 184
wuchyi 1:06958b7bbf65 185
wuchyi 2:537b8388dc6a 186 }
wuchyi 2:537b8388dc6a 187
wuchyi 2:537b8388dc6a 188 if (snake.tailx[0] == 0 ||
wuchyi 2:537b8388dc6a 189 snake.tailx[0] == width ||
wuchyi 2:537b8388dc6a 190 snake.taily[0] == 1 ||
wuchyi 2:537b8388dc6a 191 snake.taily[0] == height) { /// snake dies when hit wall
wuchyi 2:537b8388dc6a 192 gameOver = true;
wuchyi 2:537b8388dc6a 193 }
wuchyi 2:537b8388dc6a 194
wuchyi 2:537b8388dc6a 195
wuchyi 2:537b8388dc6a 196 if (snake.tailx[0] == fx && snake.taily[0] == fy) { // snake grows when in contact with food
wuchyi 2:537b8388dc6a 197 score++;
wuchyi 2:537b8388dc6a 198 food_pos();
wuchyi 2:537b8388dc6a 199 snake.length++;
wuchyi 2:537b8388dc6a 200 }
wuchyi 2:537b8388dc6a 201 }
wuchyi 2:537b8388dc6a 202
wuchyi 2:537b8388dc6a 203
wuchyi 2:537b8388dc6a 204 void food_pos()
wuchyi 2:537b8388dc6a 205 {
wuchyi 2:537b8388dc6a 206 srand(time(NULL));
wuchyi 2:537b8388dc6a 207 fx = rand() % (width - 3) + 2; // random x from 4 to width - 3 for x coordinate
wuchyi 2:537b8388dc6a 208 fy = rand() % (height - 3) + 2; // random y from 4 to height - 3 for y coordinate
wuchyi 2:537b8388dc6a 209
wuchyi 2:537b8388dc6a 210 }
wuchyi 2:537b8388dc6a 211
wuchyi 2:537b8388dc6a 212 void main_menu()
wuchyi 2:537b8388dc6a 213 {
wuchyi 2:537b8388dc6a 214 lcd.clear();
wuchyi 2:537b8388dc6a 215 joystickTimer.detach();
wuchyi 2:537b8388dc6a 216 gameTimer1.detach();
wuchyi 2:537b8388dc6a 217 gameTimer2.detach();
wuchyi 2:537b8388dc6a 218 joystickTimer.attach(joystick_pos,0.15);
wuchyi 2:537b8388dc6a 219 butt1_flag = 0;
wuchyi 2:537b8388dc6a 220 int select = 0;
wuchyi 2:537b8388dc6a 221 while (1) {
wuchyi 2:537b8388dc6a 222 switch(select) {
wuchyi 2:537b8388dc6a 223 case 0:
wuchyi 2:537b8388dc6a 224 switch(joystick.direction) {
wuchyi 2:537b8388dc6a 225 case UP:
wuchyi 2:537b8388dc6a 226 select = 1;
wuchyi 2:537b8388dc6a 227 break;
wuchyi 2:537b8388dc6a 228 case DOWN:
wuchyi 2:537b8388dc6a 229 select = 2;
wuchyi 2:537b8388dc6a 230 break;
wuchyi 2:537b8388dc6a 231 }
wuchyi 2:537b8388dc6a 232 break;
wuchyi 2:537b8388dc6a 233 case 1:
wuchyi 2:537b8388dc6a 234 switch(joystick.direction) {
wuchyi 2:537b8388dc6a 235 case UP:
wuchyi 2:537b8388dc6a 236 select = 2;
wuchyi 2:537b8388dc6a 237 break;
wuchyi 2:537b8388dc6a 238 case DOWN:
wuchyi 2:537b8388dc6a 239 select = 0;
wuchyi 2:537b8388dc6a 240 break;
wuchyi 2:537b8388dc6a 241 }
wuchyi 2:537b8388dc6a 242 break;
wuchyi 2:537b8388dc6a 243 case 2:
wuchyi 2:537b8388dc6a 244 switch(joystick.direction) {
wuchyi 2:537b8388dc6a 245 case UP:
wuchyi 2:537b8388dc6a 246 select = 0;
wuchyi 2:537b8388dc6a 247 break;
wuchyi 2:537b8388dc6a 248 case DOWN:
wuchyi 2:537b8388dc6a 249 select = 1;
wuchyi 2:537b8388dc6a 250 break;
wuchyi 2:537b8388dc6a 251 }
wuchyi 2:537b8388dc6a 252 break;
wuchyi 1:06958b7bbf65 253 }
wuchyi 2:537b8388dc6a 254 wait(0.1);
wuchyi 2:537b8388dc6a 255 if (select == 0) {
wuchyi 2:537b8388dc6a 256 lcd.clear();
wuchyi 2:537b8388dc6a 257 lcd.printString("SNAKE",27,0);
wuchyi 2:537b8388dc6a 258 lcd.printString("Start Game",7,2);
wuchyi 2:537b8388dc6a 259 lcd.printString("High Scores",7,3);
wuchyi 2:537b8388dc6a 260 lcd.printString("Settings",7,4);
wuchyi 2:537b8388dc6a 261 lcd.drawCircle(3,19,2,1);
wuchyi 2:537b8388dc6a 262 lcd.refresh();
wuchyi 2:537b8388dc6a 263 wait(0.15);
wuchyi 2:537b8388dc6a 264 if (butt1_flag == 1) {
wuchyi 2:537b8388dc6a 265 butt1_flag = 0;
wuchyi 2:537b8388dc6a 266 joystickTimer.detach();
wuchyi 2:537b8388dc6a 267 game();
wuchyi 2:537b8388dc6a 268 }
wuchyi 2:537b8388dc6a 269 } else if (select == 1) {
wuchyi 2:537b8388dc6a 270 lcd.clear();
wuchyi 2:537b8388dc6a 271 lcd.printString("SNAKE",27,0);
wuchyi 2:537b8388dc6a 272 lcd.printString("Start Game", 7,2);
wuchyi 2:537b8388dc6a 273 lcd.printString("High Scores",7,3);
wuchyi 2:537b8388dc6a 274 lcd.printString("Settings",7,4);
wuchyi 2:537b8388dc6a 275 lcd.drawCircle(3,27,2,1);
wuchyi 2:537b8388dc6a 276 lcd.refresh();
wuchyi 2:537b8388dc6a 277 wait(0.15);
wuchyi 2:537b8388dc6a 278 if (butt1_flag == 1) {
wuchyi 2:537b8388dc6a 279 butt1_flag = 0;
wuchyi 2:537b8388dc6a 280 HiScoreScreen();
wuchyi 2:537b8388dc6a 281 }
wuchyi 2:537b8388dc6a 282 } else if (select == 2) {
wuchyi 2:537b8388dc6a 283 lcd.clear();
wuchyi 2:537b8388dc6a 284 lcd.printString("SNAKE",27,0);
wuchyi 2:537b8388dc6a 285 lcd.printString("Start Game", 7,2);
wuchyi 2:537b8388dc6a 286 lcd.printString("High Scores",7,3);
wuchyi 2:537b8388dc6a 287 lcd.printString("Settings",7,4);
wuchyi 2:537b8388dc6a 288 lcd.drawCircle(3,35,2,1);
wuchyi 2:537b8388dc6a 289 lcd.refresh();
wuchyi 2:537b8388dc6a 290 wait(0.15);
wuchyi 2:537b8388dc6a 291 if (butt1_flag == 1) {
wuchyi 2:537b8388dc6a 292 butt1_flag = 0;
wuchyi 2:537b8388dc6a 293 settingsScreen();
wuchyi 2:537b8388dc6a 294 }
wuchyi 2:537b8388dc6a 295
wuchyi 2:537b8388dc6a 296
wuchyi 2:537b8388dc6a 297 }
wuchyi 2:537b8388dc6a 298 }
wuchyi 2:537b8388dc6a 299 }
wuchyi 2:537b8388dc6a 300
wuchyi 2:537b8388dc6a 301 void HiScoreScreen()
wuchyi 2:537b8388dc6a 302 {
wuchyi 2:537b8388dc6a 303 lcd.clear();
wuchyi 2:537b8388dc6a 304 fp = fopen("/sd/hiscore.txt","r");
wuchyi 2:537b8388dc6a 305 while (butt2_flag == 0) {
wuchyi 2:537b8388dc6a 306
wuchyi 2:537b8388dc6a 307 if (fp == NULL) { /// if high scores file not found
wuchyi 2:537b8388dc6a 308 lcd.printString("High Scores:", 9,0);
wuchyi 2:537b8388dc6a 309
wuchyi 2:537b8388dc6a 310 lcd.printString("No high", 21,3);
wuchyi 2:537b8388dc6a 311 lcd.printString("scores found",9,4);
wuchyi 2:537b8388dc6a 312
wuchyi 2:537b8388dc6a 313 sleep();
wuchyi 2:537b8388dc6a 314
wuchyi 2:537b8388dc6a 315 fclose(fp);
wuchyi 2:537b8388dc6a 316 } else {
wuchyi 2:537b8388dc6a 317 lcd.printString("High Scores:", 9,0);
wuchyi 2:537b8388dc6a 318 lcd.printString("Level 1:", 9,1);
wuchyi 2:537b8388dc6a 319 lcd.printString("Level 2:", 9,2);
wuchyi 2:537b8388dc6a 320 lcd.printString("Level 3:", 9,3);
wuchyi 2:537b8388dc6a 321 lcd.printString("Level 4:", 9,4);
wuchyi 2:537b8388dc6a 322 lcd.printString("Level 5:", 9,5);
wuchyi 2:537b8388dc6a 323
wuchyi 2:537b8388dc6a 324 int o; ///index of file
wuchyi 2:537b8388dc6a 325 while (fscanf(fp, "%d,%d \n", &level_array[o],&HiScoreTable[o]) != EOF) {
wuchyi 2:537b8388dc6a 326 o++;
wuchyi 2:537b8388dc6a 327 }
wuchyi 2:537b8388dc6a 328
wuchyi 2:537b8388dc6a 329 for (int lvl2 = 0; lvl2 <5 ; lvl2++) {
wuchyi 2:537b8388dc6a 330 char lvlscore[14]; ///char to print highscore
wuchyi 2:537b8388dc6a 331 sprintf(lvlscore,"%d",HiScoreTable[lvl2]); ///print highscore to char
wuchyi 2:537b8388dc6a 332 lcd.printString ( lvlscore, 64, (lvl2+1)); ///print highscore on screen
wuchyi 2:537b8388dc6a 333 }
wuchyi 2:537b8388dc6a 334 }
wuchyi 2:537b8388dc6a 335 fclose(fp);
wuchyi 2:537b8388dc6a 336 lcd.refresh();
wuchyi 2:537b8388dc6a 337 sleep();
wuchyi 2:537b8388dc6a 338
wuchyi 2:537b8388dc6a 339 }
wuchyi 2:537b8388dc6a 340
wuchyi 2:537b8388dc6a 341 if (butt2_flag == 1) {
wuchyi 2:537b8388dc6a 342 butt2_flag = 0;
wuchyi 2:537b8388dc6a 343 main_menu();
wuchyi 2:537b8388dc6a 344 butt1_flag = 0;
wuchyi 0:1719e11ef162 345 }
wuchyi 0:1719e11ef162 346
wuchyi 0:1719e11ef162 347
wuchyi 0:1719e11ef162 348
wuchyi 2:537b8388dc6a 349 }
wuchyi 0:1719e11ef162 350
wuchyi 2:537b8388dc6a 351 void settingsScreen()
wuchyi 2:537b8388dc6a 352 {
wuchyi 2:537b8388dc6a 353 lcd.clear();
wuchyi 2:537b8388dc6a 354 lcd.printString("Settings",18,0);
wuchyi 2:537b8388dc6a 355 int levelsel = 2;
wuchyi 2:537b8388dc6a 356 while (butt2_flag == 0) {
wuchyi 2:537b8388dc6a 357 switch(levelsel) {
wuchyi 2:537b8388dc6a 358 case 1:
wuchyi 2:537b8388dc6a 359 switch(joystick.direction) {
wuchyi 2:537b8388dc6a 360 case RIGHT:
wuchyi 2:537b8388dc6a 361 level = 2.0;
wuchyi 2:537b8388dc6a 362 levelsel = 2;
wuchyi 2:537b8388dc6a 363 break;
wuchyi 2:537b8388dc6a 364 case LEFT:
wuchyi 2:537b8388dc6a 365 level = 5.0;
wuchyi 2:537b8388dc6a 366 levelsel = 5;
wuchyi 2:537b8388dc6a 367 break;
wuchyi 2:537b8388dc6a 368 }
wuchyi 2:537b8388dc6a 369 break;
wuchyi 2:537b8388dc6a 370 case 2:
wuchyi 2:537b8388dc6a 371 switch(joystick.direction) {
wuchyi 2:537b8388dc6a 372 case RIGHT:
wuchyi 2:537b8388dc6a 373 level = 3.0;
wuchyi 2:537b8388dc6a 374 levelsel = 3;
wuchyi 2:537b8388dc6a 375 break;
wuchyi 2:537b8388dc6a 376 case LEFT:
wuchyi 2:537b8388dc6a 377 level = 1.0;
wuchyi 2:537b8388dc6a 378 levelsel = 1;
wuchyi 2:537b8388dc6a 379 break;
wuchyi 2:537b8388dc6a 380 }
wuchyi 2:537b8388dc6a 381 break;
wuchyi 2:537b8388dc6a 382 case 3:
wuchyi 2:537b8388dc6a 383 switch(joystick.direction) {
wuchyi 2:537b8388dc6a 384 case RIGHT:
wuchyi 2:537b8388dc6a 385 level = 4.0;
wuchyi 2:537b8388dc6a 386 levelsel = 4;
wuchyi 2:537b8388dc6a 387 break;
wuchyi 2:537b8388dc6a 388 case LEFT:
wuchyi 2:537b8388dc6a 389 level = 2.0;
wuchyi 2:537b8388dc6a 390 levelsel = 2;
wuchyi 2:537b8388dc6a 391 break;
wuchyi 2:537b8388dc6a 392 }
wuchyi 2:537b8388dc6a 393 break;
wuchyi 2:537b8388dc6a 394 case 4:
wuchyi 2:537b8388dc6a 395 switch(joystick.direction) {
wuchyi 2:537b8388dc6a 396 case RIGHT:
wuchyi 2:537b8388dc6a 397 level = 5.0;
wuchyi 2:537b8388dc6a 398 levelsel = 5;
wuchyi 2:537b8388dc6a 399
wuchyi 2:537b8388dc6a 400 break;
wuchyi 2:537b8388dc6a 401 case LEFT:
wuchyi 2:537b8388dc6a 402 level = 3.0;
wuchyi 2:537b8388dc6a 403 levelsel = 3;
wuchyi 2:537b8388dc6a 404 }
wuchyi 2:537b8388dc6a 405 break;
wuchyi 2:537b8388dc6a 406 case 5:
wuchyi 2:537b8388dc6a 407 switch(joystick.direction) {
wuchyi 2:537b8388dc6a 408 case RIGHT:
wuchyi 2:537b8388dc6a 409 level = 1.0;
wuchyi 2:537b8388dc6a 410 levelsel = 1;
wuchyi 2:537b8388dc6a 411 break;
wuchyi 2:537b8388dc6a 412 case LEFT:
wuchyi 2:537b8388dc6a 413 level = 4.0;
wuchyi 2:537b8388dc6a 414 levelsel = 4;
wuchyi 2:537b8388dc6a 415 break;
wuchyi 2:537b8388dc6a 416 }
wuchyi 2:537b8388dc6a 417 break;
wuchyi 2:537b8388dc6a 418 }
wuchyi 2:537b8388dc6a 419
wuchyi 2:537b8388dc6a 420 if (level == 1) {
wuchyi 2:537b8388dc6a 421 lcd.printString("Level: < 1 >",6,3);
wuchyi 2:537b8388dc6a 422 levelcalc = 0.4;
wuchyi 2:537b8388dc6a 423 lcd.refresh();
wuchyi 2:537b8388dc6a 424 sleep();
wuchyi 2:537b8388dc6a 425 } else if (level == 2) {
wuchyi 2:537b8388dc6a 426 lcd.printString("Level: < 2 >",6,3);
wuchyi 2:537b8388dc6a 427 levelcalc = 0.33;
wuchyi 2:537b8388dc6a 428 lcd.refresh();
wuchyi 2:537b8388dc6a 429 sleep();
wuchyi 2:537b8388dc6a 430 } else if (level == 3) {
wuchyi 2:537b8388dc6a 431 lcd.printString("Level: < 3 >",6,3);
wuchyi 2:537b8388dc6a 432 levelcalc = 0.25;
wuchyi 2:537b8388dc6a 433 lcd.refresh();
wuchyi 2:537b8388dc6a 434 sleep();
wuchyi 2:537b8388dc6a 435 } else if (level == 4) {
wuchyi 2:537b8388dc6a 436 lcd.printString("Level: < 4 >",6,3);
wuchyi 2:537b8388dc6a 437 levelcalc = 0.15;
wuchyi 2:537b8388dc6a 438 lcd.refresh();
wuchyi 2:537b8388dc6a 439 sleep();
wuchyi 2:537b8388dc6a 440 } else if (level == 5) {
wuchyi 2:537b8388dc6a 441 lcd.printString("Level: < 5 >",6,3);
wuchyi 2:537b8388dc6a 442 levelcalc = 0.1;
wuchyi 2:537b8388dc6a 443 lcd.refresh();
wuchyi 2:537b8388dc6a 444 sleep();
wuchyi 2:537b8388dc6a 445 }
wuchyi 0:1719e11ef162 446
wuchyi 1:06958b7bbf65 447 }
wuchyi 0:1719e11ef162 448
wuchyi 2:537b8388dc6a 449 if (butt2_flag == 1) {
wuchyi 2:537b8388dc6a 450 butt2_flag = 0;
wuchyi 2:537b8388dc6a 451 lcd.clear();
wuchyi 2:537b8388dc6a 452 butt1_flag = 0;
wuchyi 2:537b8388dc6a 453 main_menu();
wuchyi 2:537b8388dc6a 454 }
wuchyi 2:537b8388dc6a 455 }
wuchyi 2:537b8388dc6a 456
wuchyi 2:537b8388dc6a 457 void gameOver_screen()
wuchyi 2:537b8388dc6a 458 {
wuchyi 2:537b8388dc6a 459 gameTimer1.detach();
wuchyi 2:537b8388dc6a 460 gameTimer2.detach();
wuchyi 2:537b8388dc6a 461
wuchyi 2:537b8388dc6a 462 while (butt2_flag == 0) {
wuchyi 2:537b8388dc6a 463 fp = fopen("/sd/hiscore.txt","r"); //read high score
wuchyi 2:537b8388dc6a 464 wait(0.5);
wuchyi 2:537b8388dc6a 465 lcd.clear();
wuchyi 2:537b8388dc6a 466
wuchyi 2:537b8388dc6a 467 lcd.printString("Game Over",15,1);
wuchyi 2:537b8388dc6a 468 char scorebuffer[14];
wuchyi 2:537b8388dc6a 469 int length = sprintf(scorebuffer, "Score = %d",score);
wuchyi 2:537b8388dc6a 470 if (length <=14) {
wuchyi 2:537b8388dc6a 471 lcd.printString(scorebuffer,12,2);
wuchyi 2:537b8388dc6a 472 }
wuchyi 2:537b8388dc6a 473
wuchyi 2:537b8388dc6a 474 if (fp == NULL) { ///if high score file doesnt exist
wuchyi 2:537b8388dc6a 475 fp = fopen("/sd/hiscore.txt","w"); /// create new high score
wuchyi 2:537b8388dc6a 476 for (int lvl = 1; lvl < 6; lvl ++) { ///prints all level score as zero (initialize)
wuchyi 2:537b8388dc6a 477 fprintf(fp,"%d,0 \n", lvl);
wuchyi 1:06958b7bbf65 478 }
wuchyi 2:537b8388dc6a 479 fprintf(fp,"%d,%d \n", level, score); /// print the score of the current game according to level
wuchyi 2:537b8388dc6a 480
wuchyi 2:537b8388dc6a 481 lcd.printString("New Highscore!",0,4);
wuchyi 2:537b8388dc6a 482 fclose(fp);
wuchyi 2:537b8388dc6a 483 sleep();
wuchyi 2:537b8388dc6a 484
wuchyi 2:537b8388dc6a 485 if (butt2_flag == 1) {
wuchyi 2:537b8388dc6a 486 butt2_flag = 0;
wuchyi 2:537b8388dc6a 487 main_menu();
wuchyi 2:537b8388dc6a 488 gameTimer1.detach();
wuchyi 2:537b8388dc6a 489 gameTimer2.detach();
wuchyi 2:537b8388dc6a 490 butt1_flag = 0;
wuchyi 2:537b8388dc6a 491 }
wuchyi 2:537b8388dc6a 492
wuchyi 2:537b8388dc6a 493 } else { /// if file exists
wuchyi 2:537b8388dc6a 494 rewind(fp);
wuchyi 2:537b8388dc6a 495 int o; ///index of file, just for counter
wuchyi 2:537b8388dc6a 496 while (fscanf(fp, "%d, %d \n", &level_array[o],&HiScoreTable[o]) != EOF) { //read file data into array
wuchyi 2:537b8388dc6a 497 o++;
wuchyi 2:537b8388dc6a 498 }
wuchyi 2:537b8388dc6a 499
wuchyi 2:537b8388dc6a 500 if (score > HiScoreTable[(level - 1)]) { ///if current score is higher than HiScore(current level)
wuchyi 2:537b8388dc6a 501 lcd.printString("New Highscore!",0,4);
wuchyi 2:537b8388dc6a 502
wuchyi 2:537b8388dc6a 503 HiScoreTable[(level - 1)] = score; ///save high score in table
wuchyi 2:537b8388dc6a 504 }
wuchyi 2:537b8388dc6a 505
wuchyi 2:537b8388dc6a 506
wuchyi 2:537b8388dc6a 507 fp = fopen("/sd/hiscore.txt","w"); /// overwrite score file
wuchyi 2:537b8388dc6a 508 for (int b = 0; b < 5; b++) { ///write table to SD file
wuchyi 2:537b8388dc6a 509 fprintf(fp, "%d,%d \n",b,HiScoreTable[b]);
wuchyi 2:537b8388dc6a 510 fclose(fp);
wuchyi 2:537b8388dc6a 511 sleep();
wuchyi 2:537b8388dc6a 512 }
wuchyi 2:537b8388dc6a 513
wuchyi 2:537b8388dc6a 514 if (butt2_flag == 1) {
wuchyi 2:537b8388dc6a 515 butt2_flag = 0;
wuchyi 2:537b8388dc6a 516 main_menu();
wuchyi 2:537b8388dc6a 517 gameTimer1.detach();
wuchyi 2:537b8388dc6a 518 gameTimer2.detach();
wuchyi 2:537b8388dc6a 519 butt1_flag = 0;
wuchyi 1:06958b7bbf65 520 }
wuchyi 1:06958b7bbf65 521 }
wuchyi 2:537b8388dc6a 522
wuchyi 2:537b8388dc6a 523 }
wuchyi 2:537b8388dc6a 524 }
wuchyi 2:537b8388dc6a 525
wuchyi 2:537b8388dc6a 526 void gamePaused_screen()
wuchyi 2:537b8388dc6a 527 {
wuchyi 2:537b8388dc6a 528 while(butt2_flag == 0) {
wuchyi 2:537b8388dc6a 529 gameTimer1.detach();
wuchyi 2:537b8388dc6a 530 gameTimer2.detach();
wuchyi 2:537b8388dc6a 531 LED = 1; /// toggle LED to show game is paused
wuchyi 2:537b8388dc6a 532 butt2_flag = 0;
wuchyi 2:537b8388dc6a 533 lcd.drawRect (4,4,74,38,2);
wuchyi 2:537b8388dc6a 534 lcd.drawRect (4,4,74,38,0);
wuchyi 2:537b8388dc6a 535 lcd.printString ("Game Paused",8,1);
wuchyi 2:537b8388dc6a 536 lcd.printString ("Press button",6,3);
wuchyi 2:537b8388dc6a 537 lcd.printString ("to unpause.",9,4);
wuchyi 2:537b8388dc6a 538 sleep();
wuchyi 2:537b8388dc6a 539 }
wuchyi 2:537b8388dc6a 540 if (butt2_flag == 1) {
wuchyi 2:537b8388dc6a 541 butt2_flag = 0;
wuchyi 2:537b8388dc6a 542 lcd.clear();
wuchyi 2:537b8388dc6a 543 draw_screen();
wuchyi 2:537b8388dc6a 544 wait(0.5);
wuchyi 2:537b8388dc6a 545 gameTimer1.attach(&snake_logic_1,(levelcalc));
wuchyi 2:537b8388dc6a 546 gameTimer2.attach(&draw_screen, 0.1);
wuchyi 2:537b8388dc6a 547 LED = 0;
wuchyi 1:06958b7bbf65 548 }
wuchyi 0:1719e11ef162 549
wuchyi 2:537b8388dc6a 550 }
wuchyi 0:1719e11ef162 551
wuchyi 0:1719e11ef162 552
wuchyi 2:537b8388dc6a 553 void butt1_isr()
wuchyi 2:537b8388dc6a 554 {
wuchyi 2:537b8388dc6a 555 butt1_flag = 1;
wuchyi 2:537b8388dc6a 556 }
wuchyi 2:537b8388dc6a 557
wuchyi 2:537b8388dc6a 558 void butt2_isr()
wuchyi 2:537b8388dc6a 559 {
wuchyi 2:537b8388dc6a 560 butt2_flag = 1;
wuchyi 2:537b8388dc6a 561 }