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

📄 gameengine.cpp

📁 本游戏是一款单机版的坦克大战游戏
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	}

//-----------------------------------------------------------------------------
//
// Name:	GetNowPos
// Disc:	the member function of the class of the WALL
//-----------------------------------------------------------------------------

 	void GetNowPos(CTank &tank)
	{
		int m=0;
		int n=0;
		
		int colmax=MAP_WALL_COL_MAX,rowmax=MAP_WALL_ROW_MAX;
		
		if(tank.GetTankBelong()==0)
		{
			colmax=MAP_WALL_ROW_VIEW-2;
			rowmax=MAP_WALL_ROW_VIEW-2;
		}

		n=rand()*rand()%colmax;
		m=rand()*rand()%rowmax;

		while(Wall[m][n].IsVisible())
		{
			n=rand()*rand()%colmax;
			m=rand()*rand()%rowmax;
		}

		POINT point=Wall[m][n].GetWallPos();
		tank.SetNowPos(point.x,point.y);
	}

	BOOL SeeAround(int x,int y,int m)
	{
		MarkNode d[]={{0,-1},{0,1},{-1,0},{1,0}};
		int s=0,t=0;
		int xp=0,yp=0;

		switch(m)
		{
		case TANK_MOVE_UP:
		case TANK_MOVE_DOWN:
			xp=TANK_WIDTH/2;
			yp=TANK_HEIGHT/2;
			break;
		case TANK_MOVE_LEFT:
		case TANK_MOVE_RIGHT:
			xp=TANK_HEIGHT/2;
			yp=TANK_WIDTH/2;
			break;
		}

		s=(y+yp)/WALL_HEIGHT+d[m].j;
		t=(x+xp)/WALL_HEIGHT+d[m].i;

		if(s>=0&&t>=0&&s<21&&t<36)
			return !Wall[s][t].IsLiving();
		return FALSE;
	}

	void TankAIMove()
	{
		for(int n=0;n<TANK_TOTAL_NUMBER;n++)
		{
			if(Tank[1][n].IsLivable())
			{
				if(SearchMovePath(Tank[1][n].GetMDirection(),Tank[1][n]))
				{
					if(iLevel>(2<<n))
					{
						int x=Tank[1][n].GetNowPos().x-Tank[0][0].GetNowPos().x+screenmovex;
						int y=Tank[1][n].GetNowPos().y-Tank[0][0].GetNowPos().y+screenmovey;
						if((fabs(x)<=10&&fabs(y)<200||fabs(y)<=10&&fabs(x)<200)&&Tank[0][0].IsLivable())
						{
							int d=Tank[1][n].GetMDirection();

							if(x<-10)
							{
								d=TANK_MOVE_RIGHT;
							}

							if(x>10)
							{
								d=TANK_MOVE_LEFT;
							}

							if(y<-10)
							{
								d=TANK_MOVE_DOWN;
							}

							if(y>10)
							{
								d=TANK_MOVE_UP;
							}
							
							if(SeeAround(Tank[1][n].GetNowPos().x,Tank[1][n].GetNowPos().y,d))
							{
								Tank[1][n].SetMoveDirection(d);
								if(SearchMovePath(Tank[1][n].GetMDirection(),Tank[1][n]))
								{
									if(!(x<TANK_HEIGHT&&x>10||y>10&&y<TANK_HEIGHT))
										Tank[1][n].Move();
									else if(Tank[1][n].IsAttackable())
									{
										InstallBullet(1,n);
										Tank[1][n].Attack();
										Tank[1][n].SetTankState(TANK_STATE_STOP);
									}
								}
							}
							else Tank[1][n].Move();
						}
						else Tank[1][n].Move();
					}
					else Tank[1][n].Move();
				}
				else
				{
					Tank[1][n].SetMoveDirection(Tank[1][n].RandDirection());
					if(SearchMovePath(Tank[1][n].GetMDirection(),Tank[1][n]))
					{
						if(iLevel>(2<<n))
						{
							int x=Tank[1][n].GetNowPos().x-Tank[0][0].GetNowPos().x+screenmovex;
							int y=Tank[1][n].GetNowPos().y-Tank[0][0].GetNowPos().y+screenmovey;
							if((fabs(x)<=10&&fabs(y)<200||fabs(y)<=10&&fabs(x)<200)&&Tank[0][0].IsLivable())
							{
								int d=Tank[1][n].GetMDirection();

								if(x<-10)
								{
									d=TANK_MOVE_RIGHT;
								}

								if(x>10)
								{
									d=TANK_MOVE_LEFT;
								}

								if(y<-10)
								{
									d=TANK_MOVE_DOWN;
								}

								if(y>10)
								{
									d=TANK_MOVE_UP;
								}
								
								if(SeeAround(Tank[1][n].GetNowPos().x,Tank[1][n].GetNowPos().y,d))
								{
									Tank[1][n].SetMoveDirection(d);
									if(SearchMovePath(Tank[1][n].GetMDirection(),Tank[1][n]))
									{
										if(!(x<TANK_HEIGHT&&x>10||y>10&&y<TANK_HEIGHT))
											Tank[1][n].Move();
										else if(Tank[1][n].IsAttackable())
										{
											InstallBullet(1,n);
											Tank[1][n].Attack();
											Tank[1][n].SetTankState(TANK_STATE_STOP);
										}
									}
								}
								else Tank[1][n].Move();
							}
							else Tank[1][n].Move();
						}
						else Tank[1][n].Move();
					}
				}

				if(Tank[1][n].IsAttackable())
				{
					InstallBullet(1,n);
					Tank[1][n].Attack();
					Tank[1][n].SetTankState(TANK_STATE_STOP);
				}
			}
			else if(!Tank[1][n].IsLivable()&&Tank[1][n].GetLifeTimes()>0)
			{
				Tank[1][n].SetLifeTimes(Tank[1][n].GetLifeTimes()-1);
				int nl=Tank[1][n].GetLifeTimes();
				int type=Tank[1][n].GetTankType();
				score+=(type+1)*50;
				if(n>0)
				{
					Tank[1][n].SetTankBelong(1);
					GetNowPos(Tank[1][n]);
					Tank[1][n].SetLifeCount(TANK_BASIC_LIFECOUNT);
					Tank[1][n].SetLivingState(TRUE);
					Tank[1][n].SetTankState(TANK_STATE_ATTACK);
				}
			}
		}
		if(CountEnemyTank()<=0)
		{
			screenmovex=0;
			screenmovey=0;
			Level.Promotion();
			InitWall();
			InitCMTank();
			for(int m=0;m<=iPlayerModel;m++)
			{
				GetNowPos(Tank[0][m]);
				Tank[0][m].SetLifeTimes(Tank[0][m].GetLifeTimes()+2);
				Tank[0][m].SetLifeCount(Tank[0][m].GetTankType()*TANK_BASIC_LIFECOUNT);
				Tank[0][m].SetLivingState(FALSE);
				Tank[0][m].SetTankState(FALSE);
			}
			iAppState=4;
		}
	}

