Browse Source

Merge branch 'playagain_enhancement' of matteozeccolimarazzini/invaders into master

blue 4 years ago
parent
commit
681446999f
4 changed files with 116 additions and 156 deletions
  1. 38 63
      bossrush.cpp
  2. 36 33
      functions.cpp
  3. 7 3
      functions.hpp
  4. 35 57
      invaders.cpp

+ 38 - 63
bossrush.cpp

@@ -70,7 +70,7 @@ int main(int argc,char** argv)
 	double shootrate;				  	//probability of an enemy shooting a bomb 
 	int command;						//keyboard input
 	int score=0;					   	//score: gain +100 when an enemy is destroyed and +50 when a bomb is destroyed
-	char level='1';						//difficulty level
+	int level=1;						//difficulty level
 	
 	create_std_bosses();
 	std::string bossname1=getenv("HOME");
@@ -134,11 +134,12 @@ int main(int argc,char** argv)
 	for(w_vec::iterator it=walls.begin(); it!=walls.end(); ++it, ++i)				//creating walls (in a quite symmetric pattern)
 		it->create((i+1)*(C/(3*WALLS_NUM+1))+i*(2*C/(3*WALLS_NUM+1)),2*R/3,(int)min(6,2*C/(3*WALLS_NUM+1)),2,3);
 
-	choose_level_bossrush(shootrate,refresh_time,level,commands);
+	level = choose_level_bossrush(commands);
+	setup_level_bossrush(level, shootrate, refresh_time);
 	
 	player1.set_commands(commands);
 	
-	if(atoi(&level)<3)
+	if(level<3)
 		player1.weaponclass=2;
 
 	erase();
@@ -230,7 +231,7 @@ int main(int argc,char** argv)
 		
 		if(boss1.health<=0)
 			if(num<4){
-				score+=250*atoi(&level)*(num+1);
+				score+=250*level*(num+1);
 				for(int i=max(0,boss1.y-1);i<min(R-1,boss1.y+boss1.height+1);i++)
 					for(int j=0;j<C;j++)
 						mvaddch(i,j,' ');
@@ -258,73 +259,47 @@ int main(int argc,char** argv)
 			}
 
 		///////ENDGAME CHECKS               
-		if(boss1.health<1 && num==4)  					//YOU WON!!
+		if((boss1.health<1 && num==4) || gameover(player1,bombs))
 		{
-			Victory_bossrush(boss1.name,score,level,chflag);
-			
 			WINDOW *replay;
-			
-			replay=newwin(3,25,26,20);
-			box(replay,ACS_VLINE,ACS_HLINE);
-			
-			if(playagain(replay))                           //playagain() returns true if player wants to play again, false otherwise
+			if (boss1.health<1 && num==4)
+			{
+				Victory_bossrush(boss1.name,score,level,chflag);
+				replay=newwin(3,25,26,20);
+			} else
 			{
-				delwin(replay);
-				timeout(500);
-				score=0;
-				erase();
-				refresh();
-				choose_level_bossrush(shootrate, refresh_time,level,commands);
-				reset(player1, enemies, boss1, bullets, bombs, walls, powerups,rockets, level,chflag); // reset box, player, enemy and deletes all bullets and bombs
-				resetbosses(bosses,boss1,player1);
-				num=0;
-				if(atoi(&level)<3)
-					player1.weaponclass=2;
-				erase();
-				refresh();
-				continue;  
+				Defeat(score);
+				replay=newwin(3,25,17,20);
 			}
-			else { 
-				endwin();
-				cout<<lightgreen<<"Game exited correctly."<<none<<endl;
-				return 0;
-			}	
-		}
-				
-			
-		if(gameover(player1,bombs))
-		{	
-			Defeat(score);
-			
-			WINDOW* replay;
-		
-			replay=newwin(3,25,17,20);
 			box(replay,ACS_VLINE,ACS_HLINE);
-			
-			if(playagain(replay))                                        //playagain() returns true if player wants to play again, false otherwise
+
+			switch(char choice = playagain(replay))	// playagain() returns 'y'/'n'/'q'
 			{
-				delwin(replay);
-				timeout(500);
-				score=0;
-				erase();
-				refresh();
-				choose_level_bossrush(shootrate, refresh_time, level,commands);
-				reset(player1, enemies, boss1, bullets, bombs, walls, powerups,rockets, level,chflag);       // reset box, player, enemy and delete all bullets and bombs
-				resetbosses(bosses,boss1,player1);
-				num=0;
-				if(atoi(&level)<3)
-					player1.weaponclass=2;
-				erase();
-				refresh();
-				continue;  
+				case 'y':
+				case 'n':
+					delwin(replay);
+					timeout(500);
+					score=0;
+					erase();
+					refresh();
+					if(choice=='n')
+						level = choose_level_bossrush(commands);
+					setup_level_bossrush(level, shootrate, refresh_time);
+					reset(player1, enemies, boss1, bullets, bombs, walls, powerups,rockets, level,chflag); // reset box, player, enemy and deletes all bullets and bombs
+					resetbosses(bosses,boss1,player1);
+					num=0;
+					if(level<3)
+						player1.weaponclass=2;
+					erase();
+					refresh();
+					continue;	// Go to the beginning of the main loop
+				case 'q':
+					endwin();
+					cout<<lightgreen<<"Game exited correctly."<<none<<endl;
+					return 0;
 			}
-			else { 
-				endwin();
-				cout<<lightgreen<<"Game exited correctly."<<none<<endl;
-				return 0;
-			}		
 		}
