My ELEC2645 project. Nikollao Sulollari. 200804685

Dependencies:   N5110 SoftPWM mbed

Fork of Treasure_Hunt by ELEC2645 (2015/16)

Committer:
Nikollao
Date:
Mon May 02 17:57:27 2016 +0000
Revision:
20:59aa6189a47d
Parent:
19:70d40dac5ae0
Child:
21:6b02ef341358
levels finished, need to finish buzzer and  button weapon! :)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nikollao 5:ffa498d7071f 1 /**
Nikollao 5:ffa498d7071f 2 @file main.cpp
Nikollao 5:ffa498d7071f 3 @brief Game implementation
Nikollao 4:f31bdc212241 4
Nikollao 5:ffa498d7071f 5 */
Nikollao 5:ffa498d7071f 6 #include "main.h"
Nikollao 0:2d0f77943105 7 #include "stdlib.h"
Nikollao 2:af5b5d42e835 8
Nikollao 20:59aa6189a47d 9 int main(void)
Nikollao 0:2d0f77943105 10 {
Nikollao 20:59aa6189a47d 11 lcd.init(); ///initialise LED
Nikollao 6:c11bb31a06b3 12 init_K64F();
Nikollao 6:c11bb31a06b3 13 init_serial();
Nikollao 16:a6ca6858af24 14 init_game(); ///initialize game
Nikollao 17:2d424db3975f 15 led_output = fsm[fsm_state];
Nikollao 5:ffa498d7071f 16 calibrateJoystick(); ///calibrate joystick
Nikollao 14:91ae0afe9037 17 button.rise(&button_isr); ///assign rise with ISR
Nikollao 14:91ae0afe9037 18 button1.rise(&button1_isr);
Nikollao 18:5405ee7e243b 19
Nikollao 20:59aa6189a47d 20 game_ticker.attach(&game_timer_isr,0.2); ///attach ticker for the menu different from the main ticker
Nikollao 15:c7af2ea5f164 21 menu();
Nikollao 16:a6ca6858af24 22 game_ticker.detach();
Nikollao 20:59aa6189a47d 23 //timer.start();
Nikollao 18:5405ee7e243b 24
Nikollao 20:59aa6189a47d 25 ticker.attach(&timer_isr,game_speed); ///attach ticker with ISR. Speed is selected by the user
Nikollao 5:ffa498d7071f 26 reset = level; ///set reset = level to check later if level has increased
Nikollao 18:5405ee7e243b 27
Nikollao 0:2d0f77943105 28 while (1) {
Nikollao 0:2d0f77943105 29
Nikollao 20:59aa6189a47d 30 if (g_timer_flag) {///if timer flag is UP
Nikollao 0:2d0f77943105 31
Nikollao 6:c11bb31a06b3 32 g_timer_flag = 0; ///reset flag
Nikollao 20:59aa6189a47d 33 //g_button_flag = 0;
Nikollao 0:2d0f77943105 34 lcd.clear();
Nikollao 20:59aa6189a47d 35 guidance(); ///get guidance
Nikollao 20:59aa6189a47d 36 hero(); ///call hero
Nikollao 20:59aa6189a47d 37 enemies(); ///generate enemies
Nikollao 20:59aa6189a47d 38 obstacles(); ///generate obstacles
Nikollao 20:59aa6189a47d 39 if (g_button1_flag) { ///if heavy weapon button is pressed
Nikollao 20:59aa6189a47d 40
Nikollao 20:59aa6189a47d 41 g_button1_flag = 0;
Nikollao 20:59aa6189a47d 42 rectY = 60; ///remove enemies from field
Nikollao 20:59aa6189a47d 43 rectX = -10;
Nikollao 20:59aa6189a47d 44 circleX = -10;
Nikollao 20:59aa6189a47d 45 circleY = 100;
Nikollao 20:59aa6189a47d 46 //timer.reset();
Nikollao 20:59aa6189a47d 47 //timer.start();
Nikollao 20:59aa6189a47d 48 }
Nikollao 20:59aa6189a47d 49 //float count_time = timer.read();
Nikollao 5:ffa498d7071f 50 if (reset < level) { ///if level has increased
Nikollao 6:c11bb31a06b3 51 reset = level; ///update reset
Nikollao 20:59aa6189a47d 52 rectY = 0; ///remove enemies from field
Nikollao 20:59aa6189a47d 53 circleX = 0;
Nikollao 0:2d0f77943105 54 }
Nikollao 20:59aa6189a47d 55 if (g_button1_flag) { ///if heavy weapon button is pressed
Nikollao 20:59aa6189a47d 56
Nikollao 20:59aa6189a47d 57 g_button1_flag = 0;
Nikollao 20:59aa6189a47d 58 rectY = 60; ///remove enemies from field
Nikollao 20:59aa6189a47d 59 rectX = -10;
Nikollao 20:59aa6189a47d 60 circleX = -10;
Nikollao 20:59aa6189a47d 61 circleY = 100;
Nikollao 20:59aa6189a47d 62 //timer.reset();
Nikollao 20:59aa6189a47d 63 //timer.start();
Nikollao 20:59aa6189a47d 64 }
Nikollao 20:59aa6189a47d 65 checkOverlap(); ///check is hero has overlapped with enemies or obstacles
Nikollao 16:a6ca6858af24 66 updateJoystick();
Nikollao 16:a6ca6858af24 67 lcd.refresh();
Nikollao 0:2d0f77943105 68 }
Nikollao 20:59aa6189a47d 69 sleep();///use sleep and timer triggered interrupt to save power
Nikollao 0:2d0f77943105 70 }
Nikollao 0:2d0f77943105 71 }
Nikollao 0:2d0f77943105 72
Nikollao 20:59aa6189a47d 73
Nikollao 20:59aa6189a47d 74
Nikollao 20:59aa6189a47d 75
Nikollao 20:59aa6189a47d 76
Nikollao 20:59aa6189a47d 77
Nikollao 20:59aa6189a47d 78
Nikollao 0:2d0f77943105 79 void init_serial()
Nikollao 0:2d0f77943105 80 {
Nikollao 0:2d0f77943105 81 // set to highest baud - ensure terminal software matches
Nikollao 0:2d0f77943105 82 pc.baud(115200);
Nikollao 0:2d0f77943105 83 }
Nikollao 0:2d0f77943105 84
Nikollao 0:2d0f77943105 85 void init_K64F()
Nikollao 0:2d0f77943105 86 {
Nikollao 0:2d0f77943105 87 // on-board LEDs are active-low, so set pin high to turn them off.
Nikollao 0:2d0f77943105 88 r_led = 1;
Nikollao 0:2d0f77943105 89 g_led = 1;
Nikollao 0:2d0f77943105 90 b_led = 1;
Nikollao 18:5405ee7e243b 91
Nikollao 15:c7af2ea5f164 92 blue_led = 1;
Nikollao 0:2d0f77943105 93
Nikollao 0:2d0f77943105 94 // since the on-board switches have external pull-ups, we should disable the internal pull-down
Nikollao 0:2d0f77943105 95 // resistors that are enabled by default using InterruptIn
Nikollao 0:2d0f77943105 96 sw2.mode(PullNone);
Nikollao 0:2d0f77943105 97 sw3.mode(PullNone);
Nikollao 11:53caf3d944a9 98 button.mode(PullDown);
Nikollao 11:53caf3d944a9 99 button1.mode(PullDown);
Nikollao 0:2d0f77943105 100 }
Nikollao 0:2d0f77943105 101
Nikollao 20:59aa6189a47d 102
Nikollao 20:59aa6189a47d 103 ///ISR functions
Nikollao 0:2d0f77943105 104 void timer_isr ()
Nikollao 0:2d0f77943105 105 {
Nikollao 0:2d0f77943105 106 g_timer_flag = 1;
Nikollao 0:2d0f77943105 107 }
Nikollao 0:2d0f77943105 108
Nikollao 0:2d0f77943105 109 void game_timer_isr()
Nikollao 0:2d0f77943105 110 {
Nikollao 0:2d0f77943105 111 g_game_timer_flag = 1;
Nikollao 0:2d0f77943105 112 }
Nikollao 0:2d0f77943105 113
Nikollao 0:2d0f77943105 114 void sw2_isr()
Nikollao 0:2d0f77943105 115 {
Nikollao 0:2d0f77943105 116 g_sw2_flag = 1;
Nikollao 0:2d0f77943105 117 }
Nikollao 0:2d0f77943105 118
Nikollao 4:f31bdc212241 119 void sw3_isr()
Nikollao 4:f31bdc212241 120 {
Nikollao 1:12803d645d32 121 g_sw3_flag = 1;
Nikollao 1:12803d645d32 122 }
Nikollao 1:12803d645d32 123
Nikollao 1:12803d645d32 124 void button_isr()
Nikollao 1:12803d645d32 125 {
Nikollao 1:12803d645d32 126 g_button_flag =1;
Nikollao 1:12803d645d32 127 }
Nikollao 1:12803d645d32 128
Nikollao 18:5405ee7e243b 129 void button1_isr()
Nikollao 18:5405ee7e243b 130 {
Nikollao 18:5405ee7e243b 131
Nikollao 11:53caf3d944a9 132 g_button1_flag =1;
Nikollao 11:53caf3d944a9 133 }
Nikollao 11:53caf3d944a9 134
Nikollao 1:12803d645d32 135 void timeout_isr()
Nikollao 1:12803d645d32 136 {
Nikollao 1:12803d645d32 137 if (button) {
Nikollao 16:a6ca6858af24 138 pc.printf("timeout \n");
Nikollao 1:12803d645d32 139 }
Nikollao 16:a6ca6858af24 140 }
Nikollao 18:5405ee7e243b 141
Nikollao 20:59aa6189a47d 142 ///game functions
Nikollao 20:59aa6189a47d 143
Nikollao 18:5405ee7e243b 144 void enemies()
Nikollao 18:5405ee7e243b 145 {
Nikollao 20:59aa6189a47d 146 /// generate enemies in the screen depending on the level of difficulty
Nikollao 18:5405ee7e243b 147 if (level == 0) {
Nikollao 18:5405ee7e243b 148
Nikollao 18:5405ee7e243b 149 enemyRect();
Nikollao 19:70d40dac5ae0 150 enemyCircle();
Nikollao 18:5405ee7e243b 151 } else if (level == 1) {
Nikollao 18:5405ee7e243b 152
Nikollao 18:5405ee7e243b 153 enemyRect();
Nikollao 19:70d40dac5ae0 154 enemyCircle();
Nikollao 18:5405ee7e243b 155 } else if (level == 2) {
Nikollao 19:70d40dac5ae0 156
Nikollao 19:70d40dac5ae0 157 enemyRocket();
Nikollao 18:5405ee7e243b 158 } else if (level == 3) {
Nikollao 19:70d40dac5ae0 159
Nikollao 19:70d40dac5ae0 160 enemyRect();
Nikollao 19:70d40dac5ae0 161 enemyCircle();
Nikollao 19:70d40dac5ae0 162 } else if (level == 4) {
Nikollao 19:70d40dac5ae0 163
Nikollao 19:70d40dac5ae0 164 enemyRect();
Nikollao 19:70d40dac5ae0 165 enemyCircle();
Nikollao 19:70d40dac5ae0 166 } else if (level == 5) {
Nikollao 19:70d40dac5ae0 167 enemyRocket();
Nikollao 19:70d40dac5ae0 168 } else if (level == 6) {
Nikollao 19:70d40dac5ae0 169 enemyRocket();
Nikollao 19:70d40dac5ae0 170 enemyCircle();
Nikollao 18:5405ee7e243b 171 }
Nikollao 19:70d40dac5ae0 172 else if (level == 7) {
Nikollao 20:59aa6189a47d 173 enemyRocket();
Nikollao 20:59aa6189a47d 174 enemyCircle();
Nikollao 19:70d40dac5ae0 175 }
Nikollao 18:5405ee7e243b 176 }
Nikollao 18:5405ee7e243b 177
Nikollao 18:5405ee7e243b 178 void enemyRect()
Nikollao 18:5405ee7e243b 179 {
Nikollao 18:5405ee7e243b 180 ///generate rect shape enemy
Nikollao 18:5405ee7e243b 181 lcd.drawRect(rectX,rectY,5,4,1);
Nikollao 20:59aa6189a47d 182 if (g_button1_flag == 0) {
Nikollao 20:59aa6189a47d 183 rectX = rectX + rand()%4 - 2;
Nikollao 20:59aa6189a47d 184 rectY++; ///enemy moving towards hero
Nikollao 20:59aa6189a47d 185
Nikollao 20:59aa6189a47d 186 if (rectY > 50) {
Nikollao 20:59aa6189a47d 187 rectY = 0;
Nikollao 20:59aa6189a47d 188 }
Nikollao 20:59aa6189a47d 189 if (rectX > 75 || rectX < 25) {
Nikollao 20:59aa6189a47d 190 rectX = 40+rand()%6 - 3;
Nikollao 20:59aa6189a47d 191 }
Nikollao 18:5405ee7e243b 192 }
Nikollao 18:5405ee7e243b 193 }
Nikollao 18:5405ee7e243b 194
Nikollao 19:70d40dac5ae0 195 void enemyRocket() {
Nikollao 19:70d40dac5ae0 196
Nikollao 19:70d40dac5ae0 197 lcd.drawRect(rectX,rectY,2,7,1);
Nikollao 19:70d40dac5ae0 198 lcd.drawCircle(rectX+1,rectY+1,2,1);
Nikollao 19:70d40dac5ae0 199 lcd.drawLine(rectX-2,rectY+2,rectX,rectY-1,1);
Nikollao 19:70d40dac5ae0 200 lcd.drawLine(rectX+2,rectY+2,rectX,rectY-1,1);
Nikollao 19:70d40dac5ae0 201
Nikollao 20:59aa6189a47d 202 if (g_button1_flag == 0) {
Nikollao 20:59aa6189a47d 203 rectX = rectX + rand()%4 - 2;
Nikollao 20:59aa6189a47d 204 rectY++; ///enemy moving towards hero
Nikollao 20:59aa6189a47d 205
Nikollao 20:59aa6189a47d 206 if (rectY > 50) {
Nikollao 20:59aa6189a47d 207 rectY = 0;
Nikollao 20:59aa6189a47d 208 }
Nikollao 20:59aa6189a47d 209 if (rectX > 75 || rectX < 10) {
Nikollao 20:59aa6189a47d 210 rectX = 40+rand()%6 - 3;
Nikollao 20:59aa6189a47d 211 }
Nikollao 19:70d40dac5ae0 212 }
Nikollao 19:70d40dac5ae0 213 }
Nikollao 18:5405ee7e243b 214 void hero()
Nikollao 18:5405ee7e243b 215 {
Nikollao 18:5405ee7e243b 216 ///cotrol hero
Nikollao 18:5405ee7e243b 217 if (joystick.direction == RIGHT) {
Nikollao 18:5405ee7e243b 218 heroX--;
Nikollao 18:5405ee7e243b 219 } else if (joystick.direction == LEFT) {
Nikollao 18:5405ee7e243b 220 heroX++;
Nikollao 18:5405ee7e243b 221 } else {
Nikollao 18:5405ee7e243b 222 heroX = heroX;
Nikollao 18:5405ee7e243b 223 }
Nikollao 18:5405ee7e243b 224
Nikollao 18:5405ee7e243b 225 if (joystick.direction == UP) {
Nikollao 18:5405ee7e243b 226 heroY--;
Nikollao 18:5405ee7e243b 227 } else if (joystick.direction == DOWN) {
Nikollao 18:5405ee7e243b 228 heroY++;
Nikollao 18:5405ee7e243b 229 } else {
Nikollao 18:5405ee7e243b 230 heroY = heroY;
Nikollao 18:5405ee7e243b 231 }
Nikollao 18:5405ee7e243b 232
Nikollao 18:5405ee7e243b 233 if (joystick.direction == UP_LEFT) {
Nikollao 18:5405ee7e243b 234 heroY--;
Nikollao 18:5405ee7e243b 235 heroX++;
Nikollao 18:5405ee7e243b 236 } else if (joystick.direction == UP_RIGHT) {
Nikollao 18:5405ee7e243b 237 heroY--;
Nikollao 18:5405ee7e243b 238 heroX--;
Nikollao 18:5405ee7e243b 239 } else if (joystick.direction == DOWN_RIGHT) {
Nikollao 18:5405ee7e243b 240 heroY++;
Nikollao 18:5405ee7e243b 241 heroX--;
Nikollao 18:5405ee7e243b 242 } else if (joystick.direction == DOWN_LEFT) {
Nikollao 18:5405ee7e243b 243 heroY++;
Nikollao 18:5405ee7e243b 244 heroX++;
Nikollao 18:5405ee7e243b 245 }
Nikollao 18:5405ee7e243b 246
Nikollao 18:5405ee7e243b 247 ///set x-axis boundaries so hero does not go out of screen
Nikollao 18:5405ee7e243b 248 if (heroX > 40) {
Nikollao 18:5405ee7e243b 249 heroX = -40;
Nikollao 18:5405ee7e243b 250 }
Nikollao 18:5405ee7e243b 251 if (heroX < -45) {
Nikollao 18:5405ee7e243b 252 heroX = 35;
Nikollao 18:5405ee7e243b 253 }
Nikollao 18:5405ee7e243b 254 if (heroY < -45) { ///if hero has reached the top of the screen
Nikollao 18:5405ee7e243b 255 heroY = 0; ///hero goes back to the bottom of the screen
Nikollao 18:5405ee7e243b 256 level++; ///level increases by 1
Nikollao 18:5405ee7e243b 257 }
Nikollao 18:5405ee7e243b 258
Nikollao 18:5405ee7e243b 259 if (heroY >= 0) {/// hero cannot go to previous level
Nikollao 18:5405ee7e243b 260 heroY = 0;
Nikollao 18:5405ee7e243b 261 }
Nikollao 18:5405ee7e243b 262 ///draw hero
Nikollao 18:5405ee7e243b 263 lcd.drawLine(40+heroX, 47+heroY, 48+heroX, 43+heroY,1);
Nikollao 18:5405ee7e243b 264 lcd.drawLine(40+heroX, 43+heroY,48+heroX, 47+heroY,1);
Nikollao 18:5405ee7e243b 265 lcd.drawLine(44+heroX, 45+heroY,44+heroX, 41+heroY,1);
Nikollao 18:5405ee7e243b 266 lcd.drawCircle(44+heroX, 39+heroY,2,0);
Nikollao 18:5405ee7e243b 267 }
Nikollao 18:5405ee7e243b 268
Nikollao 18:5405ee7e243b 269 void enemyCircle()
Nikollao 18:5405ee7e243b 270 {
Nikollao 18:5405ee7e243b 271 ///generate circle shape enemy
Nikollao 18:5405ee7e243b 272 lcd.drawCircle(circleX,circleY,4,1);
Nikollao 18:5405ee7e243b 273 circleY = circleY + rand() %4 - 2;
Nikollao 18:5405ee7e243b 274
Nikollao 20:59aa6189a47d 275 if (g_button1_flag == 0) {
Nikollao 20:59aa6189a47d 276 if (circleY <= 10) {
Nikollao 20:59aa6189a47d 277 circleY = 20;
Nikollao 20:59aa6189a47d 278 }
Nikollao 20:59aa6189a47d 279 if (circleY >= 35) {
Nikollao 20:59aa6189a47d 280 circleY = 35;
Nikollao 20:59aa6189a47d 281 }
Nikollao 20:59aa6189a47d 282 if (circleX > 84) {
Nikollao 20:59aa6189a47d 283 circleX = 0;
Nikollao 20:59aa6189a47d 284 }
Nikollao 20:59aa6189a47d 285 circleX++; ///enemy moving towards hero
Nikollao 18:5405ee7e243b 286 }
Nikollao 18:5405ee7e243b 287 }
Nikollao 18:5405ee7e243b 288
Nikollao 18:5405ee7e243b 289 void init_game()
Nikollao 18:5405ee7e243b 290 {
Nikollao 18:5405ee7e243b 291 ///initialise game
Nikollao 18:5405ee7e243b 292 srand(time(NULL)); /// generate random numbers
Nikollao 18:5405ee7e243b 293 rectY = 0; /// init rectX, rectY
Nikollao 18:5405ee7e243b 294 rectX = rand() %40 + 20;
Nikollao 18:5405ee7e243b 295 circleY = rand() %20 + 10; /// init circleX, circleY
Nikollao 18:5405ee7e243b 296 circleX = 0;
Nikollao 18:5405ee7e243b 297
Nikollao 18:5405ee7e243b 298 lcd.setBrightness(0.5); // put LED backlight on 50%
Nikollao 18:5405ee7e243b 299 lcd.printString("Welcome to",11,1);
Nikollao 18:5405ee7e243b 300 lcd.printString("Treasure Hunt!",1,3);
Nikollao 18:5405ee7e243b 301 lcd.refresh();
Nikollao 18:5405ee7e243b 302 //timeout.attach(&timeout_isr,3);
Nikollao 18:5405ee7e243b 303 //sleep();
Nikollao 18:5405ee7e243b 304 wait(3);
Nikollao 18:5405ee7e243b 305 lcd.clear();
Nikollao 18:5405ee7e243b 306
Nikollao 18:5405ee7e243b 307 }
Nikollao 18:5405ee7e243b 308 void guidance()
Nikollao 18:5405ee7e243b 309 {
Nikollao 18:5405ee7e243b 310 /// show arrow to act as guidance towards the treasure
Nikollao 18:5405ee7e243b 311 if (level < 7) { ///check level of difficulty
Nikollao 18:5405ee7e243b 312
Nikollao 18:5405ee7e243b 313 lcd.drawLine(42,0,42,4,1);
Nikollao 18:5405ee7e243b 314 lcd.drawLine(42,0,40,2,1);
Nikollao 18:5405ee7e243b 315 lcd.drawLine(42,0,44,2,1);
Nikollao 18:5405ee7e243b 316 } else if (level == 7) {
Nikollao 18:5405ee7e243b 317
Nikollao 18:5405ee7e243b 318 lcd.printString("F",42,0); /// print the treasure icon
Nikollao 18:5405ee7e243b 319 } else if (level == 8) {
Nikollao 18:5405ee7e243b 320
Nikollao 18:5405ee7e243b 321 ticker.detach();
Nikollao 19:70d40dac5ae0 322 game_ticker.attach(&game_timer_isr,0.2);
Nikollao 18:5405ee7e243b 323 lcd.clear();
Nikollao 18:5405ee7e243b 324 lcd.printString("Well done!",0,0);
Nikollao 18:5405ee7e243b 325 lcd.refresh();
Nikollao 18:5405ee7e243b 326 wait(2);
Nikollao 18:5405ee7e243b 327 lcd.clear();
Nikollao 20:59aa6189a47d 328 lcd.printString("You 're a WINNER!",0,0);
Nikollao 20:59aa6189a47d 329 wait(2);
Nikollao 20:59aa6189a47d 330 lcd.clear();
Nikollao 19:70d40dac5ae0 331 lcd.printString("Play again!",0,0);
Nikollao 18:5405ee7e243b 332 lcd.drawCircle(70,4,2,1);
Nikollao 18:5405ee7e243b 333 lcd.refresh();
Nikollao 18:5405ee7e243b 334 g_button_flag = 0;
Nikollao 18:5405ee7e243b 335
Nikollao 18:5405ee7e243b 336 while(1) {
Nikollao 19:70d40dac5ae0 337 if (g_button1_flag) {
Nikollao 18:5405ee7e243b 338
Nikollao 19:70d40dac5ae0 339 g_button1_flag = 0;
Nikollao 18:5405ee7e243b 340 level = 0;
Nikollao 18:5405ee7e243b 341 lcd.clear();
Nikollao 18:5405ee7e243b 342 main();
Nikollao 18:5405ee7e243b 343 r_led = 0;
Nikollao 18:5405ee7e243b 344 lcd.refresh();
Nikollao 18:5405ee7e243b 345 }
Nikollao 18:5405ee7e243b 346 sleep();
Nikollao 18:5405ee7e243b 347 }
Nikollao 18:5405ee7e243b 348 }
Nikollao 18:5405ee7e243b 349 }
Nikollao 18:5405ee7e243b 350
Nikollao 18:5405ee7e243b 351 void obstacles()
Nikollao 18:5405ee7e243b 352 {
Nikollao 18:5405ee7e243b 353 /// place obstacles in the screen
Nikollao 18:5405ee7e243b 354 /// as level difficulty increases, more obstacles are added
Nikollao 18:5405ee7e243b 355 if (level == 0) {
Nikollao 18:5405ee7e243b 356
Nikollao 18:5405ee7e243b 357 lcd.drawRect(10,15,2,2,1);
Nikollao 18:5405ee7e243b 358 lcd.drawRect(74,15,2,2,1);
Nikollao 19:70d40dac5ae0 359 } else if (level == 1) {
Nikollao 18:5405ee7e243b 360
Nikollao 18:5405ee7e243b 361 lcd.drawRect(10,15,2,2,1);
Nikollao 18:5405ee7e243b 362 lcd.drawRect(74,15,2,2,1);
Nikollao 18:5405ee7e243b 363 lcd.drawRect(10,28,2,2,1);
Nikollao 18:5405ee7e243b 364 lcd.drawRect(74,28,2,2,1);
Nikollao 19:70d40dac5ae0 365 } else if (level == 2) {
Nikollao 19:70d40dac5ae0 366
Nikollao 19:70d40dac5ae0 367 lcd.drawCircle(37,25,5,0);
Nikollao 19:70d40dac5ae0 368 lcd.drawCircle(47,25,5,0);
Nikollao 19:70d40dac5ae0 369 lcd.drawCircle(42,11,3,1);
Nikollao 19:70d40dac5ae0 370 lcd.drawCircle(37,25,3,1);
Nikollao 19:70d40dac5ae0 371 lcd.drawCircle(47,25,3,1);
Nikollao 19:70d40dac5ae0 372 lcd.drawRect(80,2,2,42,1);
Nikollao 19:70d40dac5ae0 373 lcd.drawRect(2,2,2,42,1);
Nikollao 19:70d40dac5ae0 374
Nikollao 18:5405ee7e243b 375 } else if (level == 3) {
Nikollao 18:5405ee7e243b 376
Nikollao 18:5405ee7e243b 377 lcd.drawRect(5,12,2,2,1);
Nikollao 18:5405ee7e243b 378 lcd.drawRect(79,12,2,2,1);
Nikollao 18:5405ee7e243b 379 lcd.drawRect(5,30,2,2,1);
Nikollao 18:5405ee7e243b 380 lcd.drawRect(79,30,2,2,1);
Nikollao 18:5405ee7e243b 381 lcd.drawRect(28,12,2,2,1);
Nikollao 18:5405ee7e243b 382 lcd.drawRect(52,12,2,2,1);
Nikollao 18:5405ee7e243b 383 lcd.drawRect(28,30,2,2,1);
Nikollao 18:5405ee7e243b 384 lcd.drawRect(52,30,2,2,1);
Nikollao 18:5405ee7e243b 385 } else if (level == 4) {
Nikollao 18:5405ee7e243b 386
Nikollao 19:70d40dac5ae0 387 lcd.drawRect(5+rand() %4 - 2 ,12+rand() %4 - 2,2,2,1);
Nikollao 18:5405ee7e243b 388 lcd.drawRect(79 + rand() %4 - 2,12 + rand() %4 - 2,2,2,1);
Nikollao 19:70d40dac5ae0 389 lcd.drawRect(5+ rand() %4 - 2,30+rand() %4 - 2 ,2,2,1);
Nikollao 19:70d40dac5ae0 390 lcd.drawRect(79 + rand() %4 - 2,30+rand() %4 - 2,2,2,1);
Nikollao 18:5405ee7e243b 391 lcd.drawRect(28 + rand() %4 - 2,12+ rand() %4,2,2,1);
Nikollao 19:70d40dac5ae0 392 lcd.drawRect(52+rand() %4 - 2,12 + rand() %4 - 2,2,2,1);
Nikollao 19:70d40dac5ae0 393 lcd.drawRect(28+rand() %4 - 2,30 + rand() %4 - 2,2,2,1);
Nikollao 19:70d40dac5ae0 394 lcd.drawRect(52 + rand() %4 - 2,30+ rand() %4,2,2,1);
Nikollao 18:5405ee7e243b 395 }
Nikollao 18:5405ee7e243b 396 if (objectX == 0) { ///check position of obstacle
Nikollao 18:5405ee7e243b 397 state = 0; ///assign states to the position of the obstacle
Nikollao 18:5405ee7e243b 398 } else if (objectX == 60) {
Nikollao 18:5405ee7e243b 399 state = 1;
Nikollao 18:5405ee7e243b 400 } else {
Nikollao 18:5405ee7e243b 401 state = state;
Nikollao 18:5405ee7e243b 402 }
Nikollao 18:5405ee7e243b 403 if (state == 0) { ///if state is 0 increase position on x-axis
Nikollao 18:5405ee7e243b 404 objectX++;
Nikollao 18:5405ee7e243b 405 } else {
Nikollao 18:5405ee7e243b 406 objectX--; ///else if state is 1 decrease position on x-axis
Nikollao 18:5405ee7e243b 407 }
Nikollao 18:5405ee7e243b 408
Nikollao 18:5405ee7e243b 409 if (objectX1 == 68) {
Nikollao 18:5405ee7e243b 410
Nikollao 18:5405ee7e243b 411 state1 = 1;
Nikollao 18:5405ee7e243b 412 } else if (objectX1 == 10) {
Nikollao 18:5405ee7e243b 413 state1 = 0;
Nikollao 18:5405ee7e243b 414 }
Nikollao 18:5405ee7e243b 415 if (state1 == 1) {
Nikollao 18:5405ee7e243b 416 objectX1--;
Nikollao 18:5405ee7e243b 417 } else if (state1 == 0) {
Nikollao 18:5405ee7e243b 418 objectX1++;
Nikollao 18:5405ee7e243b 419 }
Nikollao 18:5405ee7e243b 420 objectY = objectY + rand() %4 - 2; ///set poistion of obstacle on y-axis to be valuable
Nikollao 18:5405ee7e243b 421 ///keep moving object within boundaries
Nikollao 18:5405ee7e243b 422 if (objectY <= 10) {
Nikollao 18:5405ee7e243b 423 objectY = 10;
Nikollao 18:5405ee7e243b 424 }
Nikollao 18:5405ee7e243b 425 if (objectY >= 37) {
Nikollao 18:5405ee7e243b 426 objectY = 37;
Nikollao 18:5405ee7e243b 427 }
Nikollao 18:5405ee7e243b 428 if ( level == 5) {
Nikollao 18:5405ee7e243b 429
Nikollao 18:5405ee7e243b 430 lcd.drawLine(15,10,15,37,1);
Nikollao 18:5405ee7e243b 431 lcd.drawLine(71,10,71,37,1);
Nikollao 18:5405ee7e243b 432
Nikollao 18:5405ee7e243b 433 lcd.drawRect(11+objectX,objectY,2,2,1); ///draw obstacle
Nikollao 18:5405ee7e243b 434
Nikollao 18:5405ee7e243b 435 lcd.drawRect(80,10,2,2,1);
Nikollao 18:5405ee7e243b 436 lcd.drawRect(5,10,2,2,1);
Nikollao 18:5405ee7e243b 437 lcd.drawRect(80,20,2,2,1);
Nikollao 18:5405ee7e243b 438 lcd.drawRect(5,20,2,2,1);
Nikollao 18:5405ee7e243b 439 lcd.drawRect(80,30,2,2,1);
Nikollao 18:5405ee7e243b 440 lcd.drawRect(5,30,2,2,1);
Nikollao 18:5405ee7e243b 441
Nikollao 18:5405ee7e243b 442 } else if (level == 6) {
Nikollao 18:5405ee7e243b 443
Nikollao 18:5405ee7e243b 444 lcd.drawLine(15,10,15,37,1); ///draw boundaries
Nikollao 18:5405ee7e243b 445 lcd.drawLine(71,10,71,37,1);
Nikollao 18:5405ee7e243b 446
Nikollao 18:5405ee7e243b 447 lcd.drawRect(11+objectX,objectY,2,2,1); /// draw moving obstacles on screen
Nikollao 18:5405ee7e243b 448 lcd.drawRect(objectX1,10+objectY,2,2,1);
Nikollao 18:5405ee7e243b 449 lcd.drawRect(80,10,2,2,1); ///draw stable obstacles
Nikollao 18:5405ee7e243b 450 lcd.drawRect(5,10,2,2,1);
Nikollao 18:5405ee7e243b 451 lcd.drawRect(80,20,2,2,1);
Nikollao 18:5405ee7e243b 452 lcd.drawRect(5,20,2,2,1);
Nikollao 18:5405ee7e243b 453 lcd.drawRect(80,30,2,2,1);
Nikollao 18:5405ee7e243b 454 lcd.drawRect(5,30,2,2,1);
Nikollao 18:5405ee7e243b 455 } else if (level == 7) {
Nikollao 20:59aa6189a47d 456 lcd.printString("??",65,0);
Nikollao 18:5405ee7e243b 457
Nikollao 20:59aa6189a47d 458 lcd.drawRect(1,23,82,2,1);
Nikollao 20:59aa6189a47d 459 if (button && heroX <-30) {
Nikollao 20:59aa6189a47d 460 g_button_flag = 0;
Nikollao 20:59aa6189a47d 461 heroX = -30;
Nikollao 20:59aa6189a47d 462 heroY = -30;
Nikollao 20:59aa6189a47d 463 }
Nikollao 20:59aa6189a47d 464
Nikollao 20:59aa6189a47d 465 pc.printf("x = %d , y = %d \n",heroX,heroY);
Nikollao 18:5405ee7e243b 466 }
Nikollao 18:5405ee7e243b 467 }
Nikollao 18:5405ee7e243b 468
Nikollao 18:5405ee7e243b 469
Nikollao 18:5405ee7e243b 470 void calibrateJoystick()
Nikollao 18:5405ee7e243b 471 {
Nikollao 18:5405ee7e243b 472 // must not move during calibration
Nikollao 18:5405ee7e243b 473 joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
Nikollao 18:5405ee7e243b 474 joystick.y0 = yPot;
Nikollao 18:5405ee7e243b 475 }
Nikollao 18:5405ee7e243b 476 void updateJoystick()
Nikollao 18:5405ee7e243b 477 {
Nikollao 18:5405ee7e243b 478 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
Nikollao 18:5405ee7e243b 479 joystick.x = xPot - joystick.x0;
Nikollao 18:5405ee7e243b 480 joystick.y = yPot - joystick.y0;
Nikollao 18:5405ee7e243b 481 // read button state
Nikollao 18:5405ee7e243b 482 joystick.button = button;
Nikollao 18:5405ee7e243b 483
Nikollao 18:5405ee7e243b 484 // calculate direction depending on x,y values
Nikollao 18:5405ee7e243b 485 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
Nikollao 18:5405ee7e243b 486 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
Nikollao 18:5405ee7e243b 487 joystick.direction = CENTRE;
Nikollao 18:5405ee7e243b 488 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
Nikollao 18:5405ee7e243b 489 joystick.direction = UP;
Nikollao 18:5405ee7e243b 490 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
Nikollao 18:5405ee7e243b 491 joystick.direction = DOWN;
Nikollao 18:5405ee7e243b 492 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
Nikollao 18:5405ee7e243b 493 joystick.direction = RIGHT;
Nikollao 18:5405ee7e243b 494 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
Nikollao 18:5405ee7e243b 495 joystick.direction = LEFT;
Nikollao 18:5405ee7e243b 496 } else if (joystick.y > DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE) {
Nikollao 18:5405ee7e243b 497 joystick.direction = UP_LEFT;
Nikollao 18:5405ee7e243b 498 } else if (joystick.y > DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE) {
Nikollao 18:5405ee7e243b 499 joystick.direction = UP_RIGHT;
Nikollao 18:5405ee7e243b 500 } else if (joystick.y < DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE) {
Nikollao 18:5405ee7e243b 501 joystick.direction = DOWN_LEFT;
Nikollao 18:5405ee7e243b 502 } else if (joystick.y < DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE) {
Nikollao 18:5405ee7e243b 503 joystick.direction = DOWN_RIGHT;
Nikollao 18:5405ee7e243b 504 }
Nikollao 18:5405ee7e243b 505 }
Nikollao 18:5405ee7e243b 506
Nikollao 20:59aa6189a47d 507 void menu()
Nikollao 18:5405ee7e243b 508 {
Nikollao 18:5405ee7e243b 509 while(1) {
Nikollao 18:5405ee7e243b 510 if (g_game_timer_flag) {
Nikollao 18:5405ee7e243b 511 g_game_timer_flag = 0;
Nikollao 18:5405ee7e243b 512
Nikollao 18:5405ee7e243b 513 updateJoystick();
Nikollao 18:5405ee7e243b 514 lcd.clear();
Nikollao 18:5405ee7e243b 515
Nikollao 18:5405ee7e243b 516 lcd.printString("Start Game",0,0); ///print the main
Nikollao 18:5405ee7e243b 517 lcd.printString("Settings",0,2);
Nikollao 18:5405ee7e243b 518 lcd.printString("Exit",0,4);
Nikollao 18:5405ee7e243b 519 //lcd.drawCircle(70,4,2,1);
Nikollao 19:70d40dac5ae0 520 lcd.refresh();
Nikollao 18:5405ee7e243b 521 switch (joystick.direction) { ///check the direction of joystick
Nikollao 18:5405ee7e243b 522 case UP:
Nikollao 18:5405ee7e243b 523 option--;
Nikollao 18:5405ee7e243b 524 break;
Nikollao 18:5405ee7e243b 525 case DOWN:
Nikollao 18:5405ee7e243b 526 option++;
Nikollao 18:5405ee7e243b 527 break;
Nikollao 18:5405ee7e243b 528 }
Nikollao 18:5405ee7e243b 529 if (option < 0) {
Nikollao 18:5405ee7e243b 530 option = 2;
Nikollao 18:5405ee7e243b 531 }
Nikollao 18:5405ee7e243b 532 if (option > 2) {
Nikollao 18:5405ee7e243b 533 option = 0;
Nikollao 18:5405ee7e243b 534 }
Nikollao 18:5405ee7e243b 535
Nikollao 18:5405ee7e243b 536 if (option == 0) { ///selection in menu depends on the value of int option
Nikollao 18:5405ee7e243b 537 lcd.drawCircle(70,4,2,1);
Nikollao 18:5405ee7e243b 538 } else if (option == 1) {
Nikollao 18:5405ee7e243b 539 lcd.drawCircle(55,20,2,1);
Nikollao 18:5405ee7e243b 540 } else if (option == 2) {
Nikollao 18:5405ee7e243b 541 lcd.drawCircle(35,35,2,1);
Nikollao 18:5405ee7e243b 542 }
Nikollao 18:5405ee7e243b 543
Nikollao 18:5405ee7e243b 544 if(g_button_flag) { /// if button is pressed
Nikollao 18:5405ee7e243b 545
Nikollao 18:5405ee7e243b 546 g_button_flag = 0; ///reset flag
Nikollao 18:5405ee7e243b 547
Nikollao 18:5405ee7e243b 548 if (option == 0) { ///break the while loop, start game
Nikollao 18:5405ee7e243b 549 break;
Nikollao 18:5405ee7e243b 550 }
Nikollao 18:5405ee7e243b 551
Nikollao 18:5405ee7e243b 552 else if (option == 1) { ///enter settings menu
Nikollao 18:5405ee7e243b 553
Nikollao 18:5405ee7e243b 554 option = 0;
Nikollao 18:5405ee7e243b 555
Nikollao 18:5405ee7e243b 556 while(1) {
Nikollao 18:5405ee7e243b 557 if (g_game_timer_flag) {
Nikollao 18:5405ee7e243b 558 g_game_timer_flag = 0;
Nikollao 18:5405ee7e243b 559
Nikollao 18:5405ee7e243b 560 updateJoystick(); ///update joystick position
Nikollao 18:5405ee7e243b 561 lcd.clear();
Nikollao 18:5405ee7e243b 562 if (normal) {
Nikollao 18:5405ee7e243b 563 if (sound) {
Nikollao 18:5405ee7e243b 564 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 18:5405ee7e243b 565 lcd.printString("Lcd:Inverse",0,1);
Nikollao 18:5405ee7e243b 566 lcd.printString("Sound:ON",0,2);
Nikollao 18:5405ee7e243b 567 lcd.printString("Back",0,3);
Nikollao 18:5405ee7e243b 568 } else {
Nikollao 18:5405ee7e243b 569 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 18:5405ee7e243b 570 lcd.printString("Lcd:Inverse",0,1);
Nikollao 18:5405ee7e243b 571 lcd.printString("Sound:OFF",0,2);
Nikollao 18:5405ee7e243b 572 lcd.printString("Back",0,3);
Nikollao 18:5405ee7e243b 573 }
Nikollao 18:5405ee7e243b 574 } else {
Nikollao 18:5405ee7e243b 575 if (sound) {
Nikollao 18:5405ee7e243b 576 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 20:59aa6189a47d 577 lcd.printString("Lcd:Normal",0,1);
Nikollao 20:59aa6189a47d 578 lcd.printString("Sound:ON",0,2);
Nikollao 18:5405ee7e243b 579 lcd.printString("Back",0,3);
Nikollao 18:5405ee7e243b 580 } else {
Nikollao 18:5405ee7e243b 581 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 20:59aa6189a47d 582 lcd.printString("Lcd:Normal",0,1);
Nikollao 20:59aa6189a47d 583 lcd.printString("Sound:OFF",0,2);
Nikollao 18:5405ee7e243b 584 lcd.printString("Back",0,3);
Nikollao 18:5405ee7e243b 585 }
Nikollao 18:5405ee7e243b 586 }
Nikollao 18:5405ee7e243b 587 switch (joystick.direction) {
Nikollao 18:5405ee7e243b 588 case UP:
Nikollao 18:5405ee7e243b 589 option--;
Nikollao 18:5405ee7e243b 590 break;
Nikollao 18:5405ee7e243b 591 case DOWN:
Nikollao 18:5405ee7e243b 592 option++;
Nikollao 18:5405ee7e243b 593 break;
Nikollao 18:5405ee7e243b 594 case CENTRE:
Nikollao 18:5405ee7e243b 595 option = option;
Nikollao 18:5405ee7e243b 596 break;
Nikollao 18:5405ee7e243b 597 }
Nikollao 18:5405ee7e243b 598 if (option < 0) { ///if selector is on the top of the screen and UP is pressed, selector goes to the bottom
Nikollao 18:5405ee7e243b 599 option = 3;
Nikollao 18:5405ee7e243b 600 }
Nikollao 18:5405ee7e243b 601 if (option > 3) { ///if selector is on the bottom of the screen and DOWN is pressed, selector goes to the top
Nikollao 18:5405ee7e243b 602 option = 0;
Nikollao 18:5405ee7e243b 603 }
Nikollao 18:5405ee7e243b 604
Nikollao 18:5405ee7e243b 605 /// menu selection depends on the position of the Joystick
Nikollao 18:5405ee7e243b 606 if (option == 0) {
Nikollao 18:5405ee7e243b 607 lcd.drawCircle(70,4,2,1);
Nikollao 18:5405ee7e243b 608 } else if (option == 1) {
Nikollao 18:5405ee7e243b 609 lcd.drawCircle(70,12,2,1);
Nikollao 18:5405ee7e243b 610 } else if (option == 2) {
Nikollao 18:5405ee7e243b 611 lcd.drawCircle(70,20,2,1);
Nikollao 18:5405ee7e243b 612 } else {
Nikollao 18:5405ee7e243b 613 lcd.drawCircle(35,27,2,1);
Nikollao 18:5405ee7e243b 614 }
Nikollao 18:5405ee7e243b 615 if (g_button_flag) { ///if button is pressed
Nikollao 18:5405ee7e243b 616 g_button_flag = 0; ///reset button
Nikollao 18:5405ee7e243b 617
Nikollao 18:5405ee7e243b 618 if (option == 0) { /// if user selects to modify speed of the game
Nikollao 18:5405ee7e243b 619
Nikollao 18:5405ee7e243b 620 while(1) { ///set speed of the game
Nikollao 18:5405ee7e243b 621
Nikollao 18:5405ee7e243b 622 if (g_game_timer_flag) {
Nikollao 18:5405ee7e243b 623 g_game_timer_flag = 0;
Nikollao 18:5405ee7e243b 624 updateJoystick();
Nikollao 18:5405ee7e243b 625 lcd.clear();
Nikollao 18:5405ee7e243b 626 if (speed == 0) {
Nikollao 18:5405ee7e243b 627 lcd.printString("Slow!",0,0); ///print game speed menu
Nikollao 18:5405ee7e243b 628 lcd.printString("Normal",0,1);
Nikollao 18:5405ee7e243b 629 lcd.printString("Fast",0,2);
Nikollao 18:5405ee7e243b 630 lcd.printString("Back",0,3);
Nikollao 18:5405ee7e243b 631 } else if (speed == 1) {
Nikollao 18:5405ee7e243b 632 lcd.printString("Slow",0,0); ///print game speed menu
Nikollao 18:5405ee7e243b 633 lcd.printString("Normal!",0,1);
Nikollao 18:5405ee7e243b 634 lcd.printString("Fast",0,2);
Nikollao 18:5405ee7e243b 635 lcd.printString("Back",0,3);
Nikollao 18:5405ee7e243b 636 } else if (speed == 2) {
Nikollao 18:5405ee7e243b 637 lcd.printString("Slow",0,0); ///print game speed menu
Nikollao 18:5405ee7e243b 638 lcd.printString("Normal",0,1);
Nikollao 18:5405ee7e243b 639 lcd.printString("Fast!",0,2);
Nikollao 18:5405ee7e243b 640 lcd.printString("Back",0,3);
Nikollao 18:5405ee7e243b 641 }
Nikollao 18:5405ee7e243b 642
Nikollao 18:5405ee7e243b 643 switch (joystick.direction) {
Nikollao 18:5405ee7e243b 644 case UP:
Nikollao 18:5405ee7e243b 645 option--;
Nikollao 18:5405ee7e243b 646 break;
Nikollao 18:5405ee7e243b 647 case DOWN:
Nikollao 18:5405ee7e243b 648 option++;
Nikollao 18:5405ee7e243b 649 break;
Nikollao 18:5405ee7e243b 650 case CENTRE:
Nikollao 18:5405ee7e243b 651 option = option;
Nikollao 18:5405ee7e243b 652 break;
Nikollao 18:5405ee7e243b 653 }
Nikollao 18:5405ee7e243b 654 if (option < 0) {
Nikollao 18:5405ee7e243b 655 option = 3;
Nikollao 18:5405ee7e243b 656 }
Nikollao 18:5405ee7e243b 657 if (option > 3) {
Nikollao 18:5405ee7e243b 658 option = 0;
Nikollao 18:5405ee7e243b 659 }
Nikollao 18:5405ee7e243b 660
Nikollao 18:5405ee7e243b 661 if (option == 0) {
Nikollao 18:5405ee7e243b 662 lcd.drawCircle(70,4,2,1);
Nikollao 18:5405ee7e243b 663 } else if (option == 1) {
Nikollao 18:5405ee7e243b 664 lcd.drawCircle(55,12,2,1);
Nikollao 18:5405ee7e243b 665 } else if (option == 2) {
Nikollao 18:5405ee7e243b 666 lcd.drawCircle(35,20,2,1);
Nikollao 18:5405ee7e243b 667 } else {
Nikollao 18:5405ee7e243b 668 lcd.drawCircle(35,27,2,1);
Nikollao 18:5405ee7e243b 669 }
Nikollao 18:5405ee7e243b 670
Nikollao 18:5405ee7e243b 671 if (g_button_flag) {
Nikollao 18:5405ee7e243b 672 g_button_flag = 0;
Nikollao 18:5405ee7e243b 673
Nikollao 18:5405ee7e243b 674 if (option == 0) {
Nikollao 18:5405ee7e243b 675 game_speed = 0.1;
Nikollao 18:5405ee7e243b 676 speed = 0;
Nikollao 18:5405ee7e243b 677 } else if (option == 1) {
Nikollao 18:5405ee7e243b 678 game_speed = 0.05;
Nikollao 18:5405ee7e243b 679 speed = 1;
Nikollao 18:5405ee7e243b 680 } else if (option == 2) {
Nikollao 18:5405ee7e243b 681 game_speed = 0.04;
Nikollao 18:5405ee7e243b 682 speed = 2;
Nikollao 18:5405ee7e243b 683 } else if (option == 3) {
Nikollao 18:5405ee7e243b 684 break;
Nikollao 18:5405ee7e243b 685 }
Nikollao 18:5405ee7e243b 686 }
Nikollao 18:5405ee7e243b 687 lcd.refresh();
Nikollao 18:5405ee7e243b 688 }
Nikollao 18:5405ee7e243b 689 sleep();
Nikollao 18:5405ee7e243b 690 }
Nikollao 18:5405ee7e243b 691 } else if (option == 1) { /// Lcd inverse mode
Nikollao 18:5405ee7e243b 692 normal =! normal;
Nikollao 18:5405ee7e243b 693 if (normal) {
Nikollao 18:5405ee7e243b 694 lcd.inverseMode();
Nikollao 18:5405ee7e243b 695 } else {
Nikollao 18:5405ee7e243b 696 lcd.normalMode();
Nikollao 18:5405ee7e243b 697 }
Nikollao 18:5405ee7e243b 698 } else if (option == 2) { ///select sound or not
Nikollao 18:5405ee7e243b 699
Nikollao 18:5405ee7e243b 700 sound =! sound;
Nikollao 18:5405ee7e243b 701
Nikollao 18:5405ee7e243b 702 if (sound)
Nikollao 18:5405ee7e243b 703 buzzer.write(0.5);
Nikollao 18:5405ee7e243b 704 else
Nikollao 18:5405ee7e243b 705 buzzer.write(0.0);
Nikollao 18:5405ee7e243b 706 // buzzer.period(1/400);
Nikollao 18:5405ee7e243b 707 } else if(option == 3) { ///go back to main menu
Nikollao 18:5405ee7e243b 708 break;
Nikollao 18:5405ee7e243b 709 }
Nikollao 18:5405ee7e243b 710 }
Nikollao 18:5405ee7e243b 711 lcd.refresh();
Nikollao 18:5405ee7e243b 712 }
Nikollao 18:5405ee7e243b 713 sleep();
Nikollao 18:5405ee7e243b 714 }
Nikollao 18:5405ee7e243b 715 } else if (option == 2) { ///turn off LED
Nikollao 18:5405ee7e243b 716 lcd.clear();
Nikollao 18:5405ee7e243b 717 lcd.turnOff();
Nikollao 18:5405ee7e243b 718 while(1) {
Nikollao 18:5405ee7e243b 719 deepsleep();
Nikollao 18:5405ee7e243b 720 }
Nikollao 18:5405ee7e243b 721 }
Nikollao 18:5405ee7e243b 722 }
Nikollao 18:5405ee7e243b 723 lcd.refresh();
Nikollao 18:5405ee7e243b 724 }
Nikollao 18:5405ee7e243b 725 sleep();
Nikollao 18:5405ee7e243b 726 }
Nikollao 18:5405ee7e243b 727 }
Nikollao 18:5405ee7e243b 728
Nikollao 18:5405ee7e243b 729 int intersection(int i, int j)
Nikollao 18:5405ee7e243b 730 {
Nikollao 18:5405ee7e243b 731 /// check for overlap between enemies and hero
Nikollao 18:5405ee7e243b 732 n=0;
Nikollao 18:5405ee7e243b 733
Nikollao 18:5405ee7e243b 734 if (lcd.getPixel(i-1,j-1)!=0) //pixel to the top-left
Nikollao 18:5405ee7e243b 735 n++; // increase n by 1
Nikollao 18:5405ee7e243b 736 if (lcd.getPixel(i-1,j)!=0) //pixel to the left
Nikollao 18:5405ee7e243b 737 n++; // increase n by 1
Nikollao 18:5405ee7e243b 738 if (lcd.getPixel(i-1,j+1)!=0) //pixel to the bottom-left
Nikollao 18:5405ee7e243b 739 n++; // increase n by 1
Nikollao 18:5405ee7e243b 740 if (lcd.getPixel(i,j-1)!=0) // pixel to the top
Nikollao 18:5405ee7e243b 741 n++; // increase n by 1
Nikollao 18:5405ee7e243b 742 if (lcd.getPixel(i,j+1)!=0) //pixel to the bottom
Nikollao 18:5405ee7e243b 743 n++; // increase n by 1
Nikollao 18:5405ee7e243b 744 if (lcd.getPixel(i+1,j-1)!=0) //pixel to the top-right
Nikollao 18:5405ee7e243b 745 n++; // increase n by 1
Nikollao 18:5405ee7e243b 746 if (lcd.getPixel(i+1,j)!=0) // pixel to the right
Nikollao 18:5405ee7e243b 747 n++; // increase n by 1
Nikollao 18:5405ee7e243b 748 if (lcd.getPixel(i+1,j+1)!=0) //pixel to the bottom right
Nikollao 18:5405ee7e243b 749 n++; // increase n by 1
Nikollao 18:5405ee7e243b 750 return n;
Nikollao 18:5405ee7e243b 751 }
Nikollao 18:5405ee7e243b 752
Nikollao 18:5405ee7e243b 753 void checkOverlap()
Nikollao 18:5405ee7e243b 754 {
Nikollao 18:5405ee7e243b 755
Nikollao 18:5405ee7e243b 756 for (int i=40+heroX; i<50+heroX; i++) {
Nikollao 18:5405ee7e243b 757 for (int j=35+heroY; j<48+heroY; j++) {
Nikollao 18:5405ee7e243b 758
Nikollao 18:5405ee7e243b 759 int check = intersection(i,j);
Nikollao 18:5405ee7e243b 760 //lcd.setPixel(i,j);
Nikollao 18:5405ee7e243b 761 char bit[50];
Nikollao 18:5405ee7e243b 762 sprintf(bit,"Pixels: %d",check);
Nikollao 18:5405ee7e243b 763
Nikollao 18:5405ee7e243b 764
Nikollao 18:5405ee7e243b 765 for(int i = 40; i < 50; i++) {
Nikollao 18:5405ee7e243b 766 for (int j = 35; j < 47; j++) {
Nikollao 18:5405ee7e243b 767
Nikollao 19:70d40dac5ae0 768 if (lcd.getPixel(i,j) && check > 6) {
Nikollao 18:5405ee7e243b 769 check = 6;
Nikollao 18:5405ee7e243b 770 }
Nikollao 18:5405ee7e243b 771 }
Nikollao 18:5405ee7e243b 772 }
Nikollao 18:5405ee7e243b 773 if (check > 7) {
Nikollao 18:5405ee7e243b 774 tries--;
Nikollao 18:5405ee7e243b 775 //if tries
Nikollao 18:5405ee7e243b 776
Nikollao 18:5405ee7e243b 777 lcd.printString("BANG!",0,0);
Nikollao 18:5405ee7e243b 778 lcd.refresh();
Nikollao 18:5405ee7e243b 779 wait(2);
Nikollao 18:5405ee7e243b 780 lcd.clear();
Nikollao 18:5405ee7e243b 781
Nikollao 18:5405ee7e243b 782 if (tries == 2) {
Nikollao 18:5405ee7e243b 783
Nikollao 18:5405ee7e243b 784 lcd.printString("Ready.",20,1);
Nikollao 18:5405ee7e243b 785 lcd.refresh();
Nikollao 18:5405ee7e243b 786 wait(0.5);
Nikollao 18:5405ee7e243b 787 lcd.printString("Ready..",20,1);
Nikollao 18:5405ee7e243b 788 lcd.refresh();
Nikollao 18:5405ee7e243b 789 wait(0.5);
Nikollao 18:5405ee7e243b 790 lcd.printString("Ready...",20,1);
Nikollao 18:5405ee7e243b 791 lcd.refresh();
Nikollao 18:5405ee7e243b 792 wait(1);
Nikollao 18:5405ee7e243b 793 lcd.printString("GO!",31,2);
Nikollao 18:5405ee7e243b 794 lcd.refresh();
Nikollao 18:5405ee7e243b 795 wait(1);
Nikollao 18:5405ee7e243b 796 lcd.clear();
Nikollao 18:5405ee7e243b 797 fsm_state = 1; ///2 lives left
Nikollao 18:5405ee7e243b 798 } else if (tries == 1) {
Nikollao 18:5405ee7e243b 799
Nikollao 18:5405ee7e243b 800 lcd.clear();
Nikollao 18:5405ee7e243b 801 lcd.printString("Last Chance!",10,2);
Nikollao 18:5405ee7e243b 802 lcd.refresh();
Nikollao 18:5405ee7e243b 803 wait(1);
Nikollao 18:5405ee7e243b 804 fsm_state = 2; //1 life left
Nikollao 18:5405ee7e243b 805 } else if (tries == 0) {
Nikollao 18:5405ee7e243b 806
Nikollao 18:5405ee7e243b 807 fsm_state = 3;
Nikollao 18:5405ee7e243b 808 led_output=fsm[fsm_state];
Nikollao 18:5405ee7e243b 809 lcd.clear();
Nikollao 18:5405ee7e243b 810 lcd.printString("Game Over!",10,2);
Nikollao 18:5405ee7e243b 811 lcd.refresh();
Nikollao 18:5405ee7e243b 812 wait(2);
Nikollao 18:5405ee7e243b 813
Nikollao 19:70d40dac5ae0 814 ticker.detach();
Nikollao 19:70d40dac5ae0 815 game_ticker.attach(&game_timer_isr,0.2);
Nikollao 18:5405ee7e243b 816 lcd.clear();
Nikollao 19:70d40dac5ae0 817 lcd.printString("Play again!",0,0);
Nikollao 18:5405ee7e243b 818 lcd.drawCircle(70,4,2,1);
Nikollao 18:5405ee7e243b 819 lcd.refresh();
Nikollao 18:5405ee7e243b 820 g_button_flag = 0;
Nikollao 18:5405ee7e243b 821
Nikollao 18:5405ee7e243b 822 while(1) {
Nikollao 19:70d40dac5ae0 823 if (g_button1_flag) {
Nikollao 18:5405ee7e243b 824
Nikollao 19:70d40dac5ae0 825 g_button1_flag = 0;
Nikollao 18:5405ee7e243b 826 level = 0;
Nikollao 18:5405ee7e243b 827 tries = 3;
Nikollao 18:5405ee7e243b 828 fsm_state = 0;
Nikollao 18:5405ee7e243b 829 led_output=fsm[fsm_state];
Nikollao 18:5405ee7e243b 830 lcd.clear();
Nikollao 19:70d40dac5ae0 831 heroX = 0;
Nikollao 19:70d40dac5ae0 832 heroY = 0;
Nikollao 19:70d40dac5ae0 833 rectY = 0;
Nikollao 19:70d40dac5ae0 834 circleX = 0;
Nikollao 18:5405ee7e243b 835 main();
Nikollao 18:5405ee7e243b 836 }
Nikollao 18:5405ee7e243b 837 sleep();
Nikollao 18:5405ee7e243b 838 }
Nikollao 18:5405ee7e243b 839
Nikollao 18:5405ee7e243b 840 }
Nikollao 18:5405ee7e243b 841 heroX = 0;
Nikollao 18:5405ee7e243b 842 heroY = 0;
Nikollao 18:5405ee7e243b 843 rectY = 0;
Nikollao 18:5405ee7e243b 844 circleX = 0;
Nikollao 18:5405ee7e243b 845 led_output=fsm[fsm_state];
Nikollao 18:5405ee7e243b 846 }
Nikollao 18:5405ee7e243b 847
Nikollao 18:5405ee7e243b 848 }
Nikollao 18:5405ee7e243b 849 }
Nikollao 18:5405ee7e243b 850 }
Nikollao 18:5405ee7e243b 851
Nikollao 18:5405ee7e243b 852 void error()
Nikollao 18:5405ee7e243b 853 {
Nikollao 18:5405ee7e243b 854 /// display error message
Nikollao 18:5405ee7e243b 855 while (1) {
Nikollao 18:5405ee7e243b 856
Nikollao 18:5405ee7e243b 857 lcd.printString("Error!",0,0);
Nikollao 18:5405ee7e243b 858 r_led = 0;
Nikollao 18:5405ee7e243b 859 wait(0.2);
Nikollao 18:5405ee7e243b 860 r_led = 1;
Nikollao 18:5405ee7e243b 861 wait(0.2);
Nikollao 18:5405ee7e243b 862 }
Nikollao 18:5405ee7e243b 863 }
Nikollao 18:5405ee7e243b 864
Nikollao 18:5405ee7e243b 865
Nikollao 18:5405ee7e243b 866
Nikollao 18:5405ee7e243b 867