//-----------------------------------------------------------------------------
//
// Name:	GetViewTank
// Disc:	the member function of the class of the WALL
//-----------------------------------------------------------------------------

	RECT GetViewTank(CTank tank)
	{
		RECT rcRect={0,0,0,0};
		int Type=tank.GetTankType();
		switch(tank.GetMDirection())
		{
		case TANK_MOVE_UP:
			rcRect.top=Type*TANK_HEIGHT;
			rcRect.bottom=(Type+1)*TANK_HEIGHT;
			rcRect.left=0;
			rcRect.right=TANK_WIDTH;
			break;
		case TANK_MOVE_DOWN:
			rcRect.top=Type*TANK_HEIGHT;
			rcRect.bottom=(Type+1)*TANK_HEIGHT;
			rcRect.left=TANK_WIDTH;
			rcRect.right=2*TANK_WIDTH;
			break;
		case TANK_MOVE_LEFT:
			rcRect.top=8*TANK_HEIGHT;
			rcRect.bottom=8*TANK_HEIGHT+TANK_WIDTH;
			rcRect.left=Type*TANK_HEIGHT;
			rcRect.right=(Type+1)*TANK_HEIGHT;
			break;
		case TANK_MOVE_RIGHT:
			rcRect.top=8*TANK_HEIGHT+TANK_WIDTH;
			rcRect.bottom=8*TANK_HEIGHT+2*TANK_WIDTH;
			rcRect.left=Type*TANK_HEIGHT;
			rcRect.right=(Type+1)*TANK_HEIGHT;
			break;
		default:
			break;
		}
		return rcRect;
	}

