Mission Control Code for Interactive Alarm Clock
Dependencies: 4DGL-uLCD-SE mbed
missionControl.cpp@0:02b0b24dedd1, 2015-12-10 (annotated)
- Committer:
- tshin7
- Date:
- Thu Dec 10 08:59:21 2015 +0000
- Revision:
- 0:02b0b24dedd1
MissionControlForAlarm
Who changed what in which revision?
User | Revision | Line number | New 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 | } |