My ELEC2645 project. Nikollao Sulollari. 200804685

Dependencies:   N5110 SoftPWM mbed

Fork of Treasure_Hunt by ELEC2645 (2015/16)

Committer:
Nikollao
Date:
Mon May 02 12:01:55 2016 +0000
Revision:
18:5405ee7e243b
Parent:
17:2d424db3975f
Child:
19:70d40dac5ae0
working on obstacles

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