ELEC2645 Embedded Systems Project (JOYSTICK)
Dependencies: N5110 SDFileSystem mbed
main.cpp@4:f17082a43006, 2016-05-07 (annotated)
- 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?
User | Revision | Line number | New 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 | } |