Mission Control Code for Interactive Alarm Clock

Dependencies:   4DGL-uLCD-SE mbed

Committer:
tshin7
Date:
Thu Dec 10 08:59:21 2015 +0000
Revision:
0:02b0b24dedd1
MissionControlForAlarm

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tshin7 0:02b0b24dedd1 1 #include "mbed.h"
tshin7 0:02b0b24dedd1 2 #include "uLCD_4DGL.h"
tshin7 0:02b0b24dedd1 3 #include "segment_display.h"
tshin7 0:02b0b24dedd1 4 // Include header files for missile command project
tshin7 0:02b0b24dedd1 5 #include "globals.h"
tshin7 0:02b0b24dedd1 6 #include "city_landscape_public.h"
tshin7 0:02b0b24dedd1 7 #include "missile_public.h"
tshin7 0:02b0b24dedd1 8 #include "player.h"
tshin7 0:02b0b24dedd1 9 // Platform initialization
tshin7 0:02b0b24dedd1 10 Serial pc(USBTX,USBRX);
tshin7 0:02b0b24dedd1 11 DigitalIn left_pb(p23);
tshin7 0:02b0b24dedd1 12 DigitalIn right_pb(p21);
tshin7 0:02b0b24dedd1 13 DigitalIn fire_pb(p22);
tshin7 0:02b0b24dedd1 14 DigitalIn gameOn(p19);
tshin7 0:02b0b24dedd1 15 DigitalOut gameWin(p20);
tshin7 0:02b0b24dedd1 16 uLCD_4DGL uLCD(p28,p27,p29);
tshin7 0:02b0b24dedd1 17 //Initialize variables
tshin7 0:02b0b24dedd1 18 PLAYER_MISSILE missileArr [5];
tshin7 0:02b0b24dedd1 19 PLAYER player;
tshin7 0:02b0b24dedd1 20 int radius = 10;
tshin7 0:02b0b24dedd1 21 int missileCount = 5;
tshin7 0:02b0b24dedd1 22 int d, w, l;
tshin7 0:02b0b24dedd1 23 int s = 0;
tshin7 0:02b0b24dedd1 24 int cityCount = 4;
tshin7 0:02b0b24dedd1 25 int lives = 3;
tshin7 0:02b0b24dedd1 26 //draw the anti missile
tshin7 0:02b0b24dedd1 27 void player_missile_draw(PLAYER_MISSILE missile, int color)
tshin7 0:02b0b24dedd1 28 {
tshin7 0:02b0b24dedd1 29 int init_x, init_y, current_x, current_y;
tshin7 0:02b0b24dedd1 30 init_x = missile.source_x;
tshin7 0:02b0b24dedd1 31 init_y = 96;
tshin7 0:02b0b24dedd1 32 current_x = init_x;
tshin7 0:02b0b24dedd1 33 current_y = missile.y;
tshin7 0:02b0b24dedd1 34 uLCD.line(init_x, init_y, current_x, current_y, color);
tshin7 0:02b0b24dedd1 35 }
tshin7 0:02b0b24dedd1 36 // create the anti missile
tshin7 0:02b0b24dedd1 37 void player_missile_create(void)
tshin7 0:02b0b24dedd1 38 {
tshin7 0:02b0b24dedd1 39 int z;
tshin7 0:02b0b24dedd1 40 for(z=0; z<5; z++) {
tshin7 0:02b0b24dedd1 41 if(missileArr[z].status == PLAYER_MISSILE_DEACTIVE) {
tshin7 0:02b0b24dedd1 42 missileArr[z].y = 96;
tshin7 0:02b0b24dedd1 43 //each missile has its own tick
tshin7 0:02b0b24dedd1 44
tshin7 0:02b0b24dedd1 45 //set a random source for the missile
tshin7 0:02b0b24dedd1 46 missileArr[z].source_x = player.x + 5;
tshin7 0:02b0b24dedd1 47 //set a random target for the missile
tshin7 0:02b0b24dedd1 48 missileArr[z].origin_y = 96;
tshin7 0:02b0b24dedd1 49 //the missile starts at its source
tshin7 0:02b0b24dedd1 50
tshin7 0:02b0b24dedd1 51 missileArr[z].status = PLAYER_MISSILE_ACTIVE;
tshin7 0:02b0b24dedd1 52 break;
tshin7 0:02b0b24dedd1 53 }
tshin7 0:02b0b24dedd1 54 }
tshin7 0:02b0b24dedd1 55 }
tshin7 0:02b0b24dedd1 56
tshin7 0:02b0b24dedd1 57 void player_missile_update_position(void)
tshin7 0:02b0b24dedd1 58 {
tshin7 0:02b0b24dedd1 59 int b;
tshin7 0:02b0b24dedd1 60 //controls how fast the missile will move
tshin7 0:02b0b24dedd1 61 //delta_x and delta_y account for the slope of the missile
tshin7 0:02b0b24dedd1 62 double delta_y;
tshin7 0:02b0b24dedd1 63 for(b=0; b<5; b++) {
tshin7 0:02b0b24dedd1 64 if(missileArr[b].status == PLAYER_MISSILE_ACTIVE) {
tshin7 0:02b0b24dedd1 65 // update missile position
tshin7 0:02b0b24dedd1 66 delta_y = 5;
tshin7 0:02b0b24dedd1 67 missileArr[b].y = missileArr[b].y - delta_y;
tshin7 0:02b0b24dedd1 68 // draw missile
tshin7 0:02b0b24dedd1 69 player_missile_draw(missileArr[b], PLAYER_COLOR);
tshin7 0:02b0b24dedd1 70 }
tshin7 0:02b0b24dedd1 71 if(missileArr[b].y < 0) {
tshin7 0:02b0b24dedd1 72 player_missile_draw(missileArr[b], BLACK_COLOR );
tshin7 0:02b0b24dedd1 73 missileArr[b].status = PLAYER_MISSILE_DEACTIVE;
tshin7 0:02b0b24dedd1 74 } else if(missileArr[b].status == PLAYER_MISSILE_EXPLODED) {
tshin7 0:02b0b24dedd1 75 // clear the missile on the screen
tshin7 0:02b0b24dedd1 76 player_missile_draw(missileArr[b], BLACK_COLOR);
tshin7 0:02b0b24dedd1 77 // we have done with this missile, remove it from record
tshin7 0:02b0b24dedd1 78 missileArr[b].status = PLAYER_MISSILE_DEACTIVE;
tshin7 0:02b0b24dedd1 79 //resets the missile's internal tick
tshin7 0:02b0b24dedd1 80 missileCount = missileCount + 1;
tshin7 0:02b0b24dedd1 81 }
tshin7 0:02b0b24dedd1 82 }
tshin7 0:02b0b24dedd1 83 }
tshin7 0:02b0b24dedd1 84
tshin7 0:02b0b24dedd1 85 void player_set_exploded(int index)
tshin7 0:02b0b24dedd1 86 {
tshin7 0:02b0b24dedd1 87 // Error check
tshin7 0:02b0b24dedd1 88 ASSERT_P(index<MAX_NUM_MISSILE,ERROR_MISSILE_INDEX_UPDATE_STATUS);
tshin7 0:02b0b24dedd1 89
tshin7 0:02b0b24dedd1 90 missileArr[index].status = PLAYER_MISSILE_EXPLODED;
tshin7 0:02b0b24dedd1 91 missileCount = missileCount + 1;
tshin7 0:02b0b24dedd1 92 }
tshin7 0:02b0b24dedd1 93
tshin7 0:02b0b24dedd1 94
tshin7 0:02b0b24dedd1 95 int main()
tshin7 0:02b0b24dedd1 96 {
tshin7 0:02b0b24dedd1 97 gameWin = false;
tshin7 0:02b0b24dedd1 98 uLCD.locate(0, 0);
tshin7 0:02b0b24dedd1 99 //uLCD.printf("Lvl:", level());
tshin7 0:02b0b24dedd1 100 //uLCD.printf("Score: %2d", s);
tshin7 0:02b0b24dedd1 101 //uLCD.prinf("Missiles: ",
tshin7 0:02b0b24dedd1 102 //uLCD.printf("Lives: ",
tshin7 0:02b0b24dedd1 103 setup_sequence();
tshin7 0:02b0b24dedd1 104 seg_driver_initialize();
tshin7 0:02b0b24dedd1 105 // 2.show numbers
tshin7 0:02b0b24dedd1 106 int i;
tshin7 0:02b0b24dedd1 107 for(i=0; i<10; i++) {
tshin7 0:02b0b24dedd1 108 seg_driver(i);
tshin7 0:02b0b24dedd1 109 wait(0.2);
tshin7 0:02b0b24dedd1 110 }
tshin7 0:02b0b24dedd1 111 // Draw cities
tshin7 0:02b0b24dedd1 112 city_landscape_init(4);
tshin7 0:02b0b24dedd1 113 // Initialize the buttons
tshin7 0:02b0b24dedd1 114 left_pb.mode(PullUp); // The variable left_pb will be zero when the pushbutton for moving the player left is pressed
tshin7 0:02b0b24dedd1 115 right_pb.mode(PullUp); // The variable rightt_pb will be zero when the pushbutton for moving the player right is pressed
tshin7 0:02b0b24dedd1 116 fire_pb.mode(PullUp); //the variable fire_pb will be zero when the pushbutton for firing a missile is pressed
tshin7 0:02b0b24dedd1 117
tshin7 0:02b0b24dedd1 118 ///Begin the game loop
tshin7 0:02b0b24dedd1 119
tshin7 0:02b0b24dedd1 120 player.x = 60;
tshin7 0:02b0b24dedd1 121 player_draw(player.x,100);
tshin7 0:02b0b24dedd1 122 while(1) {
tshin7 0:02b0b24dedd1 123 if (gameOn==true) {
tshin7 0:02b0b24dedd1 124 //print Score and Lives
tshin7 0:02b0b24dedd1 125 uLCD.locate(0,0);
tshin7 0:02b0b24dedd1 126 uLCD.color(0x00FF00);
tshin7 0:02b0b24dedd1 127 uLCD.printf("Score: %2d \n", s);
tshin7 0:02b0b24dedd1 128 uLCD.printf("Lives: %2d" , lives);
tshin7 0:02b0b24dedd1 129
tshin7 0:02b0b24dedd1 130 missileCount = 5;
tshin7 0:02b0b24dedd1 131 for(l = 0; l<5; l++) {
tshin7 0:02b0b24dedd1 132 if(missileArr[l].status == PLAYER_MISSILE_ACTIVE) {
tshin7 0:02b0b24dedd1 133 missileCount = missileCount - 1;
tshin7 0:02b0b24dedd1 134 }
tshin7 0:02b0b24dedd1 135 seg_driver(missileCount);
tshin7 0:02b0b24dedd1 136 }
tshin7 0:02b0b24dedd1 137 missile_generator(); /// updates all incoming missiles on the screen
tshin7 0:02b0b24dedd1 138 if(left_pb == 0 && player.x>0) {
tshin7 0:02b0b24dedd1 139 //Move player left
tshin7 0:02b0b24dedd1 140 player_draw(player.x,100);
tshin7 0:02b0b24dedd1 141 player_delete(player.x,100);
tshin7 0:02b0b24dedd1 142 player.x = player.x - 10;
tshin7 0:02b0b24dedd1 143 player_draw(player.x,100);
tshin7 0:02b0b24dedd1 144 }
tshin7 0:02b0b24dedd1 145 if(right_pb == 0 && player.x<110) {
tshin7 0:02b0b24dedd1 146 //Move player right
tshin7 0:02b0b24dedd1 147 player_draw(player.x,100);
tshin7 0:02b0b24dedd1 148 player_delete(player.x,100);
tshin7 0:02b0b24dedd1 149 player.x = player.x + 10;
tshin7 0:02b0b24dedd1 150 player_draw(player.x,100);
tshin7 0:02b0b24dedd1 151 }
tshin7 0:02b0b24dedd1 152 if(fire_pb == 0) {
tshin7 0:02b0b24dedd1 153 player_missile_create();
tshin7 0:02b0b24dedd1 154 }
tshin7 0:02b0b24dedd1 155 player_missile_update_position();
tshin7 0:02b0b24dedd1 156 //missile-player collision
tshin7 0:02b0b24dedd1 157 for ( int p=0; p<5; p++) {
tshin7 0:02b0b24dedd1 158 MISSILE missile_record = missile_get_info(p);
tshin7 0:02b0b24dedd1 159 int q,w, r, t;
tshin7 0:02b0b24dedd1 160 q = player.x + 10;
tshin7 0:02b0b24dedd1 161 w = 100;
tshin7 0:02b0b24dedd1 162 r = player.x;
tshin7 0:02b0b24dedd1 163 t = 96;
tshin7 0:02b0b24dedd1 164 if((missile_record.x > r & missile_record.x<q) & (missile_record.y<w & missile_record.y>t & (missile_record.status==MISSILE_ACTIVE))) {
tshin7 0:02b0b24dedd1 165 lives -= 1;
tshin7 0:02b0b24dedd1 166 missile_set_exploded(p);
tshin7 0:02b0b24dedd1 167 wait(1);
tshin7 0:02b0b24dedd1 168 if(lives == 0) {
tshin7 0:02b0b24dedd1 169 gameover(s);
tshin7 0:02b0b24dedd1 170 break;
tshin7 0:02b0b24dedd1 171 }
tshin7 0:02b0b24dedd1 172 for(int j=0; j<11; j=j+3) {
tshin7 0:02b0b24dedd1 173 uLCD.circle(missile_record.x, missile_record.y, j, YELLOW_COLOR);
tshin7 0:02b0b24dedd1 174 uLCD.circle(missile_record.x, missile_record.y, j, BLACK_COLOR);
tshin7 0:02b0b24dedd1 175 }
tshin7 0:02b0b24dedd1 176 }
tshin7 0:02b0b24dedd1 177 }
tshin7 0:02b0b24dedd1 178 //missile-city collision
tshin7 0:02b0b24dedd1 179 for ( int e=0; e<5; e++) {
tshin7 0:02b0b24dedd1 180 MISSILE missile_record = missile_get_info(e);
tshin7 0:02b0b24dedd1 181 for (int d = 0; d<5; d++) {
tshin7 0:02b0b24dedd1 182 CITY city_record = city_get_info(d);
tshin7 0:02b0b24dedd1 183 int f, g, h, i;
tshin7 0:02b0b24dedd1 184 f = city_record.x + city_record.width;
tshin7 0:02b0b24dedd1 185 g = city_record.y - city_record.height;
tshin7 0:02b0b24dedd1 186 h = city_record.x;
tshin7 0:02b0b24dedd1 187 i = city_record.y;
tshin7 0:02b0b24dedd1 188 if((missile_record.x > h & missile_record.x<f) & (missile_record.y<i & missile_record.y>g) & (city_record.status == EXIST)) {
tshin7 0:02b0b24dedd1 189 for(int j=0; j<11; j=j+3) {
tshin7 0:02b0b24dedd1 190 uLCD.circle(missile_record.x, missile_record.y, j, YELLOW_COLOR);
tshin7 0:02b0b24dedd1 191 uLCD.circle(missile_record.x, missile_record.y, j, BLACK_COLOR);
tshin7 0:02b0b24dedd1 192 }
tshin7 0:02b0b24dedd1 193 missile_set_exploded(e);
tshin7 0:02b0b24dedd1 194 city_destroy(d);
tshin7 0:02b0b24dedd1 195 cityCount = cityCount -1;
tshin7 0:02b0b24dedd1 196 if(cityCount == 0) {
tshin7 0:02b0b24dedd1 197 gameover(s);
tshin7 0:02b0b24dedd1 198 }
tshin7 0:02b0b24dedd1 199 break;
tshin7 0:02b0b24dedd1 200 }
tshin7 0:02b0b24dedd1 201 }
tshin7 0:02b0b24dedd1 202 }
tshin7 0:02b0b24dedd1 203 //missile-player_missile collision
tshin7 0:02b0b24dedd1 204 for(d=0; d<5; d++) {
tshin7 0:02b0b24dedd1 205 for(w=0; w<5; w++) {
tshin7 0:02b0b24dedd1 206 MISSILE missile_record = missile_get_info(w);
tshin7 0:02b0b24dedd1 207 double f;
tshin7 0:02b0b24dedd1 208 f = (int)sqrt(pow((double)(missile_record.x-missileArr[d].source_x),2.0) + pow((double)(missile_record.y-missileArr[d].y),2.0));
tshin7 0:02b0b24dedd1 209
tshin7 0:02b0b24dedd1 210 if((f<radius) && (missile_record.status == MISSILE_ACTIVE) && (missileArr[d].status== PLAYER_MISSILE_ACTIVE)) {
tshin7 0:02b0b24dedd1 211 for (int j=0; j< (radius+1); j = j+3) {
tshin7 0:02b0b24dedd1 212 uLCD.circle(missile_record.x, missile_record.y, j, 0xFFFF00);
tshin7 0:02b0b24dedd1 213
tshin7 0:02b0b24dedd1 214 }
tshin7 0:02b0b24dedd1 215 for (int j=0; j<(radius+1); j=j+3) {
tshin7 0:02b0b24dedd1 216 uLCD.circle(missile_record.x, missile_record.y, j, BLACK_COLOR);
tshin7 0:02b0b24dedd1 217
tshin7 0:02b0b24dedd1 218 }
tshin7 0:02b0b24dedd1 219 missile_set_exploded(w);
tshin7 0:02b0b24dedd1 220
tshin7 0:02b0b24dedd1 221 player_set_exploded(d);
tshin7 0:02b0b24dedd1 222 s= s+1;
tshin7 0:02b0b24dedd1 223 if(s==3) {
tshin7 0:02b0b24dedd1 224 gameWin = true;
tshin7 0:02b0b24dedd1 225 }
tshin7 0:02b0b24dedd1 226 }
tshin7 0:02b0b24dedd1 227 }
tshin7 0:02b0b24dedd1 228 }
tshin7 0:02b0b24dedd1 229 }
tshin7 0:02b0b24dedd1 230 }
tshin7 0:02b0b24dedd1 231 }