⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.cpp

📁 坦克大战3.0源代码
💻 CPP
字号:
#include "public.h"/* ------------------main loop----------------- */voidPlay_Game (GameEngine * ge){	int i, j, k;	int randnum;	int object;	int temp;	static int dx[4] = { 0, -1, 0, 1 };	static int dy[4] = { -1, 0, 1, 0 };	int x, y;	SDL_Rect res_rect, des_rect;	ge->clock = 0;	Disp_TankLeft (ge);			//显示剩下的坦克	BorePlayer (ge, &player[0],0);  //产生player[0] 及palyer[1]	if(players==1)				//double players		BorePlayer (ge, &player[1],1);	ge->last_time = SDL_GetTicks ();	while (game_state == GAME_RUNNING || game_state == GAME_WIN	        || game_state == GAME_OVER)	{		/* Get Input */		SDL_PollEvent (&(ge->event));		if (key_state.Quit)			game_state = GAME_EXIT;		/* Process player's tank */		for (i = 0; i < 2; i++)		{			//if(game_state==GAME_OVER)continue;			if (!player[i].active)		//如果死亡跳过				continue;			if (ge->player_left[i] < 0)      //如果没有left跳过				continue;			/* fire! */			if (key_state.Fire[i])             //fire key				PlayerFire (ge, &player[i], i);			if (player[i].boring)               //正在产生坦克			{				player[i].clock++;				if (player[i].clock % 20 < 10)				{					DrawSprite (ge, &player[i]);           //使坦克闪烁				}				else				{					ClearSprite (ge, &player[i]);				}				if (player[i].clock > 60)                  //结束闪烁				{					player[i].clock = 0;					player[i].boring = 0;				}				continue;			}			/* Do game logic */			//if(player[i].active!=1 && ge->player_left>=0)BorePlayer(ge,&player[i]);			//Move !!!!			if (key_state.Move[i])           //如果有移动键!!则移动			{				x = player[i].x + player[i].speed * dx[player[i].dir];				y = player[i].y + player[i].speed * dy[player[i].dir];				player[i].ox = player[i].x;				player[i].oy = player[i].y;				if (MoveAble (&player[i], x, y))				{					player[i].x = x;					player[i].y = y;					if (!PlaceAble (&player[i]))					{						player[i].x = player[i].ox;						player[i].y = player[i].oy;					}				}				player[i].timer1++;				player[i].timer1 %= 4;			}			else				player[i].timer1 = 0;			ClearSprite (ge, &player[i]);                    //刷新坦克			DrawSprite (ge, &player[i]);		}		/* Process player's bullet */                        //我军炮弹 i<4 !!!		for (i = 0; i < 4; i++)		{			if (bullet[i].active)			{				bullet[i].ox = bullet[i].x;				bullet[i].oy = bullet[i].y;				x = bullet[i].x + bullet[i].speed * dx[bullet[i].dir];				y = bullet[i].y + bullet[i].speed * dy[bullet[i].dir];				object = HitObject (&bullet[i], x, y);				if (object == 0)				{					bullet[i].x = x;					bullet[i].y = y;					ClearSprite (ge, &bullet[i]);					DrawSprite (ge, &bullet[i]);				}				/* Out off screen */				else if (object == -1)				{					ClearSprite (ge, &bullet[i]);					bullet[i].active = 0;				}				/* Hit the hawk! */				else if (object == 8)				{					Burst (ge, &bullet[i]);					ExplodeHawk (ge);					PlaySound (Snd_bom);					printf ("Game over!\n");					game_state = GAME_OVER;				}				/* Hit the wall */				else				{					ClearSprite (ge, &bullet[i]);                     //击中木墙					bullet[i].active = 0;					if (object == 1)					{						HitTile (ge, &bullet[i], x, y);						PlaySound (Snd_dow);					}					if (object == 9)                                        //击中钢墙						PlaySound (Snd_ding);				}				for (j = 0; j < ge->max_enemys + 2; j++) 	//击中敌人				{					if (enemy[j].active)					{						/* Hit the enemy! */						if (HitTest (&bullet[i], &enemy[j]) && !enemy[j].boring)						{							enemy[j].armor--;							if (enemy[j].armor >= 0)							{								Burst (ge, &bullet[i]);								PlaySound (Snd_ding);							}							else							{								Burst (ge, &bullet[i]);                                           //爆炸								Burst (ge, &enemy[j]);								Explode (ge, &enemy[j]);								PlaySound (Snd_bom);								/* player=i/2 */								Add_Score (ge, i, &enemy[j]);								ge->enemy_left--;								if (ge->enemy_left < 1)								{									printf ("Round clear!\n");									game_state = GAME_WIN;								}							}						}					}					if (bullet[j + 4].active == 1)					{						/* Hit the enemy's bullet! */						if (HitTest (&bullet[i], &bullet[j + 4]))						{							Burst (ge, &bullet[i]);							Burst (ge, &bullet[j + 4]);						}					}				}			}		}		//--------------------------------------------------------------------------------------		/* Process enemys */		//处理敌人		for (i = 0; i < ge->max_enemys; i++)		{			if (enemy[i].active != 1)				continue;			/* Flash on boring */			if (enemy[i].boring)			{				enemy[i].clock++;				if (enemy[i].clock % 20 < 10)				{					DrawSprite (ge, &enemy[i]);				}				else				{					ClearSprite (ge, &enemy[i]);				}				if (enemy[i].clock > 60)				{					enemy[i].clock = 0;					enemy[i].boring = 0;				}				continue;			}			x = enemy[i].x + enemy[i].speed * dx[enemy[i].dir];			y = enemy[i].y + enemy[i].speed * dy[enemy[i].dir];			enemy[i].ox = enemy[i].x;			enemy[i].oy = enemy[i].y;			enemy[i].timer1++;			enemy[i].timer1 %= 4;			/*			   for(j=0;j<MAX_ENEMYS;j++){			   // Two enemy tank touch each onther then change directtion			   if(enemy[j].active!=1)continue;			   if(i==j)continue;			   if(InterSect(x,y,enemy[j].x,enemy[j].y)){			   randnum=(int)(100.0*rand()/(RAND_MAX+1.0));			   if(randnum<5 || randnum>95){			   ClearSprite(ge,&enemy[i]);			   ChangeDirection(&enemy[i],-1);			   DrawSprite(ge,&enemy[i]);			   }			   }			   }			 */			for(j=0;j<2;j++)			{				/* When touch player'tank then fire! */				if (InterSect (x, y, player[j].x, player[j].y))				{					EnemyFire (ge, &enemy[i], i);				}				/* Can move around */				if (MoveAble (&enemy[i], x, y))				{					/*					   for(j=0;j<ge->max_enemys;j++){					   // Two enemy tank touch each onther then change directtion					   if(enemy[j].active!=1)continue;					   if(i==j)continue;					   //if(InterSect(x,y,enemy[j].x,enemy[j].y)){					   if(HitTest(&enemy[i],&enemy[j])){					   randnum=(int)(100.0*rand()/(RAND_MAX+1.0));					   if(randnum<20){					   ClearSprite(ge,&enemy[i]);					   ChangeDirection(&enemy[i],-1);					   DrawSprite(ge,&enemy[i]);					   }					   }					   else {					   enemy[i].x=x;					   enemy[i].y=y;					   ClearSprite(ge,&enemy[i]);					   DrawSprite(ge,&enemy[i]);					   }					   }					 */					//if(PlaceAble(&enemy[i])){					enemy[i].x = x;					enemy[i].y = y;					ClearSprite (ge, &enemy[i]);					DrawSprite (ge, &enemy[i]);					//}				}				else				{					/* Agaist the wall,fire or change direction */					randnum = (int) (100.0 * rand () / (RAND_MAX + 1.0));					if (randnum < 45)						EnemyFire (ge, &enemy[i], i);					else if (randnum > 55)					{						ClearSprite (ge, &enemy[i]);						ChangeDirection (&enemy[i], -1);						DrawSprite (ge, &enemy[i]);					}				}				/* Sometimes change directtion */				randnum = (int) (100.0 * rand () / (RAND_MAX + 1.0));				if (randnum < 2)				{					ClearSprite (ge, &enemy[i]);					ChangeDirection (&enemy[i], -1);					DrawSprite (ge, &enemy[i]);				}				/* And sometimes whill fire */				if (randnum > 96)				{					EnemyFire (ge, &enemy[i], i);				}			}		}		/* Process big tank */		//装甲坦克!!		for (i = ge->max_enemys; i < ge->max_enemys + 2; i++)		{			//if(i==ge->max_enemys)continue;			if (enemy[i].active == 1)			{				x =enemy[i].x				   +(enemy[i].dir ==DIR_RIGHT) * enemy[i].speed				   -(enemy[i].dir == DIR_LEFT) * enemy[i].speed;				randnum = (int) (100.0 * rand () / (RAND_MAX + 1.0));				if (x < 48)				{					enemy[i].dir = DIR_RIGHT;				}				else if (x > 360)				{					enemy[i].dir = DIR_LEFT;				}				/* Change direction */				else if (randnum < 2)					enemy[i].dir = (enemy[i].dir + 2) % 4;				else				{					ClearSprite (ge, &enemy[i]);					//enemy[i].x+=enemy[i].speed;					enemy[i].x = x;					DrawSprite (ge, &enemy[i]);					enemy[i].ox = enemy[i].x;				}				randnum = (int) (100.0 * rand () / (RAND_MAX + 1.0));				/* Bigtank fire */				if (randnum < 20)					BigTankFire (ge, &enemy[i], i);			}		}		/* Process enemy's bullet */	//敌人的子弹  i>=4		for (i = 0 + 4; i < MAX_ENEMYS + 4 + 2; i++)		{			if (bullet[i].active != 1)				continue;			bullet[i].ox = bullet[i].x;			bullet[i].oy = bullet[i].y;			x = bullet[i].x + bullet[i].speed * dx[bullet[i].dir];			y = bullet[i].y + bullet[i].speed * dy[bullet[i].dir];			object = HitObject (&bullet[i], x, y);			if (object == 0)			{				bullet[i].x = x;				bullet[i].y = y;				ClearSprite (ge, &bullet[i]);				DrawSprite (ge, &bullet[i]);			}			/* Out off screen */			else if (object == -1)			{				ClearSprite (ge, &bullet[i]);				bullet[i].active = 0;			}			/* Hit the hawk! */			else if (object == 8)			{				Burst (ge, &bullet[i]);				ExplodeHawk (ge);				PlaySound (Snd_bom);				game_state = GAME_OVER;			}			else			{				ClearSprite (ge, &bullet[i]);				bullet[i].active = 0;				if (object == 1)				{					HitTile (ge, &bullet[i], x, y);					PlaySound (Snd_dow);				}				if (object == 9)					PlaySound (Snd_ding);			}			/* Hit player's tank */			for(j=0;j<2;j++)				if (HitTest (&bullet[i], &player[j]) && !player[j].boring				        && game_state != GAME_OVER && player[j].active && bullet[i].active)				{					Burst (ge, &bullet[i]);					Burst (ge, &player[j]);					Explode (ge, &player[j]);					PlaySound (Snd_bom);					ge->player_left[j]--;					if(ge->player_left[j]>0)	//产生新坦克						BorePlayer (ge, &player[j], j);					else						ge->player_left[j]=-10;	//只是需要一个负数					if (ge->player_left[j] < 0 && ge->player_left[1-j]<0)					{						printf ("Game over!\n");						game_state = GAME_EXIT;					}				}		}		/* Process explode 爆炸效果		*/		for (i = 0; i < 4; i++)		{			if (explode[i].active == 1)			{				explode[i].timer1++;				explode[i].timer1 %= 14;				if (explode[i].timer1 >= 13)				{					ClearSprite (ge, &explode[i]);					explode[i].timer1 = 0;					explode[i].active = 0;				}				ClearSprite (ge, &explode[i]);				DrawSprite (ge, &explode[i]);			}		}		/* Produce some enemys ... */		static Uint32 last_time;		Uint32 cur_time = SDL_GetTicks ();		if (cur_time - last_time > 1500)		{			last_time = cur_time;			BoreEnemy (ge);		}		/* Show some status */		Disp_TankLeft (ge);		Show_Score (ge);		if (game_state == GAME_OVER)		{			ShowGameOver (ge);			ge->clock++;			if (ge->clock > 200)				break;		}		if (game_state == GAME_WIN)		{			ShowRoundClear (ge);			ge->clock++;			if (ge->clock > 200)				break;		}		/* Blender frame */		SDL_UpdateRect (ge->screen, 0, 0, 0, 0);		/* Delay */		SDL_Delay (TimeLeft ());	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -