My ELEC2645 project. Nikollao Sulollari. 200804685

Dependencies:   N5110 SoftPWM mbed

Fork of Treasure_Hunt by ELEC2645 (2015/16)

Committer:
Nikollao
Date:
Mon May 02 11:02:36 2016 +0000
Revision:
17:2d424db3975f
Parent:
16:a6ca6858af24
Child:
18:5405ee7e243b
FSM implemented!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nikollao 5:ffa498d7071f 1 /**
Nikollao 5:ffa498d7071f 2 @file main.h
Nikollao 5:ffa498d7071f 3 @brief Header file contains functions and variables
Nikollao 5:ffa498d7071f 4 @brief Treasure Hunt - Embedded Systems Project
Nikollao 5:ffa498d7071f 5 @brief Revision 1.0
Nikollao 5:ffa498d7071f 6 @author Nikollao Sulollari
Nikollao 5:ffa498d7071f 7 @Date 26/03/2016
Nikollao 5:ffa498d7071f 8 */
Nikollao 5:ffa498d7071f 9
Nikollao 5:ffa498d7071f 10 #ifndef MAIN_H
Nikollao 5:ffa498d7071f 11 #define MAIN_H
Nikollao 5:ffa498d7071f 12 #include "mbed.h"
Nikollao 7:f31a4b4beb91 13 #include "N5110.h"
Nikollao 11:53caf3d944a9 14 #include "SoftPWM.h"
Nikollao 5:ffa498d7071f 15
Nikollao 7:f31a4b4beb91 16 #define DIRECTION_TOLERANCE 0.05
Nikollao 7:f31a4b4beb91 17 /**
Nikollao 7:f31a4b4beb91 18 @nameSpace r_led
Nikollao 7:f31a4b4beb91 19 @brief output for status of red LED
Nikollao 7:f31a4b4beb91 20 */
Nikollao 7:f31a4b4beb91 21 DigitalOut r_led(LED_RED);
Nikollao 7:f31a4b4beb91 22
Nikollao 7:f31a4b4beb91 23 /**
Nikollao 7:f31a4b4beb91 24 @nameSpace g_led
Nikollao 7:f31a4b4beb91 25 @brief output for status of green LED
Nikollao 7:f31a4b4beb91 26 */
Nikollao 7:f31a4b4beb91 27 DigitalOut g_led(LED_GREEN);
Nikollao 5:ffa498d7071f 28
Nikollao 5:ffa498d7071f 29 /**
Nikollao 7:f31a4b4beb91 30 @nameSpace b_led
Nikollao 7:f31a4b4beb91 31 @brief output for status of blue LED
Nikollao 5:ffa498d7071f 32 */
Nikollao 2:af5b5d42e835 33 DigitalOut b_led(LED_BLUE);
Nikollao 2:af5b5d42e835 34
Nikollao 7:f31a4b4beb91 35 /**
Nikollao 15:c7af2ea5f164 36 @nameSpace blue_led
Nikollao 17:2d424db3975f 37 @brief output for status of blue LED, lights when game tool is loaded
Nikollao 15:c7af2ea5f164 38 */
Nikollao 15:c7af2ea5f164 39 DigitalOut blue_led(PTA1);
Nikollao 15:c7af2ea5f164 40
Nikollao 15:c7af2ea5f164 41 /**
Nikollao 17:2d424db3975f 42 @nameSpace led_output
Nikollao 17:2d424db3975f 43 @brief output for status of left tries for the user to win the game
Nikollao 15:c7af2ea5f164 44 */
Nikollao 17:2d424db3975f 45 BusOut led_output(PTC2,PTA2,PTB23);
Nikollao 15:c7af2ea5f164 46
Nikollao 15:c7af2ea5f164 47 /**
Nikollao 7:f31a4b4beb91 48 @nameSpace lcd
Nikollao 7:f31a4b4beb91 49 @brief object of the N5110 class
Nikollao 7:f31a4b4beb91 50 */
Nikollao 7:f31a4b4beb91 51 N5110 lcd(PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3);
Nikollao 7:f31a4b4beb91 52
Nikollao 7:f31a4b4beb91 53 /**
Nikollao 7:f31a4b4beb91 54 @nameSpace pc
Nikollao 7:f31a4b4beb91 55 @brief serial connection between mbed and pc
Nikollao 7:f31a4b4beb91 56 */
Nikollao 7:f31a4b4beb91 57 Serial pc(USBTX,USBRX);
Nikollao 7:f31a4b4beb91 58
Nikollao 2:af5b5d42e835 59 // K64F on-board switches
Nikollao 2:af5b5d42e835 60 InterruptIn sw2(SW2);
Nikollao 2:af5b5d42e835 61 InterruptIn sw3(SW3);
Nikollao 2:af5b5d42e835 62
Nikollao 7:f31a4b4beb91 63
Nikollao 7:f31a4b4beb91 64 /**
Nikollao 7:f31a4b4beb91 65 @nameSpace xPot
Nikollao 7:f31a4b4beb91 66 @brief read x-axis position from the value of the joystick
Nikollao 7:f31a4b4beb91 67 */
Nikollao 10:1d229362c134 68 AnalogIn xPot(PTB2);
Nikollao 7:f31a4b4beb91 69
Nikollao 7:f31a4b4beb91 70 /**
Nikollao 7:f31a4b4beb91 71 @nameSpace yPot
Nikollao 7:f31a4b4beb91 72 @brief read y-axis position from the value of the joystick
Nikollao 7:f31a4b4beb91 73 */
Nikollao 10:1d229362c134 74 AnalogIn yPot(PTB3);
Nikollao 10:1d229362c134 75
Nikollao 10:1d229362c134 76 /**
Nikollao 10:1d229362c134 77 @nameSpace button
Nikollao 10:1d229362c134 78 @brief interrupt executes an event triggered task
Nikollao 10:1d229362c134 79 */
Nikollao 10:1d229362c134 80 InterruptIn button(PTB10);
Nikollao 10:1d229362c134 81
Nikollao 10:1d229362c134 82 /**
Nikollao 10:1d229362c134 83 @nameSpace button
Nikollao 10:1d229362c134 84 @brief interrupt executes an event triggered task
Nikollao 10:1d229362c134 85 */
Nikollao 10:1d229362c134 86 InterruptIn button1(PTB18);
Nikollao 7:f31a4b4beb91 87
Nikollao 7:f31a4b4beb91 88 /**
Nikollao 7:f31a4b4beb91 89 @nameSpace buzzer
Nikollao 7:f31a4b4beb91 90 @brief create PWM signal to set buzzer duty cycle and period
Nikollao 7:f31a4b4beb91 91 */
Nikollao 11:53caf3d944a9 92 SoftPWM buzzer(PTB9);
Nikollao 7:f31a4b4beb91 93
Nikollao 7:f31a4b4beb91 94 /**
Nikollao 7:f31a4b4beb91 95 @nameSpace ticker
Nikollao 7:f31a4b4beb91 96 @brief interrupt executes a time-triggered task
Nikollao 7:f31a4b4beb91 97 */
Nikollao 7:f31a4b4beb91 98 Ticker ticker;
Nikollao 7:f31a4b4beb91 99
Nikollao 9:ce2d9c42edea 100
Nikollao 7:f31a4b4beb91 101 /**
Nikollao 7:f31a4b4beb91 102 @nameSpace game_ticker
Nikollao 7:f31a4b4beb91 103 @brief interrupt executes a time-triggered task
Nikollao 7:f31a4b4beb91 104 */
Nikollao 7:f31a4b4beb91 105 Ticker game_ticker;
Nikollao 7:f31a4b4beb91 106
Nikollao 7:f31a4b4beb91 107 /**
Nikollao 7:f31a4b4beb91 108 @nameSpace timeout
Nikollao 7:f31a4b4beb91 109 @brief interrupt calls a function after a specified amount of time
Nikollao 7:f31a4b4beb91 110 */
Nikollao 7:f31a4b4beb91 111 Timeout timeout;
Nikollao 7:f31a4b4beb91 112
Nikollao 7:f31a4b4beb91 113
Nikollao 7:f31a4b4beb91 114 /**
Nikollao 7:f31a4b4beb91 115 @nameSpace DirectionName
Nikollao 7:f31a4b4beb91 116 @brief define joystick's direction based on its x,y values
Nikollao 7:f31a4b4beb91 117 */
Nikollao 7:f31a4b4beb91 118 enum DirectionName {
Nikollao 7:f31a4b4beb91 119 UP,
Nikollao 7:f31a4b4beb91 120 DOWN,
Nikollao 7:f31a4b4beb91 121 LEFT,
Nikollao 7:f31a4b4beb91 122 RIGHT,
Nikollao 7:f31a4b4beb91 123 CENTRE,
Nikollao 7:f31a4b4beb91 124 UP_LEFT,
Nikollao 7:f31a4b4beb91 125 UP_RIGHT,
Nikollao 7:f31a4b4beb91 126 DOWN_LEFT,
Nikollao 7:f31a4b4beb91 127 DOWN_RIGHT
Nikollao 7:f31a4b4beb91 128 };
Nikollao 7:f31a4b4beb91 129
Nikollao 7:f31a4b4beb91 130 /**
Nikollao 7:f31a4b4beb91 131 @nameSpace Joystick
Nikollao 7:f31a4b4beb91 132 @brief create strcut Joystick
Nikollao 7:f31a4b4beb91 133 */
Nikollao 7:f31a4b4beb91 134 typedef struct JoyStick Joystick;
Nikollao 7:f31a4b4beb91 135 struct JoyStick {
Nikollao 7:f31a4b4beb91 136 double x; /// current x value
Nikollao 7:f31a4b4beb91 137 double x0; /// 'centred' x value
Nikollao 7:f31a4b4beb91 138 double y; /// current y value
Nikollao 7:f31a4b4beb91 139 double y0; /// 'centred' y value
Nikollao 7:f31a4b4beb91 140 int button; /// button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
Nikollao 7:f31a4b4beb91 141 DirectionName direction; // current direction
Nikollao 7:f31a4b4beb91 142 };
Nikollao 7:f31a4b4beb91 143 /// create struct variable
Nikollao 7:f31a4b4beb91 144 Joystick joystick;
Nikollao 2:af5b5d42e835 145
Nikollao 11:53caf3d944a9 146 int main();
Nikollao 11:53caf3d944a9 147
Nikollao 5:ffa498d7071f 148 /**
Nikollao 5:ffa498d7071f 149 Displays an error message
Nikollao 5:ffa498d7071f 150 */
Nikollao 2:af5b5d42e835 151 void error();
Nikollao 5:ffa498d7071f 152
Nikollao 5:ffa498d7071f 153 /**
Nikollao 5:ffa498d7071f 154 set-up serial port
Nikollao 5:ffa498d7071f 155 */
Nikollao 2:af5b5d42e835 156 void init_serial();
Nikollao 5:ffa498d7071f 157
Nikollao 5:ffa498d7071f 158 /**
Nikollao 5:ffa498d7071f 159 set-up the on-board LEDs and switches
Nikollao 5:ffa498d7071f 160 */
Nikollao 2:af5b5d42e835 161 void init_K64F();
Nikollao 5:ffa498d7071f 162
Nikollao 5:ffa498d7071f 163 /**
Nikollao 5:ffa498d7071f 164 Set-up random variables and game menu
Nikollao 5:ffa498d7071f 165 */
Nikollao 2:af5b5d42e835 166 void init_game();
Nikollao 5:ffa498d7071f 167
Nikollao 5:ffa498d7071f 168 /**
Nikollao 5:ffa498d7071f 169 Set-up flag to 1
Nikollao 5:ffa498d7071f 170 */
Nikollao 5:ffa498d7071f 171
Nikollao 5:ffa498d7071f 172 /**
Nikollao 5:ffa498d7071f 173 Set-up flag to 1
Nikollao 5:ffa498d7071f 174 */
Nikollao 2:af5b5d42e835 175 void timer_isr();
Nikollao 5:ffa498d7071f 176
Nikollao 5:ffa498d7071f 177 /**
Nikollao 5:ffa498d7071f 178 Set-up flag to 1
Nikollao 5:ffa498d7071f 179 */
Nikollao 5:ffa498d7071f 180
Nikollao 5:ffa498d7071f 181 /**
Nikollao 5:ffa498d7071f 182 Set-up flag to 1
Nikollao 5:ffa498d7071f 183 */
Nikollao 2:af5b5d42e835 184 void game_timer_isr();
Nikollao 5:ffa498d7071f 185
Nikollao 5:ffa498d7071f 186 /**
Nikollao 5:ffa498d7071f 187 Set-up flag to 1
Nikollao 5:ffa498d7071f 188 */
Nikollao 2:af5b5d42e835 189 void sw2_isr();
Nikollao 5:ffa498d7071f 190
Nikollao 5:ffa498d7071f 191 /**
Nikollao 5:ffa498d7071f 192 Set-up flag to 1
Nikollao 5:ffa498d7071f 193 */
Nikollao 2:af5b5d42e835 194 void sw3_isr();
Nikollao 5:ffa498d7071f 195
Nikollao 5:ffa498d7071f 196 /**
Nikollao 5:ffa498d7071f 197 Set-up flag to 1
Nikollao 5:ffa498d7071f 198 */
Nikollao 2:af5b5d42e835 199 void button_isr();
Nikollao 5:ffa498d7071f 200
Nikollao 5:ffa498d7071f 201 /**
Nikollao 5:ffa498d7071f 202 Set-up flag to 1
Nikollao 5:ffa498d7071f 203 */
Nikollao 11:53caf3d944a9 204 void button1_isr();
Nikollao 11:53caf3d944a9 205
Nikollao 11:53caf3d944a9 206 /**
Nikollao 11:53caf3d944a9 207 Set-up flag to 1
Nikollao 11:53caf3d944a9 208 */
Nikollao 2:af5b5d42e835 209 void timeout_isr();
Nikollao 2:af5b5d42e835 210
Nikollao 9:ce2d9c42edea 211
Nikollao 5:ffa498d7071f 212 /**
Nikollao 5:ffa498d7071f 213 Set current position to default position of Joystick
Nikollao 5:ffa498d7071f 214 */
Nikollao 2:af5b5d42e835 215 void calibrateJoystick();
Nikollao 5:ffa498d7071f 216
Nikollao 5:ffa498d7071f 217 /**
Nikollao 5:ffa498d7071f 218 Update the values of the joystick to get current position
Nikollao 5:ffa498d7071f 219 */
Nikollao 2:af5b5d42e835 220 void updateJoystick();
Nikollao 2:af5b5d42e835 221
Nikollao 5:ffa498d7071f 222 /**
Nikollao 5:ffa498d7071f 223 Create an enemy rectangular shape
Nikollao 5:ffa498d7071f 224 */
Nikollao 2:af5b5d42e835 225 void enemyRect();
Nikollao 5:ffa498d7071f 226
Nikollao 5:ffa498d7071f 227 /**
Nikollao 5:ffa498d7071f 228 Create circle shape enemy
Nikollao 5:ffa498d7071f 229 */
Nikollao 2:af5b5d42e835 230 void enemyCircle();
Nikollao 5:ffa498d7071f 231
Nikollao 5:ffa498d7071f 232 /**
Nikollao 5:ffa498d7071f 233 creates the hero of the game
Nikollao 5:ffa498d7071f 234 */
Nikollao 2:af5b5d42e835 235 void hero();
Nikollao 5:ffa498d7071f 236
Nikollao 5:ffa498d7071f 237 /**
Nikollao 5:ffa498d7071f 238 Shows the right direction
Nikollao 5:ffa498d7071f 239 */
Nikollao 2:af5b5d42e835 240 void guidance();
Nikollao 5:ffa498d7071f 241
Nikollao 5:ffa498d7071f 242 /**
Nikollao 5:ffa498d7071f 243 Locates obstacles in the screen
Nikollao 5:ffa498d7071f 244 */
Nikollao 2:af5b5d42e835 245 void obstacles();
Nikollao 5:ffa498d7071f 246
Nikollao 5:ffa498d7071f 247 /**
Nikollao 5:ffa498d7071f 248 Gets enemies depending on the level
Nikollao 5:ffa498d7071f 249 */
Nikollao 3:d2cc054e8605 250 void enemies();
Nikollao 5:ffa498d7071f 251
Nikollao 5:ffa498d7071f 252 /**
Nikollao 5:ffa498d7071f 253 Get s vslue of the .y position, control menu
Nikollao 5:ffa498d7071f 254 */
Nikollao 2:af5b5d42e835 255 int menu();
Nikollao 4:f31bdc212241 256
Nikollao 6:c11bb31a06b3 257 //testing
Nikollao 6:c11bb31a06b3 258 void checkOverlap();
Nikollao 6:c11bb31a06b3 259
Nikollao 5:ffa498d7071f 260 /**
Nikollao 5:ffa498d7071f 261 Check for intrersection
Nikollao 5:ffa498d7071f 262 @param i loops through x direction
Nikollao 5:ffa498d7071f 263 @param j loops through y direction
Nikollao 5:ffa498d7071f 264 @returns the number of pixels aroun the hero detected
Nikollao 5:ffa498d7071f 265 */
Nikollao 5:ffa498d7071f 266 int intersection(int i, int j);
Nikollao 5:ffa498d7071f 267
Nikollao 5:ffa498d7071f 268
Nikollao 7:f31a4b4beb91 269 //vars
Nikollao 7:f31a4b4beb91 270 volatile int rectX; /*!< used to determine x-axis position of the rect enemy */
Nikollao 7:f31a4b4beb91 271
Nikollao 7:f31a4b4beb91 272 volatile int rectY ;/*!< used to determine y-axis position of the rect enemy */
Nikollao 5:ffa498d7071f 273
Nikollao 6:c11bb31a06b3 274 volatile int circleX;/*!< used to determine x-axis position of the circular enemy */
Nikollao 5:ffa498d7071f 275
Nikollao 6:c11bb31a06b3 276 volatile int circleY;/*!< used to determine y-axis position of the circular enemy */
Nikollao 5:ffa498d7071f 277
Nikollao 6:c11bb31a06b3 278 volatile int heroX;/*!< used to move the hero along x-axis */
Nikollao 5:ffa498d7071f 279
Nikollao 6:c11bb31a06b3 280 volatile int heroY;/*!< used to move the hero along y-axis */
Nikollao 5:ffa498d7071f 281
Nikollao 6:c11bb31a06b3 282 volatile int level = 0; /*!< initiate the level difficulty of the game */
Nikollao 2:af5b5d42e835 283
Nikollao 6:c11bb31a06b3 284 volatile int g_timer_flag = 0; /*!< set timer flag in the isr, timer trigger interrupt */
Nikollao 5:ffa498d7071f 285
Nikollao 6:c11bb31a06b3 286 volatile int g_game_timer_flag = 0; /*!< set timer flag in the isr, timer trigger interrupt */
Nikollao 5:ffa498d7071f 287
Nikollao 6:c11bb31a06b3 288 volatile int g_sw2_flag = 0; /*!< set timer flag in the isr, event trigger interrupt */
Nikollao 5:ffa498d7071f 289
Nikollao 6:c11bb31a06b3 290 volatile int g_sw3_flag = 0; /*!< set timer flag in the isr, event trigger interrupt */
Nikollao 5:ffa498d7071f 291
Nikollao 10:1d229362c134 292 volatile int g_button_flag = 0; /*!< set flag in the isr, event trigger interrupt */
Nikollao 10:1d229362c134 293
Nikollao 10:1d229362c134 294 volatile int g_button1_flag = 0; /*!< set flag in the isr, event trigger interrupt */
Nikollao 2:af5b5d42e835 295
Nikollao 6:c11bb31a06b3 296 volatile int option = 0; /*!< select option in menu based on Joystick's movement */
Nikollao 5:ffa498d7071f 297
Nikollao 6:c11bb31a06b3 298 volatile int play = 0; /*!< counts the number of plays */
Nikollao 5:ffa498d7071f 299
Nikollao 15:c7af2ea5f164 300 volatile int tries = 3;/*!< counts the number of trials */
Nikollao 4:f31bdc212241 301
Nikollao 6:c11bb31a06b3 302 volatile int n;/*!< number of pixels overlapping */
Nikollao 13:359d3aa66352 303
Nikollao 16:a6ca6858af24 304 volatile float game_speed = 0.05; /*!< value is set to the ticker, allows user to select game speed */
Nikollao 4:f31bdc212241 305
Nikollao 17:2d424db3975f 306 int fsm[4] = {7,6,4,0}; /*!< array of elements in the FSM, each element is the output of the counter */
Nikollao 17:2d424db3975f 307
Nikollao 17:2d424db3975f 308 int fsm_state = 0; /*!< variable is used to access the array of states and produce an output */
Nikollao 17:2d424db3975f 309
Nikollao 6:c11bb31a06b3 310 int reset = 0; /*!< used to save current level of difficulty */
Nikollao 4:f31bdc212241 311
Nikollao 8:606a488fa720 312 int objectX = 0; /*!< used to move obstacles in the x-axis */
Nikollao 7:f31a4b4beb91 313
Nikollao 8:606a488fa720 314 int objectY = 20; /*!< used to move obstacles in the y-axis */
Nikollao 8:606a488fa720 315
Nikollao 8:606a488fa720 316 int state = 0; /*!< controls the direction of the objtacle */
Nikollao 9:ce2d9c42edea 317
Nikollao 9:ce2d9c42edea 318 int objectX1 = 58; /*!< used to move obstacles in the x-axis */
Nikollao 10:1d229362c134 319
Nikollao 9:ce2d9c42edea 320 int state1 = 1; /*!< controls the direction of the objtacle */
Nikollao 9:ce2d9c42edea 321
Nikollao 16:a6ca6858af24 322 //int menuY = 5; /*!< controls the position of the circle selector */
Nikollao 16:a6ca6858af24 323
Nikollao 16:a6ca6858af24 324 int speed = 1; /*!< controls the speed menu display */
Nikollao 11:53caf3d944a9 325
Nikollao 16:a6ca6858af24 326 bool normal=0; /*!< controls the lcd mode selection on menu */
Nikollao 16:a6ca6858af24 327
Nikollao 16:a6ca6858af24 328 bool sound = 0; /*!< determines if sound is on or off */
Nikollao 7:f31a4b4beb91 329
Nikollao 7:f31a4b4beb91 330 void enemies()
Nikollao 14:91ae0afe9037 331 { /// generate enemies in the screen depending on the level difficulty
Nikollao 7:f31a4b4beb91 332 if (level == 0) {
Nikollao 7:f31a4b4beb91 333
Nikollao 7:f31a4b4beb91 334 enemyRect();
Nikollao 7:f31a4b4beb91 335 //enemyCircle();
Nikollao 7:f31a4b4beb91 336 } else if (level == 1) {
Nikollao 7:f31a4b4beb91 337
Nikollao 7:f31a4b4beb91 338 enemyRect();
Nikollao 7:f31a4b4beb91 339 //enemyCircle();
Nikollao 7:f31a4b4beb91 340 } else if (level == 2) {
Nikollao 7:f31a4b4beb91 341
Nikollao 7:f31a4b4beb91 342 } else if (level == 3) {
Nikollao 7:f31a4b4beb91 343
Nikollao 7:f31a4b4beb91 344 }
Nikollao 7:f31a4b4beb91 345 enemyCircle();
Nikollao 16:a6ca6858af24 346 enemyRect();
Nikollao 7:f31a4b4beb91 347 }
Nikollao 7:f31a4b4beb91 348
Nikollao 7:f31a4b4beb91 349 void enemyRect()
Nikollao 14:91ae0afe9037 350 { ///generate rect shape enemy
Nikollao 7:f31a4b4beb91 351 lcd.drawRect(rectX,rectY,5,4,1);
Nikollao 7:f31a4b4beb91 352 rectX = rectX + rand()%4 - 2;
Nikollao 7:f31a4b4beb91 353 rectY++; ///enemy moving towards hero
Nikollao 16:a6ca6858af24 354 if (rectY == 50){
Nikollao 16:a6ca6858af24 355 rectY = 0;
Nikollao 16:a6ca6858af24 356 }
Nikollao 16:a6ca6858af24 357 if (rectX == 75 || rectX == 25) {
Nikollao 16:a6ca6858af24 358 rectX = 40+rand()%10 - 5;
Nikollao 16:a6ca6858af24 359 }
Nikollao 7:f31a4b4beb91 360 }
Nikollao 7:f31a4b4beb91 361
Nikollao 7:f31a4b4beb91 362 void hero()
Nikollao 14:91ae0afe9037 363 {///cotrol hero
Nikollao 14:91ae0afe9037 364 if (joystick.direction == RIGHT) {
Nikollao 11:53caf3d944a9 365 heroX--;
Nikollao 8:606a488fa720 366 }
Nikollao 14:91ae0afe9037 367 else if (joystick.direction == LEFT){
Nikollao 11:53caf3d944a9 368 heroX++;
Nikollao 7:f31a4b4beb91 369 } else {
Nikollao 8:606a488fa720 370 heroX = heroX;
Nikollao 7:f31a4b4beb91 371 }
Nikollao 7:f31a4b4beb91 372
Nikollao 14:91ae0afe9037 373 if (joystick.direction == UP) {
Nikollao 7:f31a4b4beb91 374 heroY--;
Nikollao 8:606a488fa720 375 }
Nikollao 14:91ae0afe9037 376 else if (joystick.direction == DOWN) {
Nikollao 8:606a488fa720 377 heroY++;
Nikollao 7:f31a4b4beb91 378 } else {
Nikollao 8:606a488fa720 379 heroY = heroY;
Nikollao 7:f31a4b4beb91 380 }
Nikollao 14:91ae0afe9037 381
Nikollao 14:91ae0afe9037 382 if (joystick.direction == UP_LEFT) {
Nikollao 14:91ae0afe9037 383 heroY--;
Nikollao 14:91ae0afe9037 384 heroX++;
Nikollao 14:91ae0afe9037 385 }
Nikollao 14:91ae0afe9037 386 else if (joystick.direction == UP_RIGHT) {
Nikollao 14:91ae0afe9037 387 heroY--;
Nikollao 14:91ae0afe9037 388 heroX--;
Nikollao 14:91ae0afe9037 389 }
Nikollao 14:91ae0afe9037 390 else if (joystick.direction == DOWN_RIGHT) {
Nikollao 14:91ae0afe9037 391 heroY++;
Nikollao 14:91ae0afe9037 392 heroX--;
Nikollao 14:91ae0afe9037 393 }
Nikollao 14:91ae0afe9037 394 else if (joystick.direction == DOWN_LEFT) {
Nikollao 14:91ae0afe9037 395 heroY++;
Nikollao 14:91ae0afe9037 396 heroX++;
Nikollao 14:91ae0afe9037 397 }
Nikollao 14:91ae0afe9037 398
Nikollao 7:f31a4b4beb91 399 ///set x-axis boundaries so hero does not go out of screen
Nikollao 15:c7af2ea5f164 400 if (heroX > 40) {
Nikollao 15:c7af2ea5f164 401 heroX = -40;
Nikollao 15:c7af2ea5f164 402 }
Nikollao 15:c7af2ea5f164 403 if (heroX < -45) {
Nikollao 7:f31a4b4beb91 404 heroX = 35;
Nikollao 7:f31a4b4beb91 405 }
Nikollao 15:c7af2ea5f164 406 if (heroY < -45) { ///if hero has reached the top of the screen
Nikollao 15:c7af2ea5f164 407 heroY = 0; ///hero goes back to the bottom of the screen
Nikollao 15:c7af2ea5f164 408 level++; ///level increases by 1
Nikollao 15:c7af2ea5f164 409 }
Nikollao 15:c7af2ea5f164 410
Nikollao 15:c7af2ea5f164 411 if (heroY >= 0) {/// hero cannot go to previous level
Nikollao 15:c7af2ea5f164 412 heroY = 0;
Nikollao 7:f31a4b4beb91 413 }
Nikollao 7:f31a4b4beb91 414 ///draw hero
Nikollao 7:f31a4b4beb91 415 lcd.drawLine(40+heroX, 47+heroY, 48+heroX, 43+heroY,1);
Nikollao 7:f31a4b4beb91 416 lcd.drawLine(40+heroX, 43+heroY,48+heroX, 47+heroY,1);
Nikollao 7:f31a4b4beb91 417 lcd.drawLine(44+heroX, 45+heroY,44+heroX, 41+heroY,1);
Nikollao 7:f31a4b4beb91 418 lcd.drawCircle(44+heroX, 39+heroY,2,0);
Nikollao 7:f31a4b4beb91 419 }
Nikollao 7:f31a4b4beb91 420
Nikollao 7:f31a4b4beb91 421 void enemyCircle()
Nikollao 14:91ae0afe9037 422 {///generate circle shape enemy
Nikollao 7:f31a4b4beb91 423 lcd.drawCircle(circleX,circleY,4,1);
Nikollao 7:f31a4b4beb91 424 circleY = circleY + rand() %4 - 2;
Nikollao 8:606a488fa720 425
Nikollao 8:606a488fa720 426 if (circleY <= 10) {
Nikollao 15:c7af2ea5f164 427 circleY = 20;
Nikollao 8:606a488fa720 428 }if (circleY >= 35) {
Nikollao 8:606a488fa720 429 circleY = 35;
Nikollao 8:606a488fa720 430 }
Nikollao 15:c7af2ea5f164 431 if (circleX > 84) {
Nikollao 15:c7af2ea5f164 432 circleX = 0;
Nikollao 15:c7af2ea5f164 433 }
Nikollao 7:f31a4b4beb91 434 circleX++; ///enemy moving towards hero
Nikollao 7:f31a4b4beb91 435 }
Nikollao 7:f31a4b4beb91 436
Nikollao 7:f31a4b4beb91 437 void init_game()
Nikollao 7:f31a4b4beb91 438 {
Nikollao 7:f31a4b4beb91 439 ///initialise game
Nikollao 7:f31a4b4beb91 440 srand(time(NULL)); /// generate random numbers
Nikollao 7:f31a4b4beb91 441 rectY = 0; /// init rectX, rectY
Nikollao 7:f31a4b4beb91 442 rectX = rand() %40 + 20;
Nikollao 7:f31a4b4beb91 443 circleY = rand() %20 + 10; /// init circleX, circleY
Nikollao 7:f31a4b4beb91 444 circleX = 0;
Nikollao 7:f31a4b4beb91 445
Nikollao 14:91ae0afe9037 446 lcd.setBrightness(0.5); // put LED backlight on 50%
Nikollao 14:91ae0afe9037 447 lcd.printString("Welcome to",11,1);
Nikollao 14:91ae0afe9037 448 lcd.printString("Treasure Hunt!",1,3);
Nikollao 14:91ae0afe9037 449 lcd.refresh();
Nikollao 16:a6ca6858af24 450 //timeout.attach(&timeout_isr,3);
Nikollao 16:a6ca6858af24 451 //sleep();
Nikollao 16:a6ca6858af24 452 wait(3);
Nikollao 14:91ae0afe9037 453 lcd.clear();
Nikollao 7:f31a4b4beb91 454
Nikollao 7:f31a4b4beb91 455 }
Nikollao 7:f31a4b4beb91 456 void guidance()
Nikollao 14:91ae0afe9037 457 { /// show arrow to act as guidance towards the treasure
Nikollao 7:f31a4b4beb91 458 if (level < 7) { ///check level of difficulty
Nikollao 7:f31a4b4beb91 459
Nikollao 7:f31a4b4beb91 460 lcd.drawLine(42,0,42,4,1);
Nikollao 7:f31a4b4beb91 461 lcd.drawLine(42,0,40,2,1);
Nikollao 7:f31a4b4beb91 462 lcd.drawLine(42,0,44,2,1);
Nikollao 14:91ae0afe9037 463 }
Nikollao 14:91ae0afe9037 464 else if (level == 7) {
Nikollao 7:f31a4b4beb91 465
Nikollao 7:f31a4b4beb91 466 lcd.printString("F",42,0); /// print the treasure icon
Nikollao 14:91ae0afe9037 467 }
Nikollao 14:91ae0afe9037 468 else if (level == 8) {
Nikollao 7:f31a4b4beb91 469
Nikollao 17:2d424db3975f 470 ticker.detach();
Nikollao 7:f31a4b4beb91 471 lcd.clear();
Nikollao 7:f31a4b4beb91 472 lcd.printString("Well done!",0,0);
Nikollao 7:f31a4b4beb91 473 lcd.refresh();
Nikollao 17:2d424db3975f 474 wait(2);
Nikollao 7:f31a4b4beb91 475 lcd.clear();
Nikollao 16:a6ca6858af24 476 lcd.printString("Play again",0,0);
Nikollao 16:a6ca6858af24 477 lcd.drawCircle(70,4,2,1);
Nikollao 7:f31a4b4beb91 478 lcd.refresh();
Nikollao 17:2d424db3975f 479 g_button_flag = 0;
Nikollao 17:2d424db3975f 480
Nikollao 16:a6ca6858af24 481 while(1) {
Nikollao 17:2d424db3975f 482 if (g_button_flag) {
Nikollao 7:f31a4b4beb91 483
Nikollao 17:2d424db3975f 484 g_button_flag = 0;
Nikollao 16:a6ca6858af24 485 level = 0;
Nikollao 16:a6ca6858af24 486 // play++;
Nikollao 16:a6ca6858af24 487 lcd.clear();
Nikollao 16:a6ca6858af24 488 main();
Nikollao 16:a6ca6858af24 489 r_led = 0;
Nikollao 16:a6ca6858af24 490 lcd.refresh();
Nikollao 16:a6ca6858af24 491 }
Nikollao 16:a6ca6858af24 492 sleep();
Nikollao 7:f31a4b4beb91 493 }
Nikollao 7:f31a4b4beb91 494 }
Nikollao 7:f31a4b4beb91 495 }
Nikollao 7:f31a4b4beb91 496
Nikollao 7:f31a4b4beb91 497 void obstacles()
Nikollao 7:f31a4b4beb91 498 {
Nikollao 7:f31a4b4beb91 499 /// place obstacles in the screen
Nikollao 7:f31a4b4beb91 500 /// as level difficulty increases, more obstacles are added
Nikollao 7:f31a4b4beb91 501 if (level == 1) {
Nikollao 7:f31a4b4beb91 502
Nikollao 7:f31a4b4beb91 503 lcd.drawRect(10,15,2,2,1);
Nikollao 7:f31a4b4beb91 504 lcd.drawRect(74,15,2,2,1);
Nikollao 7:f31a4b4beb91 505 } else if (level == 2) {
Nikollao 7:f31a4b4beb91 506
Nikollao 7:f31a4b4beb91 507 lcd.drawRect(10,15,2,2,1);
Nikollao 7:f31a4b4beb91 508 lcd.drawRect(74,15,2,2,1);
Nikollao 7:f31a4b4beb91 509 lcd.drawRect(10,28,2,2,1);
Nikollao 7:f31a4b4beb91 510 lcd.drawRect(74,28,2,2,1);
Nikollao 7:f31a4b4beb91 511 } else if (level == 3) {
Nikollao 7:f31a4b4beb91 512
Nikollao 8:606a488fa720 513 lcd.drawRect(5,12,2,2,1);
Nikollao 8:606a488fa720 514 lcd.drawRect(79,12,2,2,1);
Nikollao 8:606a488fa720 515 lcd.drawRect(5,30,2,2,1);
Nikollao 8:606a488fa720 516 lcd.drawRect(79,30,2,2,1);
Nikollao 8:606a488fa720 517 lcd.drawRect(28,12,2,2,1);
Nikollao 8:606a488fa720 518 lcd.drawRect(52,12,2,2,1);
Nikollao 8:606a488fa720 519 lcd.drawRect(28,30,2,2,1);
Nikollao 8:606a488fa720 520 lcd.drawRect(52,30,2,2,1);
Nikollao 7:f31a4b4beb91 521 } else if (level == 4) {
Nikollao 7:f31a4b4beb91 522
Nikollao 8:606a488fa720 523 lcd.drawRect(5 ,12+ rand() %4 - 2,2,2,1);
Nikollao 8:606a488fa720 524 lcd.drawRect(79 + rand() %4 - 2,12 + rand() %4 - 2,2,2,1);
Nikollao 8:606a488fa720 525 lcd.drawRect(5+ rand() %4 - 2,30 ,2,2,1);
Nikollao 8:606a488fa720 526 lcd.drawRect(79 + rand() %4 - 2,30,2,2,1);
Nikollao 8:606a488fa720 527 lcd.drawRect(28 + rand() %4 - 2,12+ rand() %4,2,2,1);
Nikollao 8:606a488fa720 528 lcd.drawRect(52,12 + rand() %4 - 2,2,2,1);
Nikollao 8:606a488fa720 529 lcd.drawRect(28,30 + rand() %4 - 2,2,2,1);
Nikollao 8:606a488fa720 530 lcd.drawRect(52 + rand() %4 - 2,30,2,2,1);
Nikollao 8:606a488fa720 531 }
Nikollao 9:ce2d9c42edea 532 if (objectX == 0) { ///check position of obstacle
Nikollao 9:ce2d9c42edea 533 state = 0; ///assign states to the position of the obstacle
Nikollao 8:606a488fa720 534 }
Nikollao 9:ce2d9c42edea 535 else if (objectX == 60) {
Nikollao 7:f31a4b4beb91 536 state = 1;
Nikollao 8:606a488fa720 537 } else {
Nikollao 8:606a488fa720 538 state = state;
Nikollao 7:f31a4b4beb91 539 }
Nikollao 9:ce2d9c42edea 540 if (state == 0) { ///if state is 0 increase position on x-axis
Nikollao 7:f31a4b4beb91 541 objectX++;
Nikollao 8:606a488fa720 542 } else {
Nikollao 9:ce2d9c42edea 543 objectX--; ///else if state is 1 decrease position on x-axis
Nikollao 9:ce2d9c42edea 544 }
Nikollao 9:ce2d9c42edea 545
Nikollao 9:ce2d9c42edea 546 if (objectX1 == 68) {
Nikollao 9:ce2d9c42edea 547
Nikollao 9:ce2d9c42edea 548 state1 = 1;
Nikollao 9:ce2d9c42edea 549 }
Nikollao 9:ce2d9c42edea 550 else if (objectX1 == 10) {
Nikollao 9:ce2d9c42edea 551 state1 = 0;
Nikollao 9:ce2d9c42edea 552 }
Nikollao 9:ce2d9c42edea 553 if (state1 == 1) {
Nikollao 9:ce2d9c42edea 554 objectX1--;
Nikollao 9:ce2d9c42edea 555 } else if (state1 == 0) {
Nikollao 9:ce2d9c42edea 556 objectX1++;
Nikollao 9:ce2d9c42edea 557 }
Nikollao 9:ce2d9c42edea 558 objectY = objectY + rand() %4 - 2; ///set poistion of obstacle on y-axis to be valuable
Nikollao 7:f31a4b4beb91 559 ///keep moving object within boundaries
Nikollao 7:f31a4b4beb91 560 if (objectY <= 10) {
Nikollao 7:f31a4b4beb91 561 objectY = 10;
Nikollao 7:f31a4b4beb91 562 }
Nikollao 7:f31a4b4beb91 563 if (objectY >= 37) {
Nikollao 7:f31a4b4beb91 564 objectY = 37;
Nikollao 7:f31a4b4beb91 565 }
Nikollao 8:606a488fa720 566 if ( level == 5) {
Nikollao 7:f31a4b4beb91 567
Nikollao 7:f31a4b4beb91 568 lcd.drawLine(15,10,15,37,1);
Nikollao 7:f31a4b4beb91 569 lcd.drawLine(71,10,71,37,1);
Nikollao 8:606a488fa720 570
Nikollao 9:ce2d9c42edea 571 lcd.drawRect(11+objectX,objectY,2,2,1); ///draw obstacle
Nikollao 8:606a488fa720 572
Nikollao 8:606a488fa720 573 lcd.drawRect(80,10,2,2,1);
Nikollao 8:606a488fa720 574 lcd.drawRect(5,10,2,2,1);
Nikollao 8:606a488fa720 575 lcd.drawRect(80,20,2,2,1);
Nikollao 8:606a488fa720 576 lcd.drawRect(5,20,2,2,1);
Nikollao 8:606a488fa720 577 lcd.drawRect(80,30,2,2,1);
Nikollao 8:606a488fa720 578 lcd.drawRect(5,30,2,2,1);
Nikollao 8:606a488fa720 579
Nikollao 8:606a488fa720 580 }
Nikollao 8:606a488fa720 581 else if (level == 6) {
Nikollao 8:606a488fa720 582
Nikollao 9:ce2d9c42edea 583 lcd.drawLine(15,10,15,37,1); ///draw boundaries
Nikollao 8:606a488fa720 584 lcd.drawLine(71,10,71,37,1);
Nikollao 8:606a488fa720 585
Nikollao 9:ce2d9c42edea 586 lcd.drawRect(11+objectX,objectY,2,2,1); /// draw moving obstacles on screen
Nikollao 9:ce2d9c42edea 587 lcd.drawRect(objectX1,10+objectY,2,2,1);
Nikollao 9:ce2d9c42edea 588 lcd.drawRect(80,10,2,2,1); ///draw stable obstacles
Nikollao 8:606a488fa720 589 lcd.drawRect(5,10,2,2,1);
Nikollao 8:606a488fa720 590 lcd.drawRect(80,20,2,2,1);
Nikollao 8:606a488fa720 591 lcd.drawRect(5,20,2,2,1);
Nikollao 8:606a488fa720 592 lcd.drawRect(80,30,2,2,1);
Nikollao 8:606a488fa720 593 lcd.drawRect(5,30,2,2,1);
Nikollao 8:606a488fa720 594 }
Nikollao 8:606a488fa720 595 else if (level == 7) {
Nikollao 7:f31a4b4beb91 596
Nikollao 7:f31a4b4beb91 597 /*
Nikollao 7:f31a4b4beb91 598 lcd.drawLine(50,15,30,15,1);
Nikollao 7:f31a4b4beb91 599 lcd.drawLine(30,15,30,35,1);
Nikollao 7:f31a4b4beb91 600 lcd.drawLine(30,25,45,25,1);
Nikollao 7:f31a4b4beb91 601 */
Nikollao 7:f31a4b4beb91 602 }
Nikollao 7:f31a4b4beb91 603 }
Nikollao 7:f31a4b4beb91 604
Nikollao 7:f31a4b4beb91 605
Nikollao 7:f31a4b4beb91 606 void calibrateJoystick()
Nikollao 7:f31a4b4beb91 607 {
Nikollao 7:f31a4b4beb91 608 // must not move during calibration
Nikollao 7:f31a4b4beb91 609 joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
Nikollao 7:f31a4b4beb91 610 joystick.y0 = yPot;
Nikollao 7:f31a4b4beb91 611 }
Nikollao 7:f31a4b4beb91 612 void updateJoystick()
Nikollao 7:f31a4b4beb91 613 {
Nikollao 7:f31a4b4beb91 614 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
Nikollao 7:f31a4b4beb91 615 joystick.x = xPot - joystick.x0;
Nikollao 7:f31a4b4beb91 616 joystick.y = yPot - joystick.y0;
Nikollao 7:f31a4b4beb91 617 // read button state
Nikollao 7:f31a4b4beb91 618 joystick.button = button;
Nikollao 7:f31a4b4beb91 619
Nikollao 7:f31a4b4beb91 620 // calculate direction depending on x,y values
Nikollao 7:f31a4b4beb91 621 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
Nikollao 7:f31a4b4beb91 622 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 623 joystick.direction = CENTRE;
Nikollao 7:f31a4b4beb91 624 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 625 joystick.direction = UP;
Nikollao 7:f31a4b4beb91 626 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 627 joystick.direction = DOWN;
Nikollao 7:f31a4b4beb91 628 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 629 joystick.direction = RIGHT;
Nikollao 7:f31a4b4beb91 630 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 631 joystick.direction = LEFT;
Nikollao 7:f31a4b4beb91 632 } else if (joystick.y > DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 633 joystick.direction = UP_LEFT;
Nikollao 7:f31a4b4beb91 634 } else if (joystick.y > DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 635 joystick.direction = UP_RIGHT;
Nikollao 7:f31a4b4beb91 636 } else if (joystick.y < DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 637 joystick.direction = DOWN_LEFT;
Nikollao 7:f31a4b4beb91 638 } else if (joystick.y < DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE) {
Nikollao 7:f31a4b4beb91 639 joystick.direction = DOWN_RIGHT;
Nikollao 7:f31a4b4beb91 640 }
Nikollao 7:f31a4b4beb91 641 }
Nikollao 7:f31a4b4beb91 642
Nikollao 7:f31a4b4beb91 643 int menu()
Nikollao 7:f31a4b4beb91 644 {
Nikollao 11:53caf3d944a9 645 while(1) {
Nikollao 16:a6ca6858af24 646 if (g_game_timer_flag) {
Nikollao 16:a6ca6858af24 647 g_game_timer_flag = 0;
Nikollao 11:53caf3d944a9 648
Nikollao 16:a6ca6858af24 649 updateJoystick();
Nikollao 16:a6ca6858af24 650 lcd.clear();
Nikollao 16:a6ca6858af24 651
Nikollao 16:a6ca6858af24 652 lcd.printString("Start Game",0,0); ///print the main
Nikollao 16:a6ca6858af24 653 lcd.printString("Settings",0,2);
Nikollao 16:a6ca6858af24 654 lcd.printString("Exit",0,4);
Nikollao 16:a6ca6858af24 655 //lcd.drawCircle(70,4,2,1);
Nikollao 11:53caf3d944a9 656
Nikollao 16:a6ca6858af24 657 switch (joystick.direction) { ///check the direction of joystick
Nikollao 16:a6ca6858af24 658 case UP:
Nikollao 16:a6ca6858af24 659 option--;
Nikollao 16:a6ca6858af24 660 break;
Nikollao 16:a6ca6858af24 661 case DOWN:
Nikollao 16:a6ca6858af24 662 option++;
Nikollao 16:a6ca6858af24 663 break;
Nikollao 16:a6ca6858af24 664 }
Nikollao 16:a6ca6858af24 665 if (option < 0) {
Nikollao 16:a6ca6858af24 666 option = 2;
Nikollao 16:a6ca6858af24 667 }
Nikollao 16:a6ca6858af24 668 if (option > 2) {
Nikollao 16:a6ca6858af24 669 option = 0;
Nikollao 16:a6ca6858af24 670 }
Nikollao 11:53caf3d944a9 671
Nikollao 16:a6ca6858af24 672 if (option == 0) { ///selection in menu depends on the value of int option
Nikollao 16:a6ca6858af24 673 lcd.drawCircle(70,4,2,1);
Nikollao 16:a6ca6858af24 674 } else if (option == 1) {
Nikollao 16:a6ca6858af24 675 lcd.drawCircle(55,20,2,1);
Nikollao 16:a6ca6858af24 676 } else if (option == 2) {
Nikollao 16:a6ca6858af24 677 lcd.drawCircle(35,35,2,1);
Nikollao 16:a6ca6858af24 678 }
Nikollao 11:53caf3d944a9 679
Nikollao 16:a6ca6858af24 680 if(g_button_flag) { /// if button is pressed
Nikollao 16:a6ca6858af24 681
Nikollao 16:a6ca6858af24 682 g_button_flag = 0; ///reset flag
Nikollao 11:53caf3d944a9 683
Nikollao 16:a6ca6858af24 684 if (option == 0) { ///break the while loop, start game
Nikollao 16:a6ca6858af24 685 break;
Nikollao 16:a6ca6858af24 686 }
Nikollao 16:a6ca6858af24 687
Nikollao 16:a6ca6858af24 688 else if (option == 1) { ///enter settings menu
Nikollao 11:53caf3d944a9 689
Nikollao 16:a6ca6858af24 690 option = 0;
Nikollao 13:359d3aa66352 691
Nikollao 16:a6ca6858af24 692 while(1) {
Nikollao 16:a6ca6858af24 693 if (g_game_timer_flag) {
Nikollao 16:a6ca6858af24 694 g_game_timer_flag = 0;
Nikollao 11:53caf3d944a9 695
Nikollao 16:a6ca6858af24 696 updateJoystick(); ///update joystick position
Nikollao 16:a6ca6858af24 697 lcd.clear();
Nikollao 16:a6ca6858af24 698 if (normal) {
Nikollao 16:a6ca6858af24 699 if (sound) {
Nikollao 16:a6ca6858af24 700 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 16:a6ca6858af24 701 lcd.printString("Lcd:Inverse",0,1);
Nikollao 16:a6ca6858af24 702 lcd.printString("Sound:ON",0,2);
Nikollao 16:a6ca6858af24 703 lcd.printString("Back",0,3);
Nikollao 16:a6ca6858af24 704 } else {
Nikollao 16:a6ca6858af24 705 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 16:a6ca6858af24 706 lcd.printString("Lcd:Inverse",0,1);
Nikollao 16:a6ca6858af24 707 lcd.printString("Sound:OFF",0,2);
Nikollao 16:a6ca6858af24 708 lcd.printString("Back",0,3);
Nikollao 16:a6ca6858af24 709 }
Nikollao 16:a6ca6858af24 710 } else {
Nikollao 16:a6ca6858af24 711 if (sound) {
Nikollao 16:a6ca6858af24 712 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 16:a6ca6858af24 713 lcd.printString("Lcd: Normal",0,1);
Nikollao 16:a6ca6858af24 714 lcd.printString("Sound: ON",0,2);
Nikollao 16:a6ca6858af24 715 lcd.printString("Back",0,3);
Nikollao 16:a6ca6858af24 716 } else {
Nikollao 16:a6ca6858af24 717 lcd.printString("Game speed",0,0); ///print settings menu
Nikollao 16:a6ca6858af24 718 lcd.printString("Lcd: Normal",0,1);
Nikollao 16:a6ca6858af24 719 lcd.printString("Sound: OFF",0,2);
Nikollao 16:a6ca6858af24 720 lcd.printString("Back",0,3);
Nikollao 16:a6ca6858af24 721 }
Nikollao 16:a6ca6858af24 722 }
Nikollao 16:a6ca6858af24 723 switch (joystick.direction) {
Nikollao 16:a6ca6858af24 724 case UP:
Nikollao 16:a6ca6858af24 725 option--;
Nikollao 16:a6ca6858af24 726 break;
Nikollao 16:a6ca6858af24 727 case DOWN:
Nikollao 16:a6ca6858af24 728 option++;
Nikollao 16:a6ca6858af24 729 break;
Nikollao 16:a6ca6858af24 730 case CENTRE:
Nikollao 16:a6ca6858af24 731 option = option;
Nikollao 16:a6ca6858af24 732 break;
Nikollao 16:a6ca6858af24 733 }
Nikollao 16:a6ca6858af24 734 if (option < 0) { ///if selector is on the top of the screen and UP is pressed, selector goes to the bottom
Nikollao 16:a6ca6858af24 735 option = 3;
Nikollao 16:a6ca6858af24 736 }
Nikollao 16:a6ca6858af24 737 if (option > 3) { ///if selector is on the bottom of the screen and DOWN is pressed, selector goes to the top
Nikollao 16:a6ca6858af24 738 option = 0;
Nikollao 16:a6ca6858af24 739 }
Nikollao 11:53caf3d944a9 740
Nikollao 16:a6ca6858af24 741 /// menu selection depends on the position of the Joystick
Nikollao 16:a6ca6858af24 742 if (option == 0) {
Nikollao 16:a6ca6858af24 743 lcd.drawCircle(70,4,2,1);
Nikollao 16:a6ca6858af24 744 } else if (option == 1) {
Nikollao 16:a6ca6858af24 745 lcd.drawCircle(70,12,2,1);
Nikollao 16:a6ca6858af24 746 } else if (option == 2) {
Nikollao 16:a6ca6858af24 747 lcd.drawCircle(70,20,2,1);
Nikollao 16:a6ca6858af24 748 } else {
Nikollao 16:a6ca6858af24 749 lcd.drawCircle(35,27,2,1);
Nikollao 16:a6ca6858af24 750 }
Nikollao 16:a6ca6858af24 751 if (g_button_flag) { ///if button is pressed
Nikollao 16:a6ca6858af24 752 g_button_flag = 0; ///reset button
Nikollao 11:53caf3d944a9 753
Nikollao 16:a6ca6858af24 754 if (option == 0) { /// if user selects to modify speed of the game
Nikollao 16:a6ca6858af24 755
Nikollao 16:a6ca6858af24 756 while(1) { ///set speed of the game
Nikollao 13:359d3aa66352 757
Nikollao 16:a6ca6858af24 758 if (g_game_timer_flag) {
Nikollao 16:a6ca6858af24 759 g_game_timer_flag = 0;
Nikollao 16:a6ca6858af24 760 updateJoystick();
Nikollao 16:a6ca6858af24 761 lcd.clear();
Nikollao 16:a6ca6858af24 762 if (speed == 0) {
Nikollao 16:a6ca6858af24 763 lcd.printString("Slow!",0,0); ///print game speed menu
Nikollao 16:a6ca6858af24 764 lcd.printString("Normal",0,1);
Nikollao 16:a6ca6858af24 765 lcd.printString("Fast",0,2);
Nikollao 16:a6ca6858af24 766 lcd.printString("Back",0,3);
Nikollao 16:a6ca6858af24 767 } else if (speed == 1) {
Nikollao 16:a6ca6858af24 768 lcd.printString("Slow",0,0); ///print game speed menu
Nikollao 16:a6ca6858af24 769 lcd.printString("Normal!",0,1);
Nikollao 16:a6ca6858af24 770 lcd.printString("Fast",0,2);
Nikollao 16:a6ca6858af24 771 lcd.printString("Back",0,3);
Nikollao 16:a6ca6858af24 772 } else if (speed == 2) {
Nikollao 16:a6ca6858af24 773 lcd.printString("Slow",0,0); ///print game speed menu
Nikollao 16:a6ca6858af24 774 lcd.printString("Normal",0,1);
Nikollao 16:a6ca6858af24 775 lcd.printString("Fast!",0,2);
Nikollao 16:a6ca6858af24 776 lcd.printString("Back",0,3);
Nikollao 16:a6ca6858af24 777 }
Nikollao 13:359d3aa66352 778
Nikollao 16:a6ca6858af24 779 switch (joystick.direction) {
Nikollao 16:a6ca6858af24 780 case UP:
Nikollao 16:a6ca6858af24 781 option--;
Nikollao 16:a6ca6858af24 782 break;
Nikollao 16:a6ca6858af24 783 case DOWN:
Nikollao 16:a6ca6858af24 784 option++;
Nikollao 16:a6ca6858af24 785 break;
Nikollao 16:a6ca6858af24 786 case CENTRE:
Nikollao 16:a6ca6858af24 787 option = option;
Nikollao 16:a6ca6858af24 788 break;
Nikollao 16:a6ca6858af24 789 }
Nikollao 16:a6ca6858af24 790 if (option < 0) {
Nikollao 16:a6ca6858af24 791 option = 3;
Nikollao 16:a6ca6858af24 792 }
Nikollao 16:a6ca6858af24 793 if (option > 3) {
Nikollao 16:a6ca6858af24 794 option = 0;
Nikollao 16:a6ca6858af24 795 }
Nikollao 15:c7af2ea5f164 796
Nikollao 16:a6ca6858af24 797 if (option == 0) {
Nikollao 16:a6ca6858af24 798 lcd.drawCircle(70,4,2,1);
Nikollao 16:a6ca6858af24 799 } else if (option == 1) {
Nikollao 16:a6ca6858af24 800 lcd.drawCircle(55,12,2,1);
Nikollao 16:a6ca6858af24 801 } else if (option == 2) {
Nikollao 16:a6ca6858af24 802 lcd.drawCircle(35,20,2,1);
Nikollao 16:a6ca6858af24 803 } else {
Nikollao 16:a6ca6858af24 804 lcd.drawCircle(35,27,2,1);
Nikollao 16:a6ca6858af24 805 }
Nikollao 13:359d3aa66352 806
Nikollao 16:a6ca6858af24 807 if (g_button_flag) {
Nikollao 16:a6ca6858af24 808 g_button_flag = 0;
Nikollao 13:359d3aa66352 809
Nikollao 16:a6ca6858af24 810 if (option == 0) {
Nikollao 16:a6ca6858af24 811 game_speed = 0.1;
Nikollao 16:a6ca6858af24 812 speed = 0;
Nikollao 16:a6ca6858af24 813 } else if (option == 1) {
Nikollao 16:a6ca6858af24 814 game_speed = 0.05;
Nikollao 16:a6ca6858af24 815 speed = 1;
Nikollao 16:a6ca6858af24 816 } else if (option == 2) {
Nikollao 16:a6ca6858af24 817 game_speed = 0.04;
Nikollao 16:a6ca6858af24 818 speed = 2;
Nikollao 16:a6ca6858af24 819 } else if (option == 3) {
Nikollao 16:a6ca6858af24 820 break;
Nikollao 16:a6ca6858af24 821 }
Nikollao 16:a6ca6858af24 822 }
Nikollao 16:a6ca6858af24 823 lcd.refresh();
Nikollao 16:a6ca6858af24 824 }
Nikollao 16:a6ca6858af24 825 sleep();
Nikollao 13:359d3aa66352 826 }
Nikollao 16:a6ca6858af24 827 } else if (option == 1) { /// Lcd inverse mode
Nikollao 16:a6ca6858af24 828 normal =! normal;
Nikollao 16:a6ca6858af24 829 if (normal) {
Nikollao 16:a6ca6858af24 830 lcd.inverseMode();
Nikollao 16:a6ca6858af24 831 } else {
Nikollao 16:a6ca6858af24 832 lcd.normalMode();
Nikollao 16:a6ca6858af24 833 }
Nikollao 16:a6ca6858af24 834 } else if (option == 2) { ///select sound or not
Nikollao 16:a6ca6858af24 835
Nikollao 16:a6ca6858af24 836 sound =! sound;
Nikollao 16:a6ca6858af24 837
Nikollao 16:a6ca6858af24 838 if (sound)
Nikollao 16:a6ca6858af24 839 buzzer.write(0.5);
Nikollao 16:a6ca6858af24 840 else
Nikollao 16:a6ca6858af24 841 buzzer.write(0.0);
Nikollao 16:a6ca6858af24 842 // buzzer.period(1/400);
Nikollao 16:a6ca6858af24 843 } else if(option == 3) { ///go back to main menu
Nikollao 16:a6ca6858af24 844 break;
Nikollao 13:359d3aa66352 845 }
Nikollao 13:359d3aa66352 846 }
Nikollao 16:a6ca6858af24 847 lcd.refresh();
Nikollao 13:359d3aa66352 848 }
Nikollao 16:a6ca6858af24 849 sleep();
Nikollao 11:53caf3d944a9 850 }
Nikollao 16:a6ca6858af24 851 } else if (option == 2) { ///turn off LED
Nikollao 16:a6ca6858af24 852 lcd.clear();
Nikollao 16:a6ca6858af24 853 lcd.turnOff();
Nikollao 16:a6ca6858af24 854 while(1) {
Nikollao 16:a6ca6858af24 855 deepsleep();
Nikollao 16:a6ca6858af24 856 }
Nikollao 11:53caf3d944a9 857 }
Nikollao 11:53caf3d944a9 858 }
Nikollao 16:a6ca6858af24 859 lcd.refresh();
Nikollao 11:53caf3d944a9 860 }
Nikollao 11:53caf3d944a9 861 sleep();
Nikollao 7:f31a4b4beb91 862 }
Nikollao 7:f31a4b4beb91 863 }
Nikollao 7:f31a4b4beb91 864
Nikollao 7:f31a4b4beb91 865 int intersection(int i, int j)
Nikollao 7:f31a4b4beb91 866 {
Nikollao 7:f31a4b4beb91 867 /// check for overlap between enemies and hero
Nikollao 7:f31a4b4beb91 868 n=0;
Nikollao 7:f31a4b4beb91 869
Nikollao 7:f31a4b4beb91 870 if (lcd.getPixel(i-1,j-1)!=0) //pixel to the top-left
Nikollao 7:f31a4b4beb91 871 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 872 if (lcd.getPixel(i-1,j)!=0) //pixel to the left
Nikollao 7:f31a4b4beb91 873 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 874 if (lcd.getPixel(i-1,j+1)!=0) //pixel to the bottom-left
Nikollao 7:f31a4b4beb91 875 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 876 if (lcd.getPixel(i,j-1)!=0) // pixel to the top
Nikollao 7:f31a4b4beb91 877 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 878 if (lcd.getPixel(i,j+1)!=0) //pixel to the bottom
Nikollao 7:f31a4b4beb91 879 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 880 if (lcd.getPixel(i+1,j-1)!=0) //pixel to the top-right
Nikollao 7:f31a4b4beb91 881 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 882 if (lcd.getPixel(i+1,j)!=0) // pixel to the right
Nikollao 7:f31a4b4beb91 883 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 884 if (lcd.getPixel(i+1,j+1)!=0) //pixel to the bottom right
Nikollao 7:f31a4b4beb91 885 n++; // increase n by 1
Nikollao 7:f31a4b4beb91 886 return n;
Nikollao 7:f31a4b4beb91 887 }
Nikollao 7:f31a4b4beb91 888
Nikollao 7:f31a4b4beb91 889 void checkOverlap()
Nikollao 7:f31a4b4beb91 890 {
Nikollao 7:f31a4b4beb91 891
Nikollao 7:f31a4b4beb91 892 for (int i=40+heroX; i<50+heroX; i++) {
Nikollao 7:f31a4b4beb91 893 for (int j=35+heroY; j<48+heroY; j++) {
Nikollao 15:c7af2ea5f164 894
Nikollao 14:91ae0afe9037 895 int check = intersection(i,j);
Nikollao 14:91ae0afe9037 896 //lcd.setPixel(i,j);
Nikollao 14:91ae0afe9037 897 char bit[50];
Nikollao 14:91ae0afe9037 898 sprintf(bit,"Pixels: %d",check);
Nikollao 15:c7af2ea5f164 899
Nikollao 11:53caf3d944a9 900
Nikollao 15:c7af2ea5f164 901 for(int i = 40; i < 45; i++) {
Nikollao 15:c7af2ea5f164 902 for (int j = -5; i < 5; j++) {
Nikollao 15:c7af2ea5f164 903
Nikollao 15:c7af2ea5f164 904 if (check > 6) {
Nikollao 15:c7af2ea5f164 905 check = 6;
Nikollao 14:91ae0afe9037 906 }
Nikollao 14:91ae0afe9037 907 }
Nikollao 15:c7af2ea5f164 908 }
Nikollao 15:c7af2ea5f164 909 if (check > 7) {
Nikollao 14:91ae0afe9037 910
Nikollao 17:2d424db3975f 911 tries--;
Nikollao 17:2d424db3975f 912 //if tries
Nikollao 17:2d424db3975f 913
Nikollao 17:2d424db3975f 914 lcd.printString("BANG!",0,0);
Nikollao 14:91ae0afe9037 915 lcd.refresh();
Nikollao 17:2d424db3975f 916 wait(2);
Nikollao 17:2d424db3975f 917 lcd.clear();
Nikollao 17:2d424db3975f 918
Nikollao 17:2d424db3975f 919 if (tries == 2) {
Nikollao 17:2d424db3975f 920
Nikollao 17:2d424db3975f 921 lcd.printString("Ready.",20,1);
Nikollao 17:2d424db3975f 922 lcd.refresh();
Nikollao 17:2d424db3975f 923 wait(0.5);
Nikollao 17:2d424db3975f 924 lcd.printString("Ready..",20,1);
Nikollao 17:2d424db3975f 925 lcd.refresh();
Nikollao 17:2d424db3975f 926 wait(0.5);
Nikollao 17:2d424db3975f 927 lcd.printString("Ready...",20,1);
Nikollao 17:2d424db3975f 928 lcd.refresh();
Nikollao 17:2d424db3975f 929 wait(1);
Nikollao 17:2d424db3975f 930 lcd.printString("GO!",31,2);
Nikollao 17:2d424db3975f 931 lcd.refresh();
Nikollao 17:2d424db3975f 932 wait(1);
Nikollao 17:2d424db3975f 933 lcd.clear();
Nikollao 17:2d424db3975f 934 fsm_state = 1; ///2 lives left
Nikollao 17:2d424db3975f 935 }
Nikollao 17:2d424db3975f 936 else if (tries == 1) {
Nikollao 17:2d424db3975f 937
Nikollao 17:2d424db3975f 938 lcd.clear();
Nikollao 17:2d424db3975f 939 lcd.printString("Last Chance!",10,2);
Nikollao 17:2d424db3975f 940 lcd.refresh();
Nikollao 17:2d424db3975f 941 wait(1);
Nikollao 17:2d424db3975f 942 fsm_state = 2; //1 life left
Nikollao 17:2d424db3975f 943 }
Nikollao 17:2d424db3975f 944 else if (tries == 0) {
Nikollao 17:2d424db3975f 945
Nikollao 17:2d424db3975f 946 fsm_state = 3;
Nikollao 17:2d424db3975f 947 led_output=fsm[fsm_state];
Nikollao 17:2d424db3975f 948 lcd.clear();
Nikollao 17:2d424db3975f 949 lcd.printString("Game Over!",0,0);
Nikollao 17:2d424db3975f 950 lcd.refresh();
Nikollao 17:2d424db3975f 951 wait(1);
Nikollao 17:2d424db3975f 952
Nikollao 17:2d424db3975f 953 //ticker.detach();
Nikollao 17:2d424db3975f 954 lcd.clear();
Nikollao 17:2d424db3975f 955 lcd.printString("Play again",0,0);
Nikollao 17:2d424db3975f 956 lcd.drawCircle(70,4,2,1);
Nikollao 17:2d424db3975f 957 lcd.refresh();
Nikollao 17:2d424db3975f 958 g_button_flag = 0;
Nikollao 17:2d424db3975f 959
Nikollao 17:2d424db3975f 960 while(1) {
Nikollao 17:2d424db3975f 961 if (g_button_flag) {
Nikollao 17:2d424db3975f 962
Nikollao 17:2d424db3975f 963 g_button_flag = 0;
Nikollao 17:2d424db3975f 964 level = 0;
Nikollao 17:2d424db3975f 965 fsm_state = 0;
Nikollao 17:2d424db3975f 966 led_output=fsm[fsm_state];
Nikollao 17:2d424db3975f 967 lcd.clear();
Nikollao 17:2d424db3975f 968 main();
Nikollao 17:2d424db3975f 969 }
Nikollao 17:2d424db3975f 970 sleep();
Nikollao 17:2d424db3975f 971 }
Nikollao 17:2d424db3975f 972
Nikollao 15:c7af2ea5f164 973 }
Nikollao 15:c7af2ea5f164 974 heroX = 0;
Nikollao 15:c7af2ea5f164 975 heroY = 0;
Nikollao 17:2d424db3975f 976 rectY = 0;
Nikollao 17:2d424db3975f 977 circleX = 0;
Nikollao 17:2d424db3975f 978 led_output=fsm[fsm_state];
Nikollao 14:91ae0afe9037 979 }
Nikollao 15:c7af2ea5f164 980
Nikollao 7:f31a4b4beb91 981 }
Nikollao 7:f31a4b4beb91 982 }
Nikollao 7:f31a4b4beb91 983 }
Nikollao 7:f31a4b4beb91 984
Nikollao 7:f31a4b4beb91 985 void error()
Nikollao 7:f31a4b4beb91 986 {
Nikollao 7:f31a4b4beb91 987 /// display error message
Nikollao 7:f31a4b4beb91 988 while (1) {
Nikollao 7:f31a4b4beb91 989
Nikollao 7:f31a4b4beb91 990 lcd.printString("Error!",0,0);
Nikollao 7:f31a4b4beb91 991 r_led = 0;
Nikollao 7:f31a4b4beb91 992 wait(0.2);
Nikollao 7:f31a4b4beb91 993 r_led = 1;
Nikollao 7:f31a4b4beb91 994 wait(0.2);
Nikollao 7:f31a4b4beb91 995 }
Nikollao 7:f31a4b4beb91 996 }
Nikollao 7:f31a4b4beb91 997
Nikollao 5:ffa498d7071f 998 #endif
Nikollao 5:ffa498d7071f 999
Nikollao 7:f31a4b4beb91 1000