//-----------------------------------------------------------------------------
//
// Name:	GetViewTank
// Disc:	the member function of the class of the WALL
//-----------------------------------------------------------------------------

	MarkNode GetFrontScene(int x,int y)
	{
		MarkNode point;
		point.j=x/WALL_WIDTH;
		point.i=(y-40)/WALL_HEIGHT;
		return point;
	}

//-----------------------------------------------------------------------------
//
// Name:	GetViewTank
// Disc:	the member function of the class of the WALL
//-----------------------------------------------------------------------------

	BOOL SearchMovePath(int direction,CTank &tank)
	{
		MarkNode mark;

		if(tank.GetTankBelong()==1)
		{
			if(!tank.UpOk())	return FALSE;
			if(!tank.DownOk())	return FALSE;
			if(!tank.LeftOk())	return FALSE;
			if(!tank.RightOk()) return FALSE;
		}	
		
		if(tank.GetTankBelong()==0)
		{
			iTankMovX=tank.GetNowPos().x-(screenmovex);
			iTankMovY=tank.GetNowPos().y-(screenmovey);

			switch(tank.GetMDirection())
			{
			case TANK_MOVE_UP:
				 if((iTankMovY-tank.GetSpeed())<0)
					 return FALSE;
				 break;
			case TANK_MOVE_DOWN:
				 if((iTankMovY+tank.GetSpeed())>GAME_SCREEN_HEIGHT-WALL_HEIGHT+TANK_HEIGHT)
					 return FALSE;
				 break;
			case TANK_MOVE_LEFT:
				 if((iTankMovX-tank.GetSpeed())<0)
					 return FALSE;
				 break;
			case TANK_MOVE_RIGHT:
				 if((iTankMovX+tank.GetSpeed())>GAME_SCREEN_WIDTH-TANK_HEIGHT)
					 return FALSE;
				 break;
			}
		}
		else 
		{
			iTankMovX=tank.GetNowPos().x;
			iTankMovY=tank.GetNowPos().y;
		}
	
		switch(direction)
		{
		case TANK_MOVE_UP:
			mark=GetFrontScene(iTankMovX,iTankMovY-4);
			if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
			mark=GetFrontScene(iTankMovX+TANK_WIDTH-1,iTankMovY-4);
			if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
			break;
		case TANK_MOVE_DOWN:
			mark=GetFrontScene(iTankMovX,iTankMovY+TANK_HEIGHT+4);
			if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
			mark=GetFrontScene(iTankMovX+TANK_WIDTH-1,iTankMovY+TANK_HEIGHT+4);
			if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
			break;
		case TANK_MOVE_LEFT:
			mark=GetFrontScene(iTankMovX-4,iTankMovY);
			if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
			mark=GetFrontScene(iTankMovX-4,iTankMovY+TANK_WIDTH);
			if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
			break;
		case TANK_MOVE_RIGHT:
			mark=GetFrontScene(iTankMovX+TANK_HEIGHT+4,iTankMovY);
			if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
			mark=GetFrontScene(iTankMovX+TANK_HEIGHT+4,iTankMovY+TANK_WIDTH);
			if(Wall[mark.i][mark.j].IsVisible()) return FALSE;
			break;
		}
		
		for(i=0;i<TANK_WAR_SIDE;i++)
			for(j=0;j<TANK_TOTAL_NUMBER;j++)
			{
				if((!(i==0&&i>iPlayerModel))&&Tank[i][j].IsLivable())
				{
					int belong1=tank.GetTankBelong();
					int belong2=Tank[i][j].GetTankBelong();

					int x=tank.GetNowPos().x-Tank[i][j].GetNowPos().x+(belong1*screenmovex-belong2*screenmovex);
					int y=tank.GetNowPos().y-Tank[i][j].GetNowPos().y+(belong1*screenmovey-belong2*screenmovey);

					if(!(x==0&&y==0))
					{
						int speed=tank.GetSpeed();
						switch(direction)
						{
						case TANK_MOVE_UP:
							if(y>=0&&y-speed<TANK_HEIGHT&&fabs(x)<TANK_WIDTH)
								return FALSE;
							break;
						case TANK_MOVE_DOWN:
							if(y<=0&&y+speed>-TANK_HEIGHT&&fabs(x)<TANK_WIDTH)
								return FALSE;
							break;
						case TANK_MOVE_LEFT:
							if(x>=0&&x-speed<TANK_HEIGHT&&fabs(y)<TANK_WIDTH)
								return FALSE;
							break;
						case TANK_MOVE_RIGHT:
							if(x<=0&&x+speed>-TANK_HEIGHT&&fabs(y)<TANK_WIDTH)
								return FALSE;
							break;
						}
					}
				}
			}
			
		return TRUE;
	}