-		
+
 		write_score(Score,score);
 	
 		if(boss1.alive){

+ 36 - 33
functions.cpp

@@ -222,10 +222,11 @@ void print_info(){
 }
 
 
-void choose_level(double& shootr, int& refresh_t, boss& boss1, char& level, int& enemy_num, int* commands)
+int choose_level(int* commands)
 {
 	std::string phrase;
 	phrase=choose_phrase();
+	char input;
 	
 	do{
 		print_title();
@@ -253,39 +254,41 @@ void choose_level(double& shootr, int& refresh_t, boss& boss1, char& level, int&
 
 		timeout(80);
 		
-		level=tolower(getch());
+		input=tolower(getch());
 	
-		if(!(atoi(&level)==1 || atoi(&level)==2 || atoi(&level)==3 || atoi(&level)==4 || level=='i' || level=='h' || level=='r' || level =='q') && level!=ERR){
+		if(!(input=='1' || input=='2' || input=='3' || input=='4' || input=='i' || input=='h' || input=='r' || input =='q') && input!=ERR){
 			attron(COLOR_PAIR(2));
 			mvprintw(14,0,"Bad input. Please choose a number within 1 and 4.");
 			attron(COLOR_PAIR(0));	
 		}
 		
-		if(level=='i')
+		if(input=='i')
 			print_info();
 		
-		if(level=='h')
+		if(input=='h')
 			print_scores();
 
-		if(level=='r')
+		if(input=='r')
 			phrase=choose_phrase();
 			
-		if(level=='c')
+		if(input=='c')
 			change_commands(commands);
 		
-		if(level=='q'){
+		if(input=='q'){
 			endwin();
 			cout<<lightgreen<<"Game exited correctly."<<none<<endl;
 			exit(1);
 		}
 		
-	}while(!(atoi(&level)==1 || atoi(&level)==2 || atoi(&level)==3 || atoi(&level)==4));
-	
-	refresh_t=0;
+	}while(!(input=='1' || input=='2' || input=='3' || input=='4'));
 	
 	create_folder(0);
-	
-	switch(atoi(&level))        //setting game parameters
+	return input - '0';
+}
+
+void setup_level(int level, double& shootr, int& refresh_t, boss& boss1, int& enemy_num, int* commands)
+{
+	switch(level)        //setting game parameters
 	{
 		case 1:
 		{
@@ -422,22 +425,18 @@ void load_enemies(e_list& enemies,int enemy_num)
 	}
 }
 		
-bool playagain(WINDOW* replay)     
+char playagain(WINDOW* replay)
 {
 	char answer;
 	
 	do
 	{
 		wattron(replay,COLOR_PAIR(2));
-		mvwprintw(replay,1,4,"Play again? [y/n] ");
+		mvwprintw(replay,1,3,"Play again? [y/n/q] ");
 		answer=tolower(wgetch(replay));
-		if(answer=='y')
-			return true;
-		if(answer=='n')
-			return false;
-	}while(answer!='y'&&answer!='n');
+	}while(answer!='y' && answer!='n' && answer!='q');
 	
-	return false;	//just to get rid of the compiler's warning
+	return answer;
 }
 
 bool gameover(player& _player,b_list& bombs)		//Checks if a bomb/enemy/boss hit the player.
@@ -1368,10 +1367,11 @@ void pkill_music(pthread_t thread){
 				
 //=========BOSSRUSH FUNCTIONS=======================
 
-void choose_level_bossrush(double& shootr, int& refresh_t, char& level,int* commands)	//returns ENEMY_NUM
+int choose_level_bossrush(int* commands)
 {
 	std::string phrase;
 	phrase=choose_phrase();
+	char input;
 	
 	do{
 		print_title();
@@ -1399,37 +1399,40 @@ void choose_level_bossrush(double& shootr, int& refresh_t, char& level,int* comm
 
 		timeout(80);
 		
-		level=tolower(getch());
+		input=tolower(getch());
 	
-		if(!(atoi(&level)==1 || atoi(&level)==2 || atoi(&level)==3 || atoi(&level)==4 || level=='i' || level=='h' || level=='r' || level=='q') && level!=ERR){
+		if(!(input=='1' || input=='2' || input=='3' || input=='4' || input=='i' || input=='h' || input=='r' || input=='q') && input!=ERR){
 			attron(COLOR_PAIR(2));
 			mvprintw(14,0,"Bad input. Please choose a number within 1 and 4.");
 			attron(COLOR_PAIR(0));	
 		}
 		
-		if(level=='i')
+		if(input=='i')
 			print_info();
 		
-		else if(level=='h')
+		else if(input=='h')
 			print_scores_bossrush();
 		
-		else if(level=='r')
+		else if(input=='r')
 			phrase=choose_phrase();
 		
-		else if(level=='c')
+		else if(input=='c')
 			change_commands(commands);
 			
-		else if(level=='q'){
+		else if(input=='q'){
 			endwin();
 			cout<<lightgreen<<"Game exited correctly."<<none<<endl;
 			exit(1);
 		}
 		
-	}while(!(atoi(&level)==1 || atoi(&level)==2 || atoi(&level)==3 || atoi(&level)==4));
-	
-	refresh_t=0;
+	}while(!(input=='1' || input=='2' || input=='3' || input=='4'));
 	
-	switch(atoi(&level))        //setting game parameters
+	return input - '0';
+}
+
+void setup_level_bossrush(int level, double& shootr, int& refresh_t)
+{
+	switch(level)        //setting game parameters
 	{
 		case 1:
 		{

+ 7 - 3
functions.hpp

@@ -54,13 +54,15 @@ void print_info();
 
 void print_scores();
 
-void choose_level(double& shootr, int& refresh_t, boss &boss1, char& level, int& enemy_num,int* commands);
+int choose_level(int* commands);
+
+void setup_level(int level, double& shootr, int& refresh_t, boss& boss1, int& enemy_num, int* commands);
 
 void change_commands(int* commands);
 
 void load_enemies(e_list& enemies,int enemy_num);
 
-bool playagain(WINDOW*);
+char playagain(WINDOW*);
 
 bool gameover(player&,b_list&);
 
@@ -80,7 +82,9 @@ void Victory(std::string,int,char,int);
 
 void Defeat(int);
 
-void choose_level_bossrush(double& shootr,int& refresh_t,char& level,int* commands);
+int choose_level_bossrush(int* commands);
+
+void setup_level_bossrush(int level, double& shootr,int& refresh_t);
 
 void resetbosses(boss* Bosses,boss& boss1,player& player1);
 

+ 35 - 57
invaders.cpp

@@ -54,7 +54,7 @@ int main(int argc,char** argv)
 	double shootrate;				  	//probability of an enemy shooting a bomb 
 	int command;						//keyboard input
 	int score=0;					   	//score: gain +100 when an enemy is destroyed and +50 when a bomb is destroyed
-	char level='1';						//difficulty level
+	int level=1;						//difficulty level
 	//bool sound=false;					
 	
 	/*//PTHREAD STUFF
@@ -97,12 +97,13 @@ int main(int argc,char** argv)
 	
 	WALLS_NUM=2;
 	
-	choose_level(shootrate, refresh_time, boss1, level, ENEMY_NUM, commands);     	//choose difficulty level and set game parameters and boss
+	level = choose_level(commands);     	// get desired level
+	setup_level(level, shootrate, refresh_time, boss1, ENEMY_NUM, commands);     	// set game parameters and boss
 	load_enemies(enemies,ENEMY_NUM);
 	player1.set_commands(commands);
 	erase();
 	
-	if(atoi(&level)==1) WALLS_NUM=3;
+	if(level==1) WALLS_NUM=3;
 	
 	
 	w_vec walls(WALLS_NUM);
@@ -240,72 +241,49 @@ int main(int argc,char** argv)
 		interactions(player1,bullets,bombs,enemies,walls,powerups,rockets,boss1,score);
 
 		///////ENDGAME CHECKS               
-		if(boss1.health<1)  					//YOU WON!!
+		if(boss1.health<1 || gameover(player1,bombs))
 		{
 			/*if(sound){
 				pkill_music(thread[0]);	
 				win_theme = pthread_create(&thread[2],NULL,pwin_theme,NULL);
 			}*/
-				
-			Victory(boss1.name,score,level,chflag);
-			
+
 			WINDOW *replay;
-			
-			replay=newwin(3,25,26,20);
-			box(replay,ACS_VLINE,ACS_HLINE);
-		
-			if(playagain(replay))                           //playagain() returns true if player wants to play again, false otherwise
+			if(boss1.health<1)	// YOU WON
+			{
+				Victory(boss1.name,score,level,chflag);
+				replay=newwin(3,25,26,20);
+			} else			// YOU LOST
 			{
-				delwin(replay);
-				timeout(500);
-				score=0;
-				erase();
-				refresh();
-				choose_level(shootrate, refresh_time, boss1, level, ENEMY_NUM, commands);
-				load_enemies(enemies,ENEMY_NUM);
-				reset(player1, enemies, boss1, bullets, bombs, walls, powerups,rockets, level,chflag); // reset box, player, enemy and deletes all bullets and bombs
-				erase();
-				refresh();
-				continue;  
+				Defeat(score);
+				replay=newwin(3,25,17,20);
 			}
-			else { 
-				endwin();
-				cout<<lightgreen<<"Game exited correctly."<<none<<endl;
-				return 0;
-			}	
-		}
-				
-			
-		if(gameover(player1,bombs))
-		{
-			Defeat(score);
-			
-			WINDOW* replay;
-		
-			replay=newwin(3,25,17,20);
 			box(replay,ACS_VLINE,ACS_HLINE);
-			
-			if(playagain(replay))                                        //playagain() returns true if player wants to play again, false otherwise
+
+			switch(char choice = playagain(replay))	// playagain() returns 'y', 'n' or 'q'
 			{
-				delwin(replay);
-				timeout(500);
-				score=0;
-				erase();
-				refresh();
-				choose_level(shootrate, refresh_time, boss1, level, ENEMY_NUM, commands);
-				load_enemies(enemies,ENEMY_NUM);
-				reset(player1, enemies, boss1, bullets, bombs, walls, powerups,rockets,level,chflag);       // reset box, player, enemy and delete all bullets and bombs
-				erase();
-				refresh();
-				continue;  
-			}
-			else {
-				endwin();
-				cout<<lightgreen<<"Game exited correctly."<<none<<endl;
-				return 0;
+				case 'y':
+				case 'n':
+					delwin(replay);
+					timeout(500);
+					score=0;
+					erase();
+					refresh();
+					if(choice=='n')
+						level = choose_level(commands);     	// get desired level
+					setup_level(level, shootrate, refresh_time, boss1, ENEMY_NUM, commands);     	// set game parameters and boss
+					load_enemies(enemies,ENEMY_NUM);
+					reset(player1, enemies, boss1, bullets, bombs, walls, powerups,rockets, level,chflag); // reset box, player, enemy and deletes all bullets and bombs
+					erase();
+					refresh();
+					continue;	// Go to the beginning of the main loop
+				case 'q':
+					endwin();
+					cout<<lightgreen<<"Game exited correctly."<<none<<endl;
+					return 0;
 			}
 		}
-		
+
 		draw(player1,bullets,bombs,enemies,walls,powerups,rockets,boss1);
 		write_score(Score,score);