ECE2035 class project
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed wave_player
Fork of missile_command by
main.cpp
- Committer:
- slin77
- Date:
- 2014-11-17
- Revision:
- 5:3f356592ee9c
- Parent:
- 4:0dc720aa3c71
File content as of revision 5:3f356592ee9c:
/* Gatech ECE2035 2014 FALL missile command
* Copyright (c) 2014 Gatech ECE2035
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
/** @file main.cpp */
// Include header files for platform
#include "mbed.h"
#include "uLCD_4DGL.h"
#include "wave_player.h"
#include "SDFileSystem.h"
#include "segment_display.h"
// Include header files for missile command project
#include "globals.h"
#include "city_landscape_public.h"
#include "missile_public.h"
#include "player.h"
#include <stdio.h>
#include <stdlib.h>
// Platform initialization
DigitalIn left_pb(p23); DigitalIn right_pb(p21); DigitalIn fire_pb(p22);
DigitalIn fouth_pb(p24);
uLCD_4DGL uLCD(p28,p27,p29);
AnalogOut DACout(p18);
wave_player waver(&DACout);
SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sck, cs
// Example of the decleration of your implementation
void playSound(char * wav);
void check_interception();
int within_range(MISSILE m, ANTIMISSILE a);
int check_destruction_range(MISSILE m,CITY c);
void check_city_destruction();
void display_victory();
void display_failure();
void advance_level();
PLAYER current_player;
CITY city_record[];
MISSILE missile_record[];
ANTIMISSILE am[];
EXPLOSION ex[];
int number_of_cities = 4;
/** Main() is where you start your implementation
@brief The hints of implementation are in the comments. <br>
@brief You are expected to implement your code in main.cpp and player.cpp. But you could modify any code if you want to make the game work better.
*/
int main()
{
setup_sequence();
seg_driver_initialize();
city_landscape_init(number_of_cities);
// Initialize the buttons
left_pb.mode(PullUp); // The variable left_pb will be zero when the pushbutton for moving the player left is pressed
right_pb.mode(PullUp); // The variable rightt_pb will be zero when the pushbutton for moving the player right is pressed
fire_pb.mode(PullUp);
fouth_pb.mode(PullUp); //the variable fouth_pb will be zero when the pushbutton for firing a missile is pressed
player_init();//initalize the player
antimissile_init();
explosion_init();
//display the game menu
int k;
while (1) {
char str1[] = "Easy";
char str2[] = "Medium";
char str3[] = "hard";
if (right_pb == 0) {
k++;
}
k = k % 3;
if(k == 1) {
uLCD.text_string(str1, 3, 3, FONT_7X8, GREEN);
} else {
uLCD.text_string(str1,3, 3, FONT_7X8, WHITE);
}
if(k == 2) {
uLCD.text_string(str2, 3, 4, FONT_7X8, GREEN);
} else {
uLCD.text_string(str2, 3, 4, FONT_7X8, WHITE);
}
if(k == 0) {
uLCD.text_string(str3, 3, 5, FONT_7X8, GREEN);
} else {
uLCD.text_string(str3, 3, 5, FONT_7X8, WHITE);
}
if (fire_pb == 0) {
if (k == 0) {
current_player.current_level = 3;
} else {
current_player.current_level = k;
}
set_missile_speed(5 - current_player.current_level);
set_missile_interval(10 - current_player.current_level);
uLCD.text_string(str1, 3, 3, FONT_7X8, BACKGROUND_COLOR);
uLCD.text_string(str2, 3, 4, FONT_7X8, BACKGROUND_COLOR);
uLCD.text_string(str3, 3, 5, FONT_7X8, BACKGROUND_COLOR);
char go[] = "READY!";
uLCD.text_string(go, 6, 6, FONT_7X8, GREEN);
playSound("/sd/wavfiles/BUZZER.wav");
uLCD.text_string(go, 6, 6, FONT_7X8, BACKGROUND_COLOR);
break;
}
}
/// 2.Begin the game loop
while(1){
current_player.timer++;
char str[] = {'s', 'c', 'o', 'r', 'e', ':', '0' + current_player.score};
char life_str[] = {'l','i','f', 'e',':', '0' + current_player.life};
char level_str[] = {'l', 'e', 'v', 'e', 'l' ,':','0' + current_player.current_level};
uLCD.text_string(str, 11, 0, FONT_7X8, WHITE);
uLCD.text_string(life_str, 0, 1, FONT_7X8, WHITE);
uLCD.text_string(level_str, 0, 0, FONT_7X8, GREEN);
seg_driver(current_player.am_remain);
/// 3.Example of drawing the player
player_draw(); // draws a player at the center of the screen
draw_antimissiles();
/// 4.Example of calling the missile API.
missile_generator(); /// It updates all incoming missiles on the screen
update_explosion();
draw_explosion();
if (current_player.timer % 150 == 0 && current_player.life < 6) {
current_player.life++;
}
/// 5.Implement the code to get user input and update the player
/// -[Hint] You could see city_landscape.cpp to get some ideas about how to implement your player. <br>
if(left_pb == 0){
/// -[Hint] Implement the code to move player left <br>
player_move_left();
}
if(right_pb == 0){
/// -[Hint] Implement the code to move player right <br>
player_move_right();
}
if(fire_pb == 0){
/// -[Hint] Implement the code to fire player-missile <br>
shoot();
// [Demo of play sound file]
//playSound("/sd/wavfiles/BUZZER.wav");
}
if(fouth_pb == 0 && current_player.protector_num > 0) {
current_player.protector.is_active = 1;
current_player.protector.timer = 0;
current_player.protector_num--;
}
if(left_pb == 0 && right_pb == 0 && fouth_pb != 0 && fire_pb != 0) {
big_shoot();
}
update_protector();
update_antimissile_positions();
check_interception();
check_city_destruction();
/// 6.Implement the code to draw a user missile
/// -[Hint] You could see missile.cpp or missile_generator() for your reference <br>
if (current_player.score > 9 || (!left_pb && !right_pb && !fire_pb && !fouth_pb)) {
advance_level();
//display_victory();
} else if(!is_any_left()) {
current_player.life--;
city_landscape_init(number_of_cities);
} else if(current_player.current_level >= 4) {
display_victory();
break;
}
if (current_player.life == 0) {
display_failure();
break;
}
/// 7.Implement the code to detect the collision between missiles and cities
/// -[Hint] You could use city_get_info() and missile_get_info() <br>
/// -[Hint] You could use missile_set_exploded() to notify the missile module that the missile was exploded. <br>
/// -[Hint] You need to check which city was hit by the missile, and call city_destroy() to destroy it. <br>
/// -[Hint] You might also check whether the missile hit the land <br>
/// 8.Implement the code to detect a collision between player-missiles and incoming missiles
/// -[Hint] You could use missile_get_info() to get the position of incoming missile <br>
/// -[Hint] You could use missile_set_exploded() to notify the missile module that the missile was exploded. <br>
/// -[Hint] You might also check whether the missile hit the player <br>
/// 9.Implement the code to check the end of game
/// -[Hint] For example, if there is no more city, it should be gameover. <br>
}
}
// Example of implementation of your functions
void playSound(char * wav)
{
// open wav file
FILE *wave_file;
wave_file=fopen(wav,"r");
// play wav file
waver.play(wave_file);
// close wav file
fclose(wave_file);
}
void advance_level() {
current_player.timer = 0;
current_player.current_level++;
set_missile_speed(5 - current_player.current_level);
set_missile_interval(10 - current_player.current_level);
city_landscape_init(4);
current_player.score = 0;
current_player.protector_num = 3;
char str[] = "Enter NEXT LEVEL";
uLCD.text_string(str, 2, 6, FONT_7X8, WHITE);
wait(1);
uLCD.text_string(str, 2, 6, FONT_7X8, BACKGROUND_COLOR);
int i;
for (i = 0;i < MAX_NUM_MISSILE;i++) {
missile_set_exploded(i);
}
}
void check_interception() {
int i,j,k;
for (i = 0;i < MAX_NUM_MISSILE; i++) {
for (j = 0; j < current_player.max_am; j++) {
if (missile_record[i].status == MISSILE_ACTIVE && am[j].status == ACTIVE
&& within_range(missile_record[i], am[j])) {
for (k = 0; k < current_player.max_am; k++) {
if (ex[k].exploded == NO) {
//find a unused explosion activate it
ex[k].x = am[j].x;
ex[k].y = am[j].y;
ex[k].exploded = YES;
ex[k].color = PLAYER_COLOR;
break;
}
}
//set both the missile and anti missile to DEACTIVE
missile_record[i].status = MISSILE_EXPLODED;
am[j].status = DEACTIVE;
current_player.am_remain++;
current_player.score++;
}
}
}
}
void check_city_destruction() {
int i,j,k;
for (i = 0; i < MAX_NUM_MISSILE; i++) {
for(j = 0;j < number_of_cities;j++) {
if (missile_record[i].status == MISSILE_ACTIVE && city_get_info(j).status == EXIST && check_destruction_range(missile_record[i], city_get_info(j))) {
for (k = 0; k < current_player.max_am; k++) {
if (ex[k].exploded == NO) {
//find a unused explosion activate it
ex[k].x = missile_record[i].x;
ex[k].y = missile_record[i].y;
ex[k].exploded = YES;
ex[k].color = LANDSCAPE_COLOR;
break;
}
}
missile_record[i].status = MISSILE_EXPLODED;
city_destroy(j);
}
}
}
}
void display_victory() {
uLCD.cls();
char str[] = "You Are Winnner";
uLCD.text_string(str, 2, 9, FONT_7X8, WHITE);
playSound("/sd/wavfiles/ding_dong.wav");
}
void display_failure() {
uLCD.cls();
char str[] = "Game Over";
uLCD.text_string(str, 3, 9, FONT_7X8, WHITE);
playSound("/sd/wavfiles/ding_dong.wav");
}
int check_destruction_range(MISSILE m,CITY c) {
if(c.x <= m.x
&& m.x <= c.x + c.width
&& c.y <= m.y
&& m.y <= c.y + c.height) {
return 1;
}
return 0;
}
int within_range(MISSILE m, ANTIMISSILE a) {
if(m.x - 2 <=a.x
&& a.x <= m.x + 2
&& m.y - 2 <=a.y
&& a.y <= m.y + 2) {
return 1;
}
return 0;
}
