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