My ELEC2645 project. Nikollao Sulollari. 200804685

Dependencies:   N5110 SoftPWM mbed

Fork of Treasure_Hunt by ELEC2645 (2015/16)

Committer:
Nikollao
Date:
Mon May 02 15:08:00 2016 +0000
Revision:
19:70d40dac5ae0
Parent:
18:5405ee7e243b
Child:
20:59aa6189a47d
obstacles, enemies done, except level 7!

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