//-----------------------------------------------------------------------------
//
// Name:	GetViewTank
// Disc:	the member function of the class of the WALL
//-----------------------------------------------------------------------------

	void DrawTankp(POINT point,RECT rect)
	{

		HRESULT		hRet;

		while (1)
		{
			hRet = lpBackBuffer->BltFast(point.x,point.y, lpTank, &rect, TRUE);
			if (hRet == DD_OK)
			{
				break;
			}
			if (hRet == DDERR_SURFACELOST)
			{
				hRet = RestoreSurfaces();
				if (hRet != DD_OK)
					break;
			}
			if (hRet != DDERR_WASSTILLDRAWING)
				break;
		}
	}


	void DrawHelicopter()
	{

		HRESULT		hRet;
		RECT rect;

		static hx=1024,hy=40+4*WALL_HEIGHT;
		static hframe=0;
		static hframep=0;
		static hd=rand()%4;

		for (int n=0;n<=iPlayerModel;n++)
		{
			POINT point=Tank[0][n].GetNowPos();
			if(!Tank[0][n].IsLivable()&&Tank[0][n].GetLifeTimes()>0)
			{

				if (lastTickCount = 0)
				{
					hframe =0;
					hframep =2;
				}
							
				hframe++;
				if(hframe>2)
				{
					hframe=0;
					hframep++;
				}

				if(hframep>3)
				{
					hframe=0;
					hframep=2;
				}

				if(hx>=point.x+1)
					hx-=1;
				
				if(hx<=point.x-1)
					hx+=1;
				
				if(hy>=point.y+1)
				{
					hy-=1;
				//	screenmovey+=1;
				}
				
				if(hy<=point.y-1)
				{
					hy+=1;
				//	screenmovey-=1;
				}

				if(hx==point.x&&hy==point.y)
				{
					bTask=TRUE;
					hframe=0;
					hframep=0;
				}
			}
			else
			{
				if(!bTask)
				{
							
					hframe++;
					if(hframe>2)
					{
						hframe=0;
						hframep++;
					}

					if(hframep>1)
					{
						hframe=0;
						hframep=0;
					}

					if(hx<=1024-1)
						hx+=1;
					else 
					{
						hx=1024;
						hy=40+4*WALL_HEIGHT;
					}
				}
			}
		}


		rect.top=hframe*144;
		rect.bottom=(hframe+1)*144;
		rect.left=hframep*280;
		rect.right=hframep*280+((1024-hx>280 )? 280:(1024-hx));
		
		while (1)
		{
			hRet = lpBackBuffer->BltFast(hx,hy, lpHelicopter, &rect, TRUE);
			if (hRet == DD_OK)
			{
				break;
			}
			if (hRet == DDERR_SURFACELOST)
			{
				hRet = RestoreSurfaces();
				if (hRet != DD_OK)
					break;
			}
			if (hRet != DDERR_WASSTILLDRAWING)
				break;
		}
	}

	void DrawTank()
	{
		TankAIMove();
		TankViewMov();
		int *type=Level.GetTankTypes();
		for (int m=0;m<TANK_WAR_SIDE;m++)
			for(int n=0;n<TANK_TOTAL_NUMBER;n++)
			{
/*	
				if(m==1)//&&n<=iPlayerModel
				{
				//	bltText(NumToChar(-screenmovex),100,100+50*n);
				//	bltText(NumToChar(-screenmovey),200,100+50*n);
					bltText(NumToChar(Tank[m][n].GetNowPos().x),300,100+50*n);
					bltText(NumToChar(Tank[m][n].GetNowPos().y),400,100+50*n);
					bltText(NumToChar(Tank[m][n].GetLifeTimes()),500,100+50*n);
				}
*/
				if(Tank[m][n].IsLivable())
				{
					RECT rcRect=GetViewTank(Tank[m][n]);
					POINT point=Tank[m][n].GetNowPos();
					if(m==1)

⌨️ 快捷键说明

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