Updated Space Invaders on the mbed. Improved upon Michael Son's "Mbed Space Invaders" at https://os.mbed.com/users/michaeljson/notebook/mbed-space-invaders/.

Dependencies:   mbed wave_player mbed-rtos 4DGL-uLCD-SE SparkfunAnalogJoystick SDFileSystem LSM9DS1_Library_cal_updated

Fork of Two-PlayerSpaceInvaders by William Minix

test

Committer:
wminix3
Date:
Fri Apr 16 16:18:20 2021 +0000
Revision:
5:b7934866b264
Parent:
4:739f6e0dd8af
Child:
6:c44055f94cc3
First attempt at two-player mode with waits turned into Thread::waits.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
michaeljson 0:3817adfaeb06 1 #include "mbed.h"
michaeljson 0:3817adfaeb06 2 #include "SDFileSystem.h"
michaeljson 0:3817adfaeb06 3 #include "wave_player.h"
michaeljson 0:3817adfaeb06 4 #include "enemy.h"
michaeljson 0:3817adfaeb06 5 #include "player.h"
michaeljson 0:3817adfaeb06 6 #include "missile.h"
michaeljson 0:3817adfaeb06 7 #include "globals.h"
michaeljson 0:3817adfaeb06 8 #include "rtos.h"
michaeljson 0:3817adfaeb06 9 #include <string>
michaeljson 0:3817adfaeb06 10
michaeljson 0:3817adfaeb06 11 /* ==== Navigation Switch ===== */
michaeljson 0:3817adfaeb06 12 class Nav_Switch
michaeljson 0:3817adfaeb06 13 {
michaeljson 0:3817adfaeb06 14 public:
michaeljson 0:3817adfaeb06 15 Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire);
michaeljson 0:3817adfaeb06 16 int read();
michaeljson 0:3817adfaeb06 17 //boolean functions to test each switch
michaeljson 0:3817adfaeb06 18 bool up();
michaeljson 0:3817adfaeb06 19 bool down();
michaeljson 0:3817adfaeb06 20 bool left();
michaeljson 0:3817adfaeb06 21 bool right();
michaeljson 0:3817adfaeb06 22 bool fire();
michaeljson 0:3817adfaeb06 23 //automatic read on RHS
michaeljson 0:3817adfaeb06 24 operator int ();
michaeljson 0:3817adfaeb06 25 //index to any switch array style
michaeljson 0:3817adfaeb06 26 bool operator[](int index) {
michaeljson 0:3817adfaeb06 27 return _pins[index];
michaeljson 0:3817adfaeb06 28 };
michaeljson 0:3817adfaeb06 29 private:
michaeljson 0:3817adfaeb06 30 BusIn _pins;
michaeljson 0:3817adfaeb06 31
michaeljson 0:3817adfaeb06 32 };
michaeljson 0:3817adfaeb06 33 Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire):
michaeljson 0:3817adfaeb06 34 _pins(up, down, left, right, fire)
michaeljson 0:3817adfaeb06 35 {
michaeljson 0:3817adfaeb06 36 _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise
michaeljson 0:3817adfaeb06 37 wait(0.001); //delays just a bit for pullups to pull inputs high
michaeljson 0:3817adfaeb06 38 }
michaeljson 0:3817adfaeb06 39 inline bool Nav_Switch::up()
michaeljson 0:3817adfaeb06 40 {
michaeljson 0:3817adfaeb06 41 return !(_pins[0]);
michaeljson 0:3817adfaeb06 42 }
michaeljson 0:3817adfaeb06 43 inline bool Nav_Switch::down()
michaeljson 0:3817adfaeb06 44 {
michaeljson 0:3817adfaeb06 45 return !(_pins[1]);
michaeljson 0:3817adfaeb06 46 }
michaeljson 0:3817adfaeb06 47 inline bool Nav_Switch::left()
michaeljson 0:3817adfaeb06 48 {
michaeljson 0:3817adfaeb06 49 return !(_pins[2]);
michaeljson 0:3817adfaeb06 50 }
michaeljson 0:3817adfaeb06 51 inline bool Nav_Switch::right()
michaeljson 0:3817adfaeb06 52 {
michaeljson 0:3817adfaeb06 53 return !(_pins[3]);
michaeljson 0:3817adfaeb06 54 }
michaeljson 0:3817adfaeb06 55 inline bool Nav_Switch::fire()
michaeljson 0:3817adfaeb06 56 {
michaeljson 0:3817adfaeb06 57 return !(_pins[4]);
michaeljson 0:3817adfaeb06 58 }
michaeljson 0:3817adfaeb06 59 inline int Nav_Switch::read()
michaeljson 0:3817adfaeb06 60 {
michaeljson 0:3817adfaeb06 61 return _pins.read();
michaeljson 0:3817adfaeb06 62 }
michaeljson 0:3817adfaeb06 63 inline Nav_Switch::operator int ()
michaeljson 0:3817adfaeb06 64 {
michaeljson 0:3817adfaeb06 65 return _pins.read();
michaeljson 0:3817adfaeb06 66 }
michaeljson 0:3817adfaeb06 67
michaeljson 0:3817adfaeb06 68 // Platform initialization
michaeljson 0:3817adfaeb06 69 uLCD_4DGL uLCD(p28,p27,p29); // LCD (serial tx, serial rx, reset pin;)
michaeljson 0:3817adfaeb06 70 AnalogOut DACout(p18); // speaker
michaeljson 0:3817adfaeb06 71 wave_player waver(&DACout); // wav player
michaeljson 0:3817adfaeb06 72 SDFileSystem sd(p5, p6, p7, p8, "sd"); // SD card and filesystem (mosi, miso, sck, cs)
wminix3 2:4a3f97570578 73 Nav_Switch myNav(p16, p10, p11, p9, p12); //pin order on Sparkfun breakout. move U from p13 to p16 so we can use another Serial to communicate with mbed
michaeljson 0:3817adfaeb06 74 DigitalIn pb(p15); // push button for player misisle fire
wminix3 2:4a3f97570578 75 Serial pc(USBTX, USBRX);
wminix3 2:4a3f97570578 76 Serial secondMbed(p13, p14);
michaeljson 0:3817adfaeb06 77 // Initialize all global enemy objects
michaeljson 0:3817adfaeb06 78 enemy_t enemy_1;
michaeljson 0:3817adfaeb06 79 enemy_t enemy_2;
michaeljson 0:3817adfaeb06 80 enemy_t enemy_3;
michaeljson 0:3817adfaeb06 81 enemy_t enemy_4;
michaeljson 0:3817adfaeb06 82 enemy_t enemy_5;
michaeljson 0:3817adfaeb06 83 enemy_t enemy_6;
michaeljson 0:3817adfaeb06 84 enemy_t enemy_7;
michaeljson 0:3817adfaeb06 85 enemy_t enemy_8;
michaeljson 0:3817adfaeb06 86 enemy_t enemy_9;
michaeljson 0:3817adfaeb06 87 enemy_t enemy_10;
michaeljson 0:3817adfaeb06 88 enemy_t enemy_11;
michaeljson 0:3817adfaeb06 89 enemy_t enemy_12;
michaeljson 0:3817adfaeb06 90 enemy_t enemy_13;
michaeljson 0:3817adfaeb06 91 enemy_t enemy_14;
michaeljson 0:3817adfaeb06 92 enemy_t enemy_15;
michaeljson 0:3817adfaeb06 93
michaeljson 0:3817adfaeb06 94 // Initialize variables
wminix3 2:4a3f97570578 95 // Brice added "volatile" here to protect global variables.
wminix3 2:4a3f97570578 96 volatile int numOfEnemies = 0;
wminix3 2:4a3f97570578 97 volatile int ENEMY_MOVE = 1;
wminix3 2:4a3f97570578 98 volatile int MOVE_DOWN = 0;
wminix3 2:4a3f97570578 99 volatile int DIRECTION = 1;
wminix3 2:4a3f97570578 100 volatile int firing_col = 0;
wminix3 2:4a3f97570578 101 volatile int hit_player = 0;
wminix3 2:4a3f97570578 102 volatile bool lose = false;
wminix3 2:4a3f97570578 103 volatile int lives = 3;
wminix3 2:4a3f97570578 104 volatile bool game_menu = false;
wminix3 2:4a3f97570578 105 volatile bool begin_game = false;
wminix3 2:4a3f97570578 106 volatile bool gameover = false;
wminix3 2:4a3f97570578 107 volatile int numPlayers = 1;
wminix3 4:739f6e0dd8af 108 volatile bool first_player_ready = false;
wminix3 4:739f6e0dd8af 109 volatile bool second_player_ready = false;
wminix3 5:b7934866b264 110 volatile bool begin_game2 = false;
wminix3 5:b7934866b264 111 volatile int numWins = 0;
wminix3 5:b7934866b264 112 volatile bool two_player_win = false;
wminix3 5:b7934866b264 113 volatile bool two_player_lose = false;
michaeljson 0:3817adfaeb06 114
michaeljson 0:3817adfaeb06 115 // Initialize global player object
michaeljson 0:3817adfaeb06 116 player_t player;
michaeljson 0:3817adfaeb06 117
michaeljson 0:3817adfaeb06 118 // Intialize global player and enemy missile
michaeljson 0:3817adfaeb06 119 missile_t missile; // player missile
michaeljson 0:3817adfaeb06 120 missile_t enemy_missile; // enemy missile
michaeljson 0:3817adfaeb06 121
michaeljson 0:3817adfaeb06 122 // Array of enemy objects
michaeljson 0:3817adfaeb06 123 enemy_t * enemyArray[15];
michaeljson 0:3817adfaeb06 124
michaeljson 0:3817adfaeb06 125 // Function Prototypes
michaeljson 0:3817adfaeb06 126 void move_enemy_down();
michaeljson 0:3817adfaeb06 127 void playstart(void const *args);
michaeljson 0:3817adfaeb06 128
michaeljson 0:3817adfaeb06 129 // Draws the enemies at the initial starting location
michaeljson 0:3817adfaeb06 130 void draw_enemies_level()
michaeljson 0:3817adfaeb06 131 {
michaeljson 0:3817adfaeb06 132 // Initialize local variables
michaeljson 0:3817adfaeb06 133 unsigned int start_x_pos = 12;
michaeljson 0:3817adfaeb06 134 unsigned int start_enemy_y_pos = 20;
michaeljson 0:3817adfaeb06 135 numOfEnemies = 15;
michaeljson 0:3817adfaeb06 136
michaeljson 0:3817adfaeb06 137 // First Row of Enemies
michaeljson 0:3817adfaeb06 138 enemy_init(&enemy_1,start_x_pos,start_enemy_y_pos,WHITE); // initialize x-pos and y-pos and color of enemy
michaeljson 0:3817adfaeb06 139 enemy_show(&enemy_1); // displays the enemy on uLCD
michaeljson 0:3817adfaeb06 140
michaeljson 0:3817adfaeb06 141 enemy_init(&enemy_2,start_x_pos+15,start_enemy_y_pos,WHITE);
michaeljson 0:3817adfaeb06 142 enemy_show(&enemy_2);
michaeljson 0:3817adfaeb06 143
michaeljson 0:3817adfaeb06 144 enemy_init(&enemy_3,start_x_pos+30,start_enemy_y_pos,WHITE);
michaeljson 0:3817adfaeb06 145 enemy_show(&enemy_3);
michaeljson 0:3817adfaeb06 146
michaeljson 0:3817adfaeb06 147 enemy_init(&enemy_4,start_x_pos+45,start_enemy_y_pos,WHITE);
michaeljson 0:3817adfaeb06 148 enemy_show(&enemy_4);
michaeljson 0:3817adfaeb06 149
michaeljson 0:3817adfaeb06 150 enemy_init(&enemy_5,start_x_pos+60,start_enemy_y_pos,WHITE);
michaeljson 0:3817adfaeb06 151 enemy_show(&enemy_5);
michaeljson 0:3817adfaeb06 152
michaeljson 0:3817adfaeb06 153 // Second Row of Enemies
michaeljson 0:3817adfaeb06 154 enemy_init(&enemy_6,start_x_pos,start_enemy_y_pos+12,WHITE);
michaeljson 0:3817adfaeb06 155 enemy_show(&enemy_6);
michaeljson 0:3817adfaeb06 156
michaeljson 0:3817adfaeb06 157 enemy_init(&enemy_7,start_x_pos+15,start_enemy_y_pos+12,WHITE);
michaeljson 0:3817adfaeb06 158 enemy_show(&enemy_7);
michaeljson 0:3817adfaeb06 159
michaeljson 0:3817adfaeb06 160 enemy_init(&enemy_8,start_x_pos+30,start_enemy_y_pos+12,WHITE);
michaeljson 0:3817adfaeb06 161 enemy_show(&enemy_8);
michaeljson 0:3817adfaeb06 162
michaeljson 0:3817adfaeb06 163 enemy_init(&enemy_9,start_x_pos+45,start_enemy_y_pos+12,WHITE);
michaeljson 0:3817adfaeb06 164 enemy_show(&enemy_9);
michaeljson 0:3817adfaeb06 165
michaeljson 0:3817adfaeb06 166 enemy_init(&enemy_10,start_x_pos+60,start_enemy_y_pos+12,WHITE);
michaeljson 0:3817adfaeb06 167 enemy_show(&enemy_10);
michaeljson 0:3817adfaeb06 168
michaeljson 0:3817adfaeb06 169 // Third Row of Enemies
michaeljson 0:3817adfaeb06 170 enemy_init(&enemy_11,start_x_pos,start_enemy_y_pos+24,WHITE);
michaeljson 0:3817adfaeb06 171 enemy_show(&enemy_11);
michaeljson 0:3817adfaeb06 172
michaeljson 0:3817adfaeb06 173 enemy_init(&enemy_12,start_x_pos+15,start_enemy_y_pos+24,WHITE);
michaeljson 0:3817adfaeb06 174 enemy_show(&enemy_12);
michaeljson 0:3817adfaeb06 175
michaeljson 0:3817adfaeb06 176 enemy_init(&enemy_13,start_x_pos+30,start_enemy_y_pos+24,WHITE);
michaeljson 0:3817adfaeb06 177 enemy_show(&enemy_13);
michaeljson 0:3817adfaeb06 178
michaeljson 0:3817adfaeb06 179 enemy_init(&enemy_14,start_x_pos+45,start_enemy_y_pos+24,WHITE);
michaeljson 0:3817adfaeb06 180 enemy_show(&enemy_14);
michaeljson 0:3817adfaeb06 181
michaeljson 0:3817adfaeb06 182 enemy_init(&enemy_15,start_x_pos+60,start_enemy_y_pos+24,WHITE);
michaeljson 0:3817adfaeb06 183 enemy_show(&enemy_15);
michaeljson 0:3817adfaeb06 184
michaeljson 0:3817adfaeb06 185 // Put enemy objects into array
michaeljson 0:3817adfaeb06 186 enemyArray[0] = &enemy_1;
michaeljson 0:3817adfaeb06 187 enemyArray[1] = &enemy_2;
michaeljson 0:3817adfaeb06 188 enemyArray[2] = &enemy_3;
michaeljson 0:3817adfaeb06 189 enemyArray[3] = &enemy_4;
michaeljson 0:3817adfaeb06 190 enemyArray[4] = &enemy_5;
michaeljson 0:3817adfaeb06 191 enemyArray[5] = &enemy_6;
michaeljson 0:3817adfaeb06 192 enemyArray[6] = &enemy_7;
michaeljson 0:3817adfaeb06 193 enemyArray[7] = &enemy_8;
michaeljson 0:3817adfaeb06 194 enemyArray[8] = &enemy_9;
michaeljson 0:3817adfaeb06 195 enemyArray[9] = &enemy_10;
michaeljson 0:3817adfaeb06 196 enemyArray[10] = &enemy_11;
michaeljson 0:3817adfaeb06 197 enemyArray[11] = &enemy_12;
michaeljson 0:3817adfaeb06 198 enemyArray[12] = &enemy_13;
michaeljson 0:3817adfaeb06 199 enemyArray[13] = &enemy_14;
michaeljson 0:3817adfaeb06 200 enemyArray[14] = &enemy_15;
michaeljson 0:3817adfaeb06 201 }
michaeljson 0:3817adfaeb06 202
michaeljson 0:3817adfaeb06 203 // Draws the player at the initial starting location
michaeljson 0:3817adfaeb06 204 void draw_initial_player()
michaeljson 0:3817adfaeb06 205 {
michaeljson 0:3817adfaeb06 206 int start_x_pos = 59;
michaeljson 0:3817adfaeb06 207 int start_y_pos = 110;
michaeljson 0:3817adfaeb06 208
michaeljson 0:3817adfaeb06 209 player_init(&player,start_x_pos,start_y_pos,WHITE); // intialize x-pos and y-pos and color of player
michaeljson 0:3817adfaeb06 210 player_show(&player); // display player on uLCD
michaeljson 0:3817adfaeb06 211 }
michaeljson 0:3817adfaeb06 212
michaeljson 0:3817adfaeb06 213 // Checks all enemies in row 1
michaeljson 0:3817adfaeb06 214 void check_hit_enemy_row1()
michaeljson 0:3817adfaeb06 215 {
michaeljson 0:3817adfaeb06 216 int hit_enemy;
michaeljson 0:3817adfaeb06 217
michaeljson 0:3817adfaeb06 218 // First Row of Enemies
michaeljson 0:3817adfaeb06 219 hit_enemy = check_enemy(&enemy_1, &missile); // checks if the missile hits the enemy and returns 1 if hit, 0 if not hit
michaeljson 0:3817adfaeb06 220 numOfEnemies = numOfEnemies - hit_enemy; // updates the number of enemies left
michaeljson 0:3817adfaeb06 221 hit_enemy = check_enemy(&enemy_2, &missile);
michaeljson 0:3817adfaeb06 222 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 223 hit_enemy = check_enemy(&enemy_3, &missile);
michaeljson 0:3817adfaeb06 224 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 225 hit_enemy = check_enemy(&enemy_4, &missile);
michaeljson 0:3817adfaeb06 226 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 227 hit_enemy = check_enemy(&enemy_5, &missile);
michaeljson 0:3817adfaeb06 228 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 229 }
michaeljson 0:3817adfaeb06 230
michaeljson 0:3817adfaeb06 231 // Same as check_hit_enemy_row1, but checks enemies at row 2
michaeljson 0:3817adfaeb06 232 void check_hit_enemy_row2()
michaeljson 0:3817adfaeb06 233 {
michaeljson 0:3817adfaeb06 234 int hit_enemy;
michaeljson 0:3817adfaeb06 235
michaeljson 0:3817adfaeb06 236 // Second Row of Enemies
michaeljson 0:3817adfaeb06 237 hit_enemy = check_enemy(&enemy_6, &missile);
michaeljson 0:3817adfaeb06 238 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 239 hit_enemy = check_enemy(&enemy_7, &missile);
michaeljson 0:3817adfaeb06 240 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 241 hit_enemy = check_enemy(&enemy_8, &missile);
michaeljson 0:3817adfaeb06 242 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 243 hit_enemy = check_enemy(&enemy_9, &missile);
michaeljson 0:3817adfaeb06 244 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 245 hit_enemy = check_enemy(&enemy_10, &missile);
michaeljson 0:3817adfaeb06 246 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 247 }
michaeljson 0:3817adfaeb06 248
michaeljson 0:3817adfaeb06 249 // Same as check_hit_enemy_row1, but checks enemies at row 3
michaeljson 0:3817adfaeb06 250 void check_hit_enemy_row3()
michaeljson 0:3817adfaeb06 251 {
michaeljson 0:3817adfaeb06 252 int hit_enemy;
michaeljson 0:3817adfaeb06 253
michaeljson 0:3817adfaeb06 254 // Third Row of Enemies
michaeljson 0:3817adfaeb06 255 hit_enemy = check_enemy(&enemy_11, &missile);
michaeljson 0:3817adfaeb06 256 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 257 hit_enemy = check_enemy(&enemy_12, &missile);
michaeljson 0:3817adfaeb06 258 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 259 hit_enemy = check_enemy(&enemy_13, &missile);
michaeljson 0:3817adfaeb06 260 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 261 hit_enemy = check_enemy(&enemy_14, &missile);
michaeljson 0:3817adfaeb06 262 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 263 hit_enemy = check_enemy(&enemy_15, &missile);
michaeljson 0:3817adfaeb06 264 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 265 }
michaeljson 0:3817adfaeb06 266
michaeljson 0:3817adfaeb06 267 // Checks if player is hit
michaeljson 0:3817adfaeb06 268 void check_player_hit()
michaeljson 0:3817adfaeb06 269 {
michaeljson 0:3817adfaeb06 270 hit_player = check_player(&player, &enemy_missile); // checks if the missile hits the player and returns 1 if hit, 0 if not hit
michaeljson 0:3817adfaeb06 271 }
michaeljson 0:3817adfaeb06 272
michaeljson 0:3817adfaeb06 273 // Randomly selects an enemy to fire and updates the position of where the missile will fire from
michaeljson 0:3817adfaeb06 274 void random_attack_gen()
michaeljson 0:3817adfaeb06 275 {
michaeljson 0:3817adfaeb06 276 firing_col = rand() % 5; // selects a random column
michaeljson 0:3817adfaeb06 277
michaeljson 0:3817adfaeb06 278 // first checks if the 3rd row closest to the player is alive
michaeljson 0:3817adfaeb06 279 if (enemyArray[firing_col+10]->status == ENEMY_ALIVE)
michaeljson 0:3817adfaeb06 280 {
michaeljson 0:3817adfaeb06 281 // If alive, the enemy missile position is updated to the center of the enemy
michaeljson 0:3817adfaeb06 282 enemy_missile.missile_blk_x = enemyArray[firing_col+10]->enemy_blk_x + (enemyArray[firing_col+10]->enemy_width/2);
michaeljson 0:3817adfaeb06 283 enemy_missile.missile_blk_y = enemyArray[firing_col+10]->enemy_blk_y + enemyArray[firing_col+10]->enemy_height + 1;
michaeljson 0:3817adfaeb06 284 enemy_missile.status = ENEMY_MISSILE_ACTIVE; // sets the enemy missile as active
michaeljson 0:3817adfaeb06 285 }
michaeljson 0:3817adfaeb06 286 // if enemy at 3rd row is dead, checks the enemy in the 2nd row
michaeljson 0:3817adfaeb06 287 else if (enemyArray[firing_col+5]->status == ENEMY_ALIVE)
michaeljson 0:3817adfaeb06 288 {
michaeljson 0:3817adfaeb06 289 // If alive, the enemy missile position is updated to the center of the enemy
michaeljson 0:3817adfaeb06 290 enemy_missile.missile_blk_x = enemyArray[firing_col+5]->enemy_blk_x + (enemyArray[firing_col+5]->enemy_width/2);
michaeljson 0:3817adfaeb06 291 enemy_missile.missile_blk_y = enemyArray[firing_col+5]->enemy_blk_y + enemyArray[firing_col+5]->enemy_height + 1;
michaeljson 0:3817adfaeb06 292 enemy_missile.status = ENEMY_MISSILE_ACTIVE;
michaeljson 0:3817adfaeb06 293 }
michaeljson 0:3817adfaeb06 294 // if enemy at 2nd and 3rd row is dead, checks the enemy in the 1st row
michaeljson 0:3817adfaeb06 295 else if (enemyArray[firing_col]->status == ENEMY_ALIVE)
michaeljson 0:3817adfaeb06 296 {
michaeljson 0:3817adfaeb06 297 // If alive, the enemy missile position is updated to the center of the enemy
michaeljson 0:3817adfaeb06 298 enemy_missile.missile_blk_x = enemyArray[firing_col]->enemy_blk_x + (enemyArray[firing_col]->enemy_width/2);
michaeljson 0:3817adfaeb06 299 enemy_missile.missile_blk_y = enemyArray[firing_col]->enemy_blk_y + enemyArray[firing_col]->enemy_height + 1;
michaeljson 0:3817adfaeb06 300 enemy_missile.status = ENEMY_MISSILE_ACTIVE;
michaeljson 0:3817adfaeb06 301 }
michaeljson 0:3817adfaeb06 302 }
michaeljson 0:3817adfaeb06 303
michaeljson 0:3817adfaeb06 304 // moves the enemy
michaeljson 0:3817adfaeb06 305 void enemy_motion()
michaeljson 0:3817adfaeb06 306 {
michaeljson 0:3817adfaeb06 307 // will move the enemy every 6 loops
michaeljson 0:3817adfaeb06 308 if (ENEMY_MOVE % 6 == 0)
michaeljson 0:3817adfaeb06 309 {
michaeljson 0:3817adfaeb06 310 // FIrst Row of Enemies
michaeljson 0:3817adfaeb06 311 MOVE_DOWN = move_enemy(&enemy_1, MOVE_DOWN, DIRECTION); // moves the enemy based on the DIRECTION passed in and also sends global MOVE_DOWN to update in enemy.cpp
michaeljson 0:3817adfaeb06 312 MOVE_DOWN = move_enemy(&enemy_2, MOVE_DOWN, DIRECTION); // MOVE_DOWN will be 1 enemies reach the left or right edge of the screen
michaeljson 0:3817adfaeb06 313 MOVE_DOWN = move_enemy(&enemy_3, MOVE_DOWN, DIRECTION); // MOVE_DOWN will be 2 if enemies reach the player, otherwise 0
michaeljson 0:3817adfaeb06 314 MOVE_DOWN = move_enemy(&enemy_4, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 315 MOVE_DOWN = move_enemy(&enemy_5, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 316
michaeljson 0:3817adfaeb06 317 // Second Row of Enemies
michaeljson 0:3817adfaeb06 318 MOVE_DOWN = move_enemy(&enemy_6, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 319 MOVE_DOWN = move_enemy(&enemy_7, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 320 MOVE_DOWN = move_enemy(&enemy_8, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 321 MOVE_DOWN = move_enemy(&enemy_9, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 322 MOVE_DOWN = move_enemy(&enemy_10, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 323
michaeljson 0:3817adfaeb06 324 // Third Row of Enemies
michaeljson 0:3817adfaeb06 325 MOVE_DOWN = move_enemy(&enemy_11, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 326 MOVE_DOWN = move_enemy(&enemy_12, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 327 MOVE_DOWN = move_enemy(&enemy_13, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 328 MOVE_DOWN = move_enemy(&enemy_14, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 329 MOVE_DOWN = move_enemy(&enemy_15, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 330
michaeljson 0:3817adfaeb06 331 // if MOVE_DOWN is 2, then the enemies have reached the player
michaeljson 0:3817adfaeb06 332 if (MOVE_DOWN == 2)
michaeljson 0:3817adfaeb06 333 {
michaeljson 0:3817adfaeb06 334 lose = true; // set global lose to true to go to gameover screen
michaeljson 0:3817adfaeb06 335 }
michaeljson 0:3817adfaeb06 336
michaeljson 0:3817adfaeb06 337 // if MOVE_DOWN is 1, update the y-pos of the enemies
michaeljson 0:3817adfaeb06 338 if (MOVE_DOWN == 1)
michaeljson 0:3817adfaeb06 339 {
michaeljson 0:3817adfaeb06 340 move_enemy_down(); // updates the y-pos of the enemies
michaeljson 0:3817adfaeb06 341
michaeljson 0:3817adfaeb06 342 // Flips the direction when the enemy moves down
michaeljson 0:3817adfaeb06 343 if (DIRECTION == 1)
michaeljson 0:3817adfaeb06 344 {
michaeljson 0:3817adfaeb06 345 DIRECTION = 2;
michaeljson 0:3817adfaeb06 346 }
michaeljson 0:3817adfaeb06 347 else
michaeljson 0:3817adfaeb06 348 {
michaeljson 0:3817adfaeb06 349 DIRECTION = 1;
michaeljson 0:3817adfaeb06 350 }
michaeljson 0:3817adfaeb06 351 MOVE_DOWN = 0; // sets MOVE_DOWN back to 0 to stop down movement until
michaeljson 0:3817adfaeb06 352 }
michaeljson 0:3817adfaeb06 353
michaeljson 0:3817adfaeb06 354 ENEMY_MOVE += 1;
michaeljson 0:3817adfaeb06 355 }
michaeljson 0:3817adfaeb06 356 else
michaeljson 0:3817adfaeb06 357 {
michaeljson 0:3817adfaeb06 358 ENEMY_MOVE += 1;
michaeljson 0:3817adfaeb06 359 }
michaeljson 0:3817adfaeb06 360 }
michaeljson 0:3817adfaeb06 361
michaeljson 0:3817adfaeb06 362 // moves all the enemies down in the y-direction
michaeljson 0:3817adfaeb06 363 void move_enemy_down()
michaeljson 0:3817adfaeb06 364 {
michaeljson 0:3817adfaeb06 365 // First Row of Enemies
michaeljson 0:3817adfaeb06 366 enemy_erase(&enemy_1);
michaeljson 0:3817adfaeb06 367 enemy_erase(&enemy_2);
michaeljson 0:3817adfaeb06 368 enemy_erase(&enemy_3);
michaeljson 0:3817adfaeb06 369 enemy_erase(&enemy_4);
michaeljson 0:3817adfaeb06 370 enemy_erase(&enemy_5);
michaeljson 0:3817adfaeb06 371
michaeljson 0:3817adfaeb06 372 enemy_1.enemy_blk_y += enemy_1.enemy_height+4;
michaeljson 0:3817adfaeb06 373 enemy_2.enemy_blk_y += enemy_2.enemy_height+4;
michaeljson 0:3817adfaeb06 374 enemy_3.enemy_blk_y += enemy_3.enemy_height+4;
michaeljson 0:3817adfaeb06 375 enemy_4.enemy_blk_y += enemy_4.enemy_height+4;
michaeljson 0:3817adfaeb06 376 enemy_5.enemy_blk_y += enemy_5.enemy_height+4;
michaeljson 0:3817adfaeb06 377
michaeljson 0:3817adfaeb06 378 // Second Row of Enemies
michaeljson 0:3817adfaeb06 379 enemy_erase(&enemy_6);
michaeljson 0:3817adfaeb06 380 enemy_erase(&enemy_7);
michaeljson 0:3817adfaeb06 381 enemy_erase(&enemy_8);
michaeljson 0:3817adfaeb06 382 enemy_erase(&enemy_9);
michaeljson 0:3817adfaeb06 383 enemy_erase(&enemy_10);
michaeljson 0:3817adfaeb06 384
michaeljson 0:3817adfaeb06 385 enemy_6.enemy_blk_y += enemy_6.enemy_height+4;
michaeljson 0:3817adfaeb06 386 enemy_7.enemy_blk_y += enemy_7.enemy_height+4;
michaeljson 0:3817adfaeb06 387 enemy_8.enemy_blk_y += enemy_8.enemy_height+4;
michaeljson 0:3817adfaeb06 388 enemy_9.enemy_blk_y += enemy_9.enemy_height+4;
michaeljson 0:3817adfaeb06 389 enemy_10.enemy_blk_y += enemy_10.enemy_height+4;
michaeljson 0:3817adfaeb06 390
michaeljson 0:3817adfaeb06 391 // Third Row of Enemies
michaeljson 0:3817adfaeb06 392 enemy_erase(&enemy_11);
michaeljson 0:3817adfaeb06 393 enemy_erase(&enemy_12);
michaeljson 0:3817adfaeb06 394 enemy_erase(&enemy_13);
michaeljson 0:3817adfaeb06 395 enemy_erase(&enemy_14);
michaeljson 0:3817adfaeb06 396 enemy_erase(&enemy_15);
michaeljson 0:3817adfaeb06 397
michaeljson 0:3817adfaeb06 398 enemy_11.enemy_blk_y += enemy_11.enemy_height+4;
michaeljson 0:3817adfaeb06 399 enemy_12.enemy_blk_y += enemy_12.enemy_height+4;
michaeljson 0:3817adfaeb06 400 enemy_13.enemy_blk_y += enemy_13.enemy_height+4;
michaeljson 0:3817adfaeb06 401 enemy_14.enemy_blk_y += enemy_14.enemy_height+4;
michaeljson 0:3817adfaeb06 402 enemy_15.enemy_blk_y += enemy_15.enemy_height+4;
michaeljson 0:3817adfaeb06 403 }
michaeljson 0:3817adfaeb06 404
michaeljson 0:3817adfaeb06 405 // thread that plays sounds during game
michaeljson 0:3817adfaeb06 406 void playstart(void const *args)//Th
michaeljson 0:3817adfaeb06 407 { //Depending on the state of the game,
michaeljson 0:3817adfaeb06 408 //queue either screen music or play sound effect upon fire
michaeljson 0:3817adfaeb06 409 while(true) {
michaeljson 0:3817adfaeb06 410 FILE *wave_file;
michaeljson 0:3817adfaeb06 411
michaeljson 0:3817adfaeb06 412 // plays intro music during menu screen
michaeljson 0:3817adfaeb06 413 while(game_menu)
michaeljson 0:3817adfaeb06 414 {
wminix3 2:4a3f97570578 415 wave_file=fopen("/sd/wavfiles/futureEdit2.wav","r");
wminix3 2:4a3f97570578 416 if(wave_file==NULL) pc.printf("file open error!\n\n\r"); // added this for open error check
michaeljson 0:3817adfaeb06 417 waver.play(wave_file);
michaeljson 0:3817adfaeb06 418 fclose(wave_file);
michaeljson 0:3817adfaeb06 419 }
michaeljson 0:3817adfaeb06 420
michaeljson 0:3817adfaeb06 421 // Checks in game sound conditions
wminix3 5:b7934866b264 422 while(begin_game || begin_game2) // added OR begin_game2 so that music/sounds play during one-player or two-player
michaeljson 0:3817adfaeb06 423 {
michaeljson 0:3817adfaeb06 424 // play firing sound when the player fires
michaeljson 0:3817adfaeb06 425 if(!pb && missile.status == PLAYER_MISSILE_INACTIVE) {
michaeljson 0:3817adfaeb06 426
wminix3 2:4a3f97570578 427 wave_file=fopen("/sd/wavfiles/laserEdit.wav","r");
wminix3 2:4a3f97570578 428 if(wave_file==NULL) pc.printf("laser file open error!\n\n\r"); // added this for open error check
michaeljson 0:3817adfaeb06 429
michaeljson 0:3817adfaeb06 430 waver.play(wave_file);
michaeljson 0:3817adfaeb06 431 fclose(wave_file);
michaeljson 0:3817adfaeb06 432 }
michaeljson 0:3817adfaeb06 433
michaeljson 0:3817adfaeb06 434 // if player hit, play hit sound
michaeljson 0:3817adfaeb06 435 if (hit_player)
michaeljson 0:3817adfaeb06 436 {
wminix3 2:4a3f97570578 437 wave_file=fopen("/sd/wavfiles/bigExplosionEdit2.wav","r");
wminix3 2:4a3f97570578 438 if(wave_file==NULL) pc.printf("explosion file open error!\n\n\r"); // added this for open error check
michaeljson 0:3817adfaeb06 439 waver.play(wave_file);
michaeljson 0:3817adfaeb06 440 fclose(wave_file);
michaeljson 0:3817adfaeb06 441 }
michaeljson 0:3817adfaeb06 442 }
michaeljson 0:3817adfaeb06 443
michaeljson 0:3817adfaeb06 444 // players gameover voice if player loses
michaeljson 0:3817adfaeb06 445 while(gameover)
michaeljson 0:3817adfaeb06 446 {
wminix3 2:4a3f97570578 447 wave_file=fopen("/sd/wavfiles/comicalgameoverEdit.wav","r");
wminix3 2:4a3f97570578 448 if(wave_file==NULL) pc.printf("gameover file open error!\n\n\r"); // added this for open error check
michaeljson 0:3817adfaeb06 449 waver.play(wave_file);
michaeljson 0:3817adfaeb06 450 fclose(wave_file);
michaeljson 0:3817adfaeb06 451 }
michaeljson 0:3817adfaeb06 452 }
michaeljson 0:3817adfaeb06 453 }
michaeljson 0:3817adfaeb06 454
wminix3 5:b7934866b264 455 // Thread added for mbed communication, which allows two-player -- Brice
wminix3 4:739f6e0dd8af 456 void mbedComm(void const *args) {
wminix3 4:739f6e0dd8af 457 while(1) {
wminix3 5:b7934866b264 458 while(numPlayers == 1) Thread::yield(); // with one player, thread is unneeded and should yield.
wminix3 5:b7934866b264 459 while(!first_player_ready || !second_player_ready) { // while either player isn't ready, send a start code, and become ready
wminix3 4:739f6e0dd8af 460 //if (!first_player_ready || !second_player_ready) {
wminix3 4:739f6e0dd8af 461 secondMbed.putc('S');
wminix3 4:739f6e0dd8af 462 first_player_ready = true;
wminix3 4:739f6e0dd8af 463 //}
wminix3 5:b7934866b264 464 if (secondMbed.readable()) { // read in a start code to know that the second player is ready (if the second player sends a start code)
wminix3 4:739f6e0dd8af 465 if (secondMbed.getc() == 'S') {
wminix3 4:739f6e0dd8af 466 second_player_ready = true;
wminix3 4:739f6e0dd8af 467 }
wminix3 4:739f6e0dd8af 468 }
wminix3 5:b7934866b264 469 Thread::wait(1000); // run once a second
wminix3 5:b7934866b264 470 }
wminix3 5:b7934866b264 471 if (two_player_win) { // if this player wins, notify the other mbed/player that they lost.
wminix3 5:b7934866b264 472 secondMbed.putc('W');
wminix3 4:739f6e0dd8af 473 }
wminix3 5:b7934866b264 474 if (secondMbed.readable()) {
wminix3 5:b7934866b264 475 if (secondMbed.getc() == 'W') {
wminix3 5:b7934866b264 476 two_player_lose = true;
wminix3 5:b7934866b264 477 }
wminix3 5:b7934866b264 478 }
wminix3 5:b7934866b264 479 Thread::wait(500); // check twice a second for a win
wminix3 4:739f6e0dd8af 480 }
wminix3 4:739f6e0dd8af 481 }
wminix3 4:739f6e0dd8af 482
michaeljson 0:3817adfaeb06 483 int main() {
michaeljson 0:3817adfaeb06 484
michaeljson 0:3817adfaeb06 485 // Initialization of Setup variables
michaeljson 0:3817adfaeb06 486 int blk_x, blk_y;
michaeljson 0:3817adfaeb06 487 pb.mode(PullUp);
michaeljson 0:3817adfaeb06 488
michaeljson 0:3817adfaeb06 489 Thread thread(playstart); // intializes the thread to play sound
wminix3 4:739f6e0dd8af 490 Thread thread2(mbedComm); // initialized thread to start mbed communication between players -- Brice
michaeljson 0:3817adfaeb06 491 uLCD.baudrate(500000); // set to 500000 to increase smooth gameplay
michaeljson 0:3817adfaeb06 492
michaeljson 0:3817adfaeb06 493 // Initialization of Game Menu variables
michaeljson 0:3817adfaeb06 494 const int title_x_pos = 2; // initial x-pos of title
michaeljson 0:3817adfaeb06 495 const int title_y_pos = 3; // initial y-pos of title
michaeljson 0:3817adfaeb06 496 int start_label_x_pos = 7; // start label x-pos
michaeljson 0:3817adfaeb06 497 int start_label_y_pos = 7; // start label y-pos
michaeljson 0:3817adfaeb06 498 int level_cursor_x_pos = 5; // level cursor x-position
wminix3 2:4a3f97570578 499 int level_cursor_y_pos_start = 7; // level cursor y-position
wminix3 2:4a3f97570578 500 //int level_cursor_y_pos = 7; // initial level_cursor_y_pos @ start -- Added by Brice for more menu options
wminix3 2:4a3f97570578 501 int level_cursor_y_pos_end = 8; // BOTTOM CURSOR POS -- Added by Brice for more menu options
michaeljson 0:3817adfaeb06 502 int gameover_x_pos = 5; // gameover label x-position
michaeljson 0:3817adfaeb06 503 int gameover_y_pos = 5; // gameover label y-position
michaeljson 0:3817adfaeb06 504 int win_x_pos = 2; // congratulations label x-position
michaeljson 0:3817adfaeb06 505 int win_y_pos = 5; // congratulations label y-position
michaeljson 0:3817adfaeb06 506 int startover_x_pos = 3; // startover label x-position
michaeljson 0:3817adfaeb06 507 int startover_y_pos = 8; // startover label y-position
michaeljson 0:3817adfaeb06 508
michaeljson 0:3817adfaeb06 509 // intialize temporary score and current score
michaeljson 0:3817adfaeb06 510 int temp = 0;
michaeljson 0:3817adfaeb06 511 int score = 0;
michaeljson 0:3817adfaeb06 512
wminix3 2:4a3f97570578 513 // Additional globals added for two-player and one-player capabilities (by Brice)
wminix3 2:4a3f97570578 514
michaeljson 0:3817adfaeb06 515 // Begin game loop
michaeljson 0:3817adfaeb06 516 while(1)
michaeljson 0:3817adfaeb06 517 {
michaeljson 0:3817adfaeb06 518 // initialize all starting conditions for the beginning of the game
michaeljson 0:3817adfaeb06 519 game_menu = true; // defaults to display menu screen
michaeljson 0:3817adfaeb06 520 ENEMY_MOVE = true; // defaults to move enemy
michaeljson 0:3817adfaeb06 521 DIRECTION = 1; // default to move right
michaeljson 0:3817adfaeb06 522 hit_player = 0; // default to not player hit
michaeljson 0:3817adfaeb06 523 MOVE_DOWN = 0; // default to not move down
michaeljson 0:3817adfaeb06 524 lose = false; // default to not lose
michaeljson 0:3817adfaeb06 525 lives = 3; // defaults to 3 lives
michaeljson 0:3817adfaeb06 526 score = 0; // default to score of 0
wminix3 2:4a3f97570578 527 int level_cursor_y_pos = 7; // initial level_cursor_y_pos @ start -- Added by Brice for more menu options
michaeljson 0:3817adfaeb06 528 uLCD.cls();
wminix3 2:4a3f97570578 529 // Brice moved this out of the loop since it shouldn't change
wminix3 2:4a3f97570578 530 //uLCD.locate(title_x_pos,title_y_pos); // "SPACE INVADERS" title position
wminix3 2:4a3f97570578 531 //uLCD.printf("SPACE INVADERS"); // Title
michaeljson 0:3817adfaeb06 532 // Implementation of Game Menu
michaeljson 0:3817adfaeb06 533 while(game_menu)
michaeljson 0:3817adfaeb06 534 {
wminix3 2:4a3f97570578 535 // Brice added this in order to move the cursor through the menu options
wminix3 2:4a3f97570578 536 uLCD.locate(level_cursor_x_pos, level_cursor_y_pos);
wminix3 2:4a3f97570578 537 uLCD.printf(" ");
wminix3 2:4a3f97570578 538 if (myNav.down() && level_cursor_y_pos < level_cursor_y_pos_end) {
wminix3 2:4a3f97570578 539 level_cursor_y_pos += 1;
wminix3 2:4a3f97570578 540 } else if (myNav.up() && level_cursor_y_pos > level_cursor_y_pos_start) {
wminix3 2:4a3f97570578 541 level_cursor_y_pos -= 1;
wminix3 2:4a3f97570578 542 }
wminix3 2:4a3f97570578 543 // end of movable cursor
michaeljson 0:3817adfaeb06 544 uLCD.locate(level_cursor_x_pos,level_cursor_y_pos); // draws cursor next to "START" label
michaeljson 0:3817adfaeb06 545 uLCD.printf("->");
michaeljson 0:3817adfaeb06 546
michaeljson 0:3817adfaeb06 547 uLCD.locate(title_x_pos,title_y_pos); // "SPACE INVADERS" title position
michaeljson 0:3817adfaeb06 548 uLCD.printf("SPACE INVADERS"); // Title
michaeljson 0:3817adfaeb06 549
michaeljson 0:3817adfaeb06 550 uLCD.locate(start_label_x_pos,start_label_y_pos); // "START" label position
wminix3 2:4a3f97570578 551 uLCD.printf("ONE-PLAYER");
wminix3 2:4a3f97570578 552
wminix3 2:4a3f97570578 553 uLCD.locate(start_label_x_pos,start_label_y_pos + 1);
wminix3 2:4a3f97570578 554 uLCD.printf("TWO-PLAYER");
michaeljson 0:3817adfaeb06 555 // if pushbutton is pressed, game menu is exited and game begins
michaeljson 0:3817adfaeb06 556 if(!pb)
michaeljson 0:3817adfaeb06 557 {
michaeljson 0:3817adfaeb06 558 game_menu = false;
wminix3 2:4a3f97570578 559 if (level_cursor_y_pos == start_label_y_pos) {
wminix3 2:4a3f97570578 560 numPlayers = 1;
wminix3 2:4a3f97570578 561 } else if (level_cursor_y_pos == start_label_y_pos + 1) {
wminix3 2:4a3f97570578 562 numPlayers = 2;
wminix3 2:4a3f97570578 563 }
wminix3 3:e6c081c7f6f1 564 Thread::wait(500); // changed this to Thread::wait ... originally wait(0.5);
michaeljson 0:3817adfaeb06 565 }
michaeljson 0:3817adfaeb06 566 }
wminix3 4:739f6e0dd8af 567 while(numPlayers != 1 && (!first_player_ready || !second_player_ready)) Thread::yield(); // added to force wait with two-player and one player not ready. -- added by Brice
wminix3 5:b7934866b264 568 if (numPlayers == 2 && first_player_ready && second_player_ready) {
wminix3 5:b7934866b264 569 begin_game2 = true;
wminix3 5:b7934866b264 570 numWins = 0;
wminix3 5:b7934866b264 571 } else {
wminix3 5:b7934866b264 572 begin_game = true; // defaults begin_game to true
wminix3 5:b7934866b264 573 }
michaeljson 0:3817adfaeb06 574
michaeljson 0:3817adfaeb06 575 uLCD.cls();
michaeljson 0:3817adfaeb06 576
michaeljson 0:3817adfaeb06 577 // Draw the enemies
michaeljson 0:3817adfaeb06 578 draw_enemies_level();
michaeljson 0:3817adfaeb06 579
michaeljson 0:3817adfaeb06 580 // Draw the player
michaeljson 0:3817adfaeb06 581 draw_initial_player();
michaeljson 0:3817adfaeb06 582
michaeljson 0:3817adfaeb06 583 // sets the initial position of player missile and enemy missile (later updated)
michaeljson 0:3817adfaeb06 584 blk_x = player.player_blk_x+(player.player_width/2);
michaeljson 0:3817adfaeb06 585 blk_y = player.player_blk_y;
michaeljson 0:3817adfaeb06 586 missile_init(&missile, blk_x, blk_y, WHITE);
michaeljson 1:618aa2c4ca6a 587 int e_blk_x = 0;
michaeljson 1:618aa2c4ca6a 588 int e_blk_y = 2;
michaeljson 1:618aa2c4ca6a 589 enemy_missile_init(&enemy_missile, e_blk_x, e_blk_y, WHITE);
michaeljson 0:3817adfaeb06 590
michaeljson 0:3817adfaeb06 591 // prints lives
michaeljson 0:3817adfaeb06 592 uLCD.locate(0,0);
michaeljson 0:3817adfaeb06 593 uLCD.printf("Lives:%i", lives);
michaeljson 0:3817adfaeb06 594
michaeljson 0:3817adfaeb06 595 // prints score
michaeljson 0:3817adfaeb06 596 uLCD.locate(9,0);
michaeljson 0:3817adfaeb06 597 uLCD.printf("Score:%i", score);
michaeljson 0:3817adfaeb06 598
michaeljson 0:3817adfaeb06 599 // game play loop
michaeljson 0:3817adfaeb06 600 while(begin_game)
michaeljson 0:3817adfaeb06 601 {
michaeljson 0:3817adfaeb06 602 // updates score
michaeljson 0:3817adfaeb06 603 temp = score;
michaeljson 0:3817adfaeb06 604 score = (15-numOfEnemies)*15;
michaeljson 0:3817adfaeb06 605
michaeljson 0:3817adfaeb06 606 // prints score if score changes
michaeljson 0:3817adfaeb06 607 if (score != temp)
michaeljson 0:3817adfaeb06 608 {
michaeljson 0:3817adfaeb06 609 uLCD.locate(9,0);
michaeljson 0:3817adfaeb06 610 uLCD.printf("Score:%i", score);
michaeljson 0:3817adfaeb06 611 }
michaeljson 0:3817adfaeb06 612
michaeljson 0:3817adfaeb06 613 // move enemy
michaeljson 0:3817adfaeb06 614 enemy_motion();
michaeljson 0:3817adfaeb06 615
michaeljson 0:3817adfaeb06 616 // checks if player missile passes y-pos of row1
michaeljson 0:3817adfaeb06 617 if (missile.missile_blk_y+1-missile.missile_height <= enemy_1.enemy_blk_y
michaeljson 0:3817adfaeb06 618 && missile.missile_blk_y+1-missile.missile_height >= enemy_1.enemy_blk_y-enemy_1.enemy_height)
michaeljson 0:3817adfaeb06 619 {
michaeljson 0:3817adfaeb06 620 check_hit_enemy_row1();
michaeljson 0:3817adfaeb06 621 }
michaeljson 0:3817adfaeb06 622
michaeljson 0:3817adfaeb06 623 // checks if player missile passes y-pos of row2
michaeljson 0:3817adfaeb06 624 if (missile.missile_blk_y+1-missile.missile_height <= enemy_6.enemy_blk_y
michaeljson 0:3817adfaeb06 625 && missile.missile_blk_y+1-missile.missile_height >= enemy_6.enemy_blk_y-enemy_6.enemy_height)
michaeljson 0:3817adfaeb06 626 {
michaeljson 0:3817adfaeb06 627 check_hit_enemy_row2();
michaeljson 0:3817adfaeb06 628 }
michaeljson 0:3817adfaeb06 629
michaeljson 0:3817adfaeb06 630 // checks if player missile passes y-pos of row3
michaeljson 0:3817adfaeb06 631 if (missile.missile_blk_y+1-missile.missile_height <= enemy_11.enemy_blk_y
michaeljson 0:3817adfaeb06 632 && missile.missile_blk_y+1-missile.missile_height >= enemy_11.enemy_blk_y-enemy_11.enemy_height)
michaeljson 0:3817adfaeb06 633 {
michaeljson 0:3817adfaeb06 634 check_hit_enemy_row3();
michaeljson 0:3817adfaeb06 635 }
michaeljson 0:3817adfaeb06 636
michaeljson 0:3817adfaeb06 637 // Random Enemy Fire
michaeljson 0:3817adfaeb06 638 if (enemy_missile.status == ENEMY_MISSILE_INACTIVE)
michaeljson 0:3817adfaeb06 639 {
michaeljson 0:3817adfaeb06 640 random_attack_gen();
michaeljson 0:3817adfaeb06 641 }
michaeljson 0:3817adfaeb06 642
michaeljson 0:3817adfaeb06 643 // checks if enemy missile passes y-pos of player
michaeljson 0:3817adfaeb06 644 if (enemy_missile.missile_blk_y >= player.player_blk_y
michaeljson 0:3817adfaeb06 645 && enemy_missile.missile_blk_y <= player.player_blk_y+player.player_height)
michaeljson 0:3817adfaeb06 646 {
michaeljson 0:3817adfaeb06 647 check_player_hit();
michaeljson 0:3817adfaeb06 648 }
michaeljson 0:3817adfaeb06 649
michaeljson 0:3817adfaeb06 650 update_missile_pos(&missile); // updates player missile position
michaeljson 0:3817adfaeb06 651 update_enemy_missile_pos(&enemy_missile); // updates enemy missile position
michaeljson 0:3817adfaeb06 652
michaeljson 0:3817adfaeb06 653 // Player Movement checked with navigation switch
michaeljson 0:3817adfaeb06 654 if (myNav.left() && ((player.player_blk_x-3) > 0))
michaeljson 0:3817adfaeb06 655 {
michaeljson 0:3817adfaeb06 656 player_erase(&player);
michaeljson 0:3817adfaeb06 657 player.player_blk_x -= 3;
michaeljson 0:3817adfaeb06 658 player_show(&player);
michaeljson 0:3817adfaeb06 659 }
michaeljson 0:3817adfaeb06 660 else if (myNav.right() && ((player.player_blk_x+3) < (128-player.player_width)))
michaeljson 0:3817adfaeb06 661 {
michaeljson 0:3817adfaeb06 662 player_erase(&player);
michaeljson 0:3817adfaeb06 663 player.player_blk_x += 3;
michaeljson 0:3817adfaeb06 664 player_show(&player);
michaeljson 0:3817adfaeb06 665 }
michaeljson 0:3817adfaeb06 666
michaeljson 0:3817adfaeb06 667 // Player Fire
michaeljson 0:3817adfaeb06 668 if (pb == 0 && missile.status == PLAYER_MISSILE_INACTIVE)
michaeljson 0:3817adfaeb06 669 {
michaeljson 0:3817adfaeb06 670 missile.missile_blk_x = player.player_blk_x+(player.player_width/2);
michaeljson 0:3817adfaeb06 671 missile.missile_blk_y = player.player_blk_y;
michaeljson 0:3817adfaeb06 672 missile.status = PLAYER_MISSILE_ACTIVE;
michaeljson 0:3817adfaeb06 673 }
michaeljson 0:3817adfaeb06 674
michaeljson 0:3817adfaeb06 675 // checks if player destroyed all enemies
michaeljson 0:3817adfaeb06 676 if (numOfEnemies == 0)
michaeljson 0:3817adfaeb06 677 {
michaeljson 0:3817adfaeb06 678 uLCD.cls();
michaeljson 0:3817adfaeb06 679
michaeljson 0:3817adfaeb06 680 bool win = true; // sets win to true, for win screen
michaeljson 0:3817adfaeb06 681 begin_game = false;
michaeljson 0:3817adfaeb06 682
michaeljson 0:3817adfaeb06 683 // displays video clip
michaeljson 0:3817adfaeb06 684 uLCD.cls();
michaeljson 0:3817adfaeb06 685 uLCD.media_init();
michaeljson 0:3817adfaeb06 686 uLCD.set_sector_address(0x00, 0x00);
michaeljson 0:3817adfaeb06 687 uLCD.display_video(0,0);
wminix3 5:b7934866b264 688 Thread::wait(1000); // changed from wait(1) to Thread::wait(1000) since we're using threads -- Brice
michaeljson 0:3817adfaeb06 689
michaeljson 0:3817adfaeb06 690 uLCD.cls();
michaeljson 0:3817adfaeb06 691
michaeljson 0:3817adfaeb06 692 // prints "Congratulations" on uLCD
michaeljson 0:3817adfaeb06 693 uLCD.locate(win_x_pos,win_y_pos);
michaeljson 0:3817adfaeb06 694 uLCD.printf("CONGRATULATIONS!");
michaeljson 0:3817adfaeb06 695
michaeljson 0:3817adfaeb06 696 // prints "Play Again?" and "Press pb..."
michaeljson 0:3817adfaeb06 697 uLCD.locate(startover_x_pos, startover_y_pos);
michaeljson 0:3817adfaeb06 698 uLCD.printf("Play Again?");
michaeljson 0:3817adfaeb06 699 uLCD.locate(startover_x_pos, startover_y_pos+1);
michaeljson 0:3817adfaeb06 700 uLCD.printf("Press pb...");
michaeljson 0:3817adfaeb06 701
michaeljson 0:3817adfaeb06 702 // waits at win screen until pushbutton is pressed
michaeljson 0:3817adfaeb06 703 while (win)
michaeljson 0:3817adfaeb06 704 {
michaeljson 0:3817adfaeb06 705 // if pb is pressed, reset game to start menu
michaeljson 0:3817adfaeb06 706 if (!pb)
michaeljson 0:3817adfaeb06 707 {
michaeljson 0:3817adfaeb06 708 win = false;
wminix3 5:b7934866b264 709 Thread::wait(500); // changed from wait(0.5) to Thread::wait(500) since we're using threads
michaeljson 0:3817adfaeb06 710 }
michaeljson 0:3817adfaeb06 711 }
michaeljson 0:3817adfaeb06 712
michaeljson 0:3817adfaeb06 713 }
michaeljson 0:3817adfaeb06 714
michaeljson 0:3817adfaeb06 715 // checks if player was hit
michaeljson 0:3817adfaeb06 716 if (hit_player)
michaeljson 0:3817adfaeb06 717 {
michaeljson 0:3817adfaeb06 718 // updates lives
michaeljson 0:3817adfaeb06 719 lives -= 1;
wminix3 5:b7934866b264 720 Thread::wait(500); // changed from wait(0.5) to Thread::wait since we're using threads -- Brice
michaeljson 0:3817adfaeb06 721 hit_player = 0;
michaeljson 0:3817adfaeb06 722 player_show(&player);
michaeljson 0:3817adfaeb06 723 player.status = PLAYER_ALIVE;
michaeljson 0:3817adfaeb06 724
michaeljson 0:3817adfaeb06 725 // prints updated lives number
michaeljson 0:3817adfaeb06 726 uLCD.locate(0,0);
michaeljson 0:3817adfaeb06 727 uLCD.printf("Lives:%i", lives);
michaeljson 0:3817adfaeb06 728 }
michaeljson 0:3817adfaeb06 729
michaeljson 0:3817adfaeb06 730 // if player loses all lives or enemy reaches the player
michaeljson 0:3817adfaeb06 731 if (lose || lives == 0)
michaeljson 0:3817adfaeb06 732 {
michaeljson 0:3817adfaeb06 733 begin_game = false; // set to false to end game
michaeljson 0:3817adfaeb06 734 uLCD.cls();
michaeljson 0:3817adfaeb06 735
michaeljson 0:3817adfaeb06 736 gameover = true; // set to go to display gameover screen
michaeljson 0:3817adfaeb06 737
michaeljson 0:3817adfaeb06 738 // prints "GAMEOVER" to uLCD
michaeljson 0:3817adfaeb06 739 uLCD.locate(gameover_x_pos, gameover_y_pos);
michaeljson 0:3817adfaeb06 740 uLCD.printf("GAMEOVER");
wminix3 5:b7934866b264 741 Thread::wait(1000); // changed from wait(1) to thread::wait since we're using threads -- Brice
michaeljson 0:3817adfaeb06 742
michaeljson 0:3817adfaeb06 743 // prints "Play Again?" and "Press pb..."
michaeljson 0:3817adfaeb06 744 uLCD.locate(startover_x_pos, startover_y_pos);
michaeljson 0:3817adfaeb06 745 uLCD.printf("Play Again?");
michaeljson 0:3817adfaeb06 746 uLCD.locate(startover_x_pos, startover_y_pos+1);
michaeljson 0:3817adfaeb06 747 uLCD.printf("Press pb...");
michaeljson 0:3817adfaeb06 748
michaeljson 0:3817adfaeb06 749 // stays in gameover screen until pb is pressed
michaeljson 0:3817adfaeb06 750 while (gameover)
michaeljson 0:3817adfaeb06 751 {
michaeljson 0:3817adfaeb06 752 // if pb is pressed, game is reset to the game menu screen
michaeljson 0:3817adfaeb06 753 if (!pb)
michaeljson 0:3817adfaeb06 754 {
michaeljson 0:3817adfaeb06 755 gameover = false;
michaeljson 0:3817adfaeb06 756 game_menu = true;
wminix3 5:b7934866b264 757 Thread::wait(500); // changed wait(0.5) to Thread::wait since we're using threads -- Brice
wminix3 5:b7934866b264 758 }
wminix3 5:b7934866b264 759 }
wminix3 5:b7934866b264 760 }
wminix3 5:b7934866b264 761
wminix3 5:b7934866b264 762 }
wminix3 5:b7934866b264 763 // game play loop
wminix3 5:b7934866b264 764 while(begin_game2)
wminix3 5:b7934866b264 765 {
wminix3 5:b7934866b264 766 // updates score
wminix3 5:b7934866b264 767 temp = score;
wminix3 5:b7934866b264 768 score = (15-numOfEnemies)*15;
wminix3 5:b7934866b264 769
wminix3 5:b7934866b264 770 // prints score if score changes
wminix3 5:b7934866b264 771 if (score != temp)
wminix3 5:b7934866b264 772 {
wminix3 5:b7934866b264 773 uLCD.locate(9,0);
wminix3 5:b7934866b264 774 uLCD.printf("Score:%i", score);
wminix3 5:b7934866b264 775 }
wminix3 5:b7934866b264 776
wminix3 5:b7934866b264 777 // move enemy
wminix3 5:b7934866b264 778 enemy_motion();
wminix3 5:b7934866b264 779
wminix3 5:b7934866b264 780 // checks if player missile passes y-pos of row1
wminix3 5:b7934866b264 781 if (missile.missile_blk_y+1-missile.missile_height <= enemy_1.enemy_blk_y
wminix3 5:b7934866b264 782 && missile.missile_blk_y+1-missile.missile_height >= enemy_1.enemy_blk_y-enemy_1.enemy_height)
wminix3 5:b7934866b264 783 {
wminix3 5:b7934866b264 784 check_hit_enemy_row1();
wminix3 5:b7934866b264 785 }
wminix3 5:b7934866b264 786
wminix3 5:b7934866b264 787 // checks if player missile passes y-pos of row2
wminix3 5:b7934866b264 788 if (missile.missile_blk_y+1-missile.missile_height <= enemy_6.enemy_blk_y
wminix3 5:b7934866b264 789 && missile.missile_blk_y+1-missile.missile_height >= enemy_6.enemy_blk_y-enemy_6.enemy_height)
wminix3 5:b7934866b264 790 {
wminix3 5:b7934866b264 791 check_hit_enemy_row2();
wminix3 5:b7934866b264 792 }
wminix3 5:b7934866b264 793
wminix3 5:b7934866b264 794 // checks if player missile passes y-pos of row3
wminix3 5:b7934866b264 795 if (missile.missile_blk_y+1-missile.missile_height <= enemy_11.enemy_blk_y
wminix3 5:b7934866b264 796 && missile.missile_blk_y+1-missile.missile_height >= enemy_11.enemy_blk_y-enemy_11.enemy_height)
wminix3 5:b7934866b264 797 {
wminix3 5:b7934866b264 798 check_hit_enemy_row3();
wminix3 5:b7934866b264 799 }
wminix3 5:b7934866b264 800
wminix3 5:b7934866b264 801 // Random Enemy Fire
wminix3 5:b7934866b264 802 if (enemy_missile.status == ENEMY_MISSILE_INACTIVE)
wminix3 5:b7934866b264 803 {
wminix3 5:b7934866b264 804 random_attack_gen();
wminix3 5:b7934866b264 805 }
wminix3 5:b7934866b264 806
wminix3 5:b7934866b264 807 // checks if enemy missile passes y-pos of player
wminix3 5:b7934866b264 808 if (enemy_missile.missile_blk_y >= player.player_blk_y
wminix3 5:b7934866b264 809 && enemy_missile.missile_blk_y <= player.player_blk_y+player.player_height)
wminix3 5:b7934866b264 810 {
wminix3 5:b7934866b264 811 check_player_hit();
wminix3 5:b7934866b264 812 }
wminix3 5:b7934866b264 813
wminix3 5:b7934866b264 814 update_missile_pos(&missile); // updates player missile position
wminix3 5:b7934866b264 815 update_enemy_missile_pos(&enemy_missile); // updates enemy missile position
wminix3 5:b7934866b264 816
wminix3 5:b7934866b264 817 // Player Movement checked with navigation switch
wminix3 5:b7934866b264 818 if (myNav.left() && ((player.player_blk_x-3) > 0))
wminix3 5:b7934866b264 819 {
wminix3 5:b7934866b264 820 player_erase(&player);
wminix3 5:b7934866b264 821 player.player_blk_x -= 3;
wminix3 5:b7934866b264 822 player_show(&player);
wminix3 5:b7934866b264 823 }
wminix3 5:b7934866b264 824 else if (myNav.right() && ((player.player_blk_x+3) < (128-player.player_width)))
wminix3 5:b7934866b264 825 {
wminix3 5:b7934866b264 826 player_erase(&player);
wminix3 5:b7934866b264 827 player.player_blk_x += 3;
wminix3 5:b7934866b264 828 player_show(&player);
wminix3 5:b7934866b264 829 }
wminix3 5:b7934866b264 830
wminix3 5:b7934866b264 831 // Player Fire
wminix3 5:b7934866b264 832 if (pb == 0 && missile.status == PLAYER_MISSILE_INACTIVE)
wminix3 5:b7934866b264 833 {
wminix3 5:b7934866b264 834 missile.missile_blk_x = player.player_blk_x+(player.player_width/2);
wminix3 5:b7934866b264 835 missile.missile_blk_y = player.player_blk_y;
wminix3 5:b7934866b264 836 missile.status = PLAYER_MISSILE_ACTIVE;
wminix3 5:b7934866b264 837 }
wminix3 5:b7934866b264 838
wminix3 5:b7934866b264 839 // checks if player destroyed all enemies
wminix3 5:b7934866b264 840 if (numOfEnemies == 0)
wminix3 5:b7934866b264 841 {
wminix3 5:b7934866b264 842 uLCD.cls();
wminix3 5:b7934866b264 843
wminix3 5:b7934866b264 844 bool win = true; // sets win to true, for win screen
wminix3 5:b7934866b264 845 numWins += 1;
wminix3 5:b7934866b264 846 if (numWins == 3) {
wminix3 5:b7934866b264 847 begin_game2 = false;
wminix3 5:b7934866b264 848 two_player_win = true;
wminix3 5:b7934866b264 849 }
wminix3 5:b7934866b264 850
wminix3 5:b7934866b264 851 // displays video clip
wminix3 5:b7934866b264 852 uLCD.cls();
wminix3 5:b7934866b264 853 uLCD.media_init();
wminix3 5:b7934866b264 854 uLCD.set_sector_address(0x00, 0x00);
wminix3 5:b7934866b264 855 uLCD.display_video(0,0);
wminix3 5:b7934866b264 856 Thread::wait(1000); // changed from wait(1)
wminix3 5:b7934866b264 857
wminix3 5:b7934866b264 858 uLCD.cls();
wminix3 5:b7934866b264 859 if (!two_player_win) {
wminix3 5:b7934866b264 860 // prints "Number of Wins" on uLCD -- Brice. A step towards victory, not a complete victory.
wminix3 5:b7934866b264 861 uLCD.locate(win_x_pos,win_y_pos);
wminix3 5:b7934866b264 862 uLCD.printf("YOU HAVE %d WINS!", numWins);
wminix3 5:b7934866b264 863
wminix3 5:b7934866b264 864 // prints "Continue?" and "Press pb..." Keep trying to get points --Brice.
wminix3 5:b7934866b264 865 uLCD.locate(startover_x_pos, startover_y_pos);
wminix3 5:b7934866b264 866 uLCD.printf("Continue?");
wminix3 5:b7934866b264 867 uLCD.locate(startover_x_pos, startover_y_pos+1);
wminix3 5:b7934866b264 868 uLCD.printf("Press pb...");
wminix3 5:b7934866b264 869
wminix3 5:b7934866b264 870 // waits at win screen until pushbutton is pressed
wminix3 5:b7934866b264 871 while (win)
wminix3 5:b7934866b264 872 {
wminix3 5:b7934866b264 873 // if pb is pressed, reset game to start menu
wminix3 5:b7934866b264 874 if (!pb)
wminix3 5:b7934866b264 875 {
wminix3 5:b7934866b264 876 win = false;
wminix3 5:b7934866b264 877 Thread::wait(500); // changed from wait(0.5) since we have threads -- Brice
wminix3 5:b7934866b264 878 }
wminix3 5:b7934866b264 879 }
wminix3 5:b7934866b264 880 } else {
wminix3 5:b7934866b264 881 // prints CONGRATULATIONS! since player has won. --Brice
wminix3 5:b7934866b264 882 uLCD.locate(win_x_pos,win_y_pos);
wminix3 5:b7934866b264 883 uLCD.printf("CONGRATULATIONS!");
wminix3 5:b7934866b264 884
wminix3 5:b7934866b264 885 // prints "Return to menu?" and "Press pb..." --Brice.
wminix3 5:b7934866b264 886 uLCD.locate(startover_x_pos, startover_y_pos);
wminix3 5:b7934866b264 887 uLCD.printf("Return to menu?");
wminix3 5:b7934866b264 888 uLCD.locate(startover_x_pos, startover_y_pos+1);
wminix3 5:b7934866b264 889 uLCD.printf("Press pb...");
wminix3 5:b7934866b264 890
wminix3 5:b7934866b264 891 // waits at win screen until pushbutton is pressed
wminix3 5:b7934866b264 892 while (two_player_win)
wminix3 5:b7934866b264 893 {
wminix3 5:b7934866b264 894 // if pb is pressed, reset game to start menu
wminix3 5:b7934866b264 895 if (!pb)
wminix3 5:b7934866b264 896 {
wminix3 5:b7934866b264 897 two_player_win = false; // close win -- Brice
wminix3 5:b7934866b264 898 game_menu = true; // go back to menu -- Brice
wminix3 5:b7934866b264 899 Thread::wait(500); // changed from wait(0.5) since we have threads -- Brice
wminix3 5:b7934866b264 900 }
wminix3 5:b7934866b264 901 }
wminix3 5:b7934866b264 902 }
wminix3 5:b7934866b264 903 }
wminix3 5:b7934866b264 904
wminix3 5:b7934866b264 905 // checks if player was hit
wminix3 5:b7934866b264 906 if (hit_player)
wminix3 5:b7934866b264 907 {
wminix3 5:b7934866b264 908 // updates lives
wminix3 5:b7934866b264 909 lives -= 1;
wminix3 5:b7934866b264 910 Thread::wait(500); // changed from wait(0.5) since we're using threads --Brice
wminix3 5:b7934866b264 911 hit_player = 0;
wminix3 5:b7934866b264 912 player_show(&player);
wminix3 5:b7934866b264 913 player.status = PLAYER_ALIVE;
wminix3 5:b7934866b264 914
wminix3 5:b7934866b264 915 // prints updated lives number
wminix3 5:b7934866b264 916 uLCD.locate(0,0);
wminix3 5:b7934866b264 917 uLCD.printf("Lives:%i", lives);
wminix3 5:b7934866b264 918 }
wminix3 5:b7934866b264 919
wminix3 5:b7934866b264 920 // if player loses all lives or enemy reaches the player
wminix3 5:b7934866b264 921 if (lose || lives == 0)
wminix3 5:b7934866b264 922 {
wminix3 5:b7934866b264 923 //begin_game = false; // set to false to end game -- not needed in two-player, just keep playing until a player reaches 3 wins -- Brice
wminix3 5:b7934866b264 924 uLCD.cls();
wminix3 5:b7934866b264 925
wminix3 5:b7934866b264 926 gameover = true; // set to go to display gameover screen
wminix3 5:b7934866b264 927
wminix3 5:b7934866b264 928 // prints "GAMEOVER" to uLCD
wminix3 5:b7934866b264 929 uLCD.locate(gameover_x_pos, gameover_y_pos);
wminix3 5:b7934866b264 930 uLCD.printf("YOU DIED");
wminix3 5:b7934866b264 931 Thread::wait(1000); // changed from wait(1) since we have multiple threads -- Brice
wminix3 5:b7934866b264 932
wminix3 5:b7934866b264 933 // prints "Play Again?" and "Press pb..."
wminix3 5:b7934866b264 934 uLCD.locate(startover_x_pos, startover_y_pos);
wminix3 5:b7934866b264 935 uLCD.printf("Keep trying!");
wminix3 5:b7934866b264 936 uLCD.locate(startover_x_pos, startover_y_pos+1);
wminix3 5:b7934866b264 937 uLCD.printf("Press pb...");
wminix3 5:b7934866b264 938
wminix3 5:b7934866b264 939 // stays in gameover screen until pb is pressed
wminix3 5:b7934866b264 940 while (gameover)
wminix3 5:b7934866b264 941 {
wminix3 5:b7934866b264 942 // if pb is pressed, game is reset to the game menu screen
wminix3 5:b7934866b264 943 if (!pb)
wminix3 5:b7934866b264 944 {
wminix3 5:b7934866b264 945 gameover = false;
wminix3 5:b7934866b264 946 //game_menu = true; // removed since other player must win three times for game to be over.
wminix3 5:b7934866b264 947 Thread::wait(500); // changed from wait(0.5) since we have threads.
wminix3 5:b7934866b264 948 }
wminix3 5:b7934866b264 949 }
wminix3 5:b7934866b264 950 }
wminix3 5:b7934866b264 951 if (two_player_lose)
wminix3 5:b7934866b264 952 {
wminix3 5:b7934866b264 953 begin_game2 = false; // set to false to end game. End game since other player won.
wminix3 5:b7934866b264 954 uLCD.cls();
wminix3 5:b7934866b264 955
wminix3 5:b7934866b264 956 gameover = true; // set to go to display gameover screen
wminix3 5:b7934866b264 957
wminix3 5:b7934866b264 958 // prints "GAMEOVER" to uLCD
wminix3 5:b7934866b264 959 uLCD.locate(gameover_x_pos, gameover_y_pos);
wminix3 5:b7934866b264 960 uLCD.printf("GAMEOVER");
wminix3 5:b7934866b264 961 Thread::wait(1000); // thread wait since we have multiple threads -- Brice
wminix3 5:b7934866b264 962
wminix3 5:b7934866b264 963 // prints "Return to menu?" and "Press pb..."
wminix3 5:b7934866b264 964 uLCD.locate(startover_x_pos, startover_y_pos);
wminix3 5:b7934866b264 965 uLCD.printf("Return to menu?");
wminix3 5:b7934866b264 966 uLCD.locate(startover_x_pos, startover_y_pos+1);
wminix3 5:b7934866b264 967 uLCD.printf("Press pb...");
wminix3 5:b7934866b264 968
wminix3 5:b7934866b264 969 // stays in gameover screen until pb is pressed
wminix3 5:b7934866b264 970 while (gameover)
wminix3 5:b7934866b264 971 {
wminix3 5:b7934866b264 972 // if pb is pressed, game is reset to the game menu screen
wminix3 5:b7934866b264 973 if (!pb)
wminix3 5:b7934866b264 974 {
wminix3 5:b7934866b264 975 gameover = false;
wminix3 5:b7934866b264 976 two_player_lose = false; // end lose.
wminix3 5:b7934866b264 977 game_menu = true; // removed since other player must win three times for game to be over.
wminix3 5:b7934866b264 978 Thread::wait(500); // changed from wait(0.5) since we have threads.
michaeljson 0:3817adfaeb06 979 }
michaeljson 0:3817adfaeb06 980 }
michaeljson 0:3817adfaeb06 981 }
michaeljson 0:3817adfaeb06 982
michaeljson 0:3817adfaeb06 983 }
michaeljson 0:3817adfaeb06 984 }
michaeljson 0:3817adfaeb06 985 }