ELEC2645 Embedded Systems Project (JOYSTICK)

Dependencies:   N5110 SDFileSystem mbed

Committer:
wuchyi
Date:
Sat May 07 14:45:02 2016 +0000
Revision:
4:f17082a43006
Parent:
2:537b8388dc6a
updated documentation

Who changed what in which revision?

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