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

📄 strategy.cpp

📁 5V5仿真平台机器人足球
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		}
		else if(id<10)
		{
			robot=zw.opponent[id-5].pos;
			mind=R10;
		}
		else 
		{
			robot=zw.ball.pos;
			mind=Dist_RB+1*cm;
		}

		dprx=point.x-robot.x;
		dpry=point.y-robot.y;
		distance_pr=sqrt(dprx*dprx+dpry*dpry);
		drhx=robot.x-zw.home[which].pos.x;
		drhy=robot.y-zw.home[which].pos.y;
		distance_rh=sqrt(drhx*drhx+drhy*drhy);

		if(distance_pr<distance_ph && distance_rh<distance_ph)
		{
			
//			A=dphy;
//			B=-dphx;
//			C=dphx*zw.home[which].pos.y-zw.home[which].pos.x*dphy;
// 			distb=sqrt(A*A+B*B);
			distt=(dphy*robot.x-dphx*robot.y
				+dphx*zw.home[which].pos.y-zw.home[which].pos.x*dphy)/distance_rh;
//			dists[id]=distt/distance_rh;

			if(fabs(distt)<mind)
			{
				if(distance_rh<mindis)				
				{
					mindis=distance_rh;
					Block_id=id;
					if(distt<0)     //如果障碍到目标直线的位移<0,则障碍在直线的左边
						block_direction='r';  //'r'代表队员应该向右绕
					else 
						block_direction='l';    //反之应该向左绕

				}
			}
		}	
	}

		if (Block_id!=-1)       //如果不等于-1,则有障碍
		{
			if(Block_id<5)
			{
				robot=zw.home[Block_id].pos;
				juli=R10;
			}
			else if(Block_id<10)
			{
				robot=zw.opponent[Block_id-5].pos;
				juli=R10;
			}
			else
			{
				robot=zw.ball.pos;
				juli=R7;
			}
			if(mindis>Rob_adge)
				if(block_direction=='r')	
				{	
					avoidpoint.x=robot.x-juli*(-dphy/distance_ph);
					avoidpoint.y=robot.y-juli*(dphx/distance_ph);
				}
				else
				{
					avoidpoint.x=robot.x-juli*(dphy/distance_ph);
					avoidpoint.y=robot.y-juli*(-dphx/distance_ph);	
				}
			else if(block_direction=='r')	
			
				{	avoidpoint.x=robot.x-juli*(-dphy/distance_ph)-juli*(dphx/distance_ph);
					avoidpoint.y=robot.y-juli*(dphx/distance_ph)-juli*(dphy/distance_ph);
				}
				else
				{
					avoidpoint.x=robot.x-juli*(dphy/distance_ph)-juli*(dphy/distance_ph);
					avoidpoint.y=robot.y-juli*(-dphx/distance_ph)-juli*(dphy/distance_ph);	
				}

				dahx=avoidpoint.x-zw.home[which].pos.x;
				dahy=avoidpoint.y-zw.home[which].pos.y;
				distance_ah=sqrt(dahx*dahx+dahy*dahy);

				if(distance_ah<2.3*zw.home[which].dv)

				Toward(which, point, 125, env);	

				else
					Toward(which, avoidpoint, 125, env);
	}
	else
//		Toward(which, point, 125, env);
	{
		double dprx, dpry, distance_pr;
		dprx=zw.kickPit.x-zw.home[which].pos.x;
		dpry=zw.kickPit.y-zw.home[which].pos.y;

		if(kickState[which])
			distance_pr=0;//保证转身动作完成
		else
			distance_pr=sqrt(dprx*dprx+dpry*dpry);//踢球点与踢球人的距离
		
		if(distance_pr>zw.home[which].intervalK)
		{
			Toward( which, zw.kickPit, 125, env);
			zw.home[which].intervalK=SHORTER;
			kickStep[which]=0;
			kickState[which]=0;
		}
		else
		{
			kickStep[which]++;
			if(kickStep[which]>6) 
			{
				kickStep[which]=6;
				kickState[which]=0;
			}
			else if(kickStep[which]>=1)
				kickState[which]=1;

			Toward( which, zw.target, 125, env);
			zw.home[which].intervalK=LONGER;
		}
	}
}
//////top:AttackAvoidBlock(int which,Environment *env)///////

////////////////////////////////////////////////////////////
void AvoidBlock(int which,Vector2D point, Environment *env)
{
	int id,Block_id=-1;
	char block_direction;
	double mindis=1000.0, mind, n=11, distt=0,juli;
	Vector2D  robot, avoidpoint;
	double dphx=point.x-zw.home[which].pos.x;
	double dphy=point.y-zw.home[which].pos.y;
	double distance_ph=sqrt(dphx*dphx+ dphy*dphy);
	double dprx, dpry, distance_pr, drhx, drhy, distance_rh;
	double dahx,dahy,distance_ah;

	for(id=0;id<n;id++)
	{
		if(which==id) continue;

		if(id<5)
		{
			robot=zw.home[id].pos;
			mind=R10;
		}
		else if(id<10)
		{
			robot=zw.opponent[id-5].pos;
			mind=R10;
		}
		else 
		{
			robot=zw.ball.pos;
			mind=Dist_RB+1*cm;
		}

		dprx=point.x-robot.x;
		dpry=point.y-robot.y;
		distance_pr=sqrt(dprx*dprx+dpry*dpry);
		drhx=robot.x-zw.home[which].pos.x;
		drhy=robot.y-zw.home[which].pos.y;
		distance_rh=sqrt(drhx*drhx+drhy*drhy);

		if(distance_pr<distance_ph && distance_rh<distance_ph)
		{
			
//			A=dphy;
//			B=-dphx;
//			C=dphx*zw.home[which].pos.y-zw.home[which].pos.x*dphy;
// 			distb=sqrt(A*A+B*B);
			distt=(dphy*robot.x-dphx*robot.y
				+dphx*zw.home[which].pos.y-zw.home[which].pos.x*dphy)/distance_rh;
//			dists[id]=distt/distance_rh;

			if(fabs(distt)<mind)
			{
				if(distance_rh<mindis)				
				{
					mindis=distance_rh;
					Block_id=id;
					if(distt<0)     //如果障碍到目标直线的位移<0,则障碍在直线的左边
						block_direction='r';  //'r'代表队员应该向右绕
					else 
						block_direction='l';    //反之应该向左绕

				}
			}
		}	
	}

		if (Block_id!=-1)       //如果不等于-1,则有障碍
		{
			if(Block_id<5)
			{
				robot=zw.home[Block_id].pos;
				juli=R10;
			}
			else if(Block_id<10)
			{
				robot=zw.opponent[Block_id-5].pos;
				juli=R10;
			}
			else
			{
				robot=zw.ball.pos;
				juli=R7;
			}
			if(mindis>Rob_adge)
				if(block_direction=='r')	
				{	
					avoidpoint.x=robot.x-juli*(-dphy/distance_ph);
					avoidpoint.y=robot.y-juli*(dphx/distance_ph);
				}
				else
				{
					avoidpoint.x=robot.x-juli*(dphy/distance_ph);
					avoidpoint.y=robot.y-juli*(-dphx/distance_ph);	
				}
			else if(block_direction=='r')	
			
				{	avoidpoint.x=robot.x-juli*(-dphy/distance_ph)-juli*(dphx/distance_ph);
					avoidpoint.y=robot.y-juli*(dphx/distance_ph)-juli*(dphy/distance_ph);
				}
				else
				{
					avoidpoint.x=robot.x-juli*(dphy/distance_ph)-juli*(dphy/distance_ph);
					avoidpoint.y=robot.y-juli*(-dphx/distance_ph)-juli*(dphy/distance_ph);	
				}

				dahx=avoidpoint.x-zw.home[which].pos.x;
				dahy=avoidpoint.y-zw.home[which].pos.y;
				distance_ah=sqrt(dahx*dahx+dahy*dahy);

				if(distance_ah<2.3*zw.home[which].dv)

				Toward(which, point, 125, env);	

				else
					Toward(which, avoidpoint, 125, env);
		}
		else
			Toward(which, point, 125, env);
}	   
///////////////////////////////////////////////////////////////

void PositAvoidBlock(int which, Vector2D target, Environment *env)
{
	int id,Block_id=-1;
	char block_direction;
	double mindis=1000.0, mind, n=11, distt=0,juli;
	Vector2D  robot, avoidpoint;
	double dphx=target.x-zw.home[which].pos.x;
	double dphy=target.y-zw.home[which].pos.y;
	double distance_ph=sqrt(dphx*dphx+ dphy*dphy);
	double dprx, dpry, distance_pr, drhx, drhy, distance_rh;
	double dahx,dahy,distance_ah;

	for(id=0;id<n;id++)
	{
		if(which==id) continue;

		if(id<5)
		{
			robot=zw.home[id].pos;
			mind=R10;
		}
		else if(id<10)
		{
			robot=zw.opponent[id-5].pos;
			mind=R10;
		}
		else 
		{
			robot=zw.ball.pos;
			mind=Dist_RB+1*cm;
		}

		dprx=target.x-robot.x;
		dpry=target.y-robot.y;
		distance_pr=sqrt(dprx*dprx+dpry*dpry);
		drhx=robot.x-zw.home[which].pos.x;
		drhy=robot.y-zw.home[which].pos.y;
		distance_rh=sqrt(drhx*drhx+drhy*drhy);

		if(distance_pr<distance_ph && distance_rh<distance_ph)
		{
			
//			A=dphy;
//			B=-dphx;
//			C=dphx*zw.home[which].pos.y-zw.home[which].pos.x*dphy;
// 			distb=sqrt(A*A+B*B);
			distt=(dphy*robot.x-dphx*robot.y
				+dphx*zw.home[which].pos.y-zw.home[which].pos.x*dphy)/distance_rh;
//			dists[id]=distt/distance_rh;

			if(fabs(distt)<mind)
			{
				if(distance_rh<mindis)				
				{
					mindis=distance_rh;
					Block_id=id;
					if(distt<0)     //如果障碍到目标直线的位移<0,则障碍在直线的左边
						block_direction='r';  //'r'代表队员应该向右绕
					else 
						block_direction='l';    //反之应该向左绕

				}
			}
		}	
	}

		if (Block_id!=-1)       //如果不等于-1,则有障碍
		{
			if(Block_id<5)
			{
				robot=zw.home[Block_id].pos;
				juli=R10;
			}
			else if(Block_id<10)
			{
				robot=zw.opponent[Block_id-5].pos;
				juli=R10;
			}
			else
			{
				robot=zw.ball.pos;
				juli=R7;
			}
			if(mindis>Rob_adge)
				if(block_direction=='r')	
				{	
					avoidpoint.x=robot.x-juli*(-dphy/distance_ph);
					avoidpoint.y=robot.y-juli*(dphx/distance_ph);
				}
				else
				{
					avoidpoint.x=robot.x-juli*(dphy/distance_ph);
					avoidpoint.y=robot.y-juli*(-dphx/distance_ph);	
				}
			else if(block_direction=='r')	
			
				{	avoidpoint.x=robot.x-juli*(-dphy/distance_ph)-juli*(dphx/distance_ph);
					avoidpoint.y=robot.y-juli*(dphx/distance_ph)-juli*(dphy/distance_ph);
				}
				else
				{
					avoidpoint.x=robot.x-juli*(dphy/distance_ph)-juli*(dphy/distance_ph);
					avoidpoint.y=robot.y-juli*(-dphx/distance_ph)-juli*(dphy/distance_ph);	
				}

				dahx=avoidpoint.x-zw.home[which].pos.x;
				dahy=avoidpoint.y-zw.home[which].pos.y;
				distance_ah=sqrt(dahx*dahx+dahy*dahy);

				if(distance_ah<2.3*zw.home[which].dv)

				Toward(which, target, 125, env);	

				else
					Toward(which, avoidpoint, 125, env);
		}
		else
//		Toward(which, point, 125, env);
	Posit( which, target, Vspeed, env);
}
////////////////////////////////////////////////////////////////////////////////////////

void ReceiveData(Environment *env)
{
//安蓝黄队条件编译///////////////////////////////////////////////
#ifdef BLUE
//为蓝队从系统数据区接收动态数据
	for(int id=0; id<5; id++)
	{
		zw.home[id].pos.x=env->home[id].pos.x;
		zw.home[id].pos.y=env->home[id].pos.y;
		zw.home[id].ang=env->home[id].rotation;

		zw.opponent[id].pos.x=env->opponent[id].pos.x;
		zw.opponent[id].pos.y=env->opponent[id].pos.y;
		zw.opponent[id].ang=env->opponent[id].rotation;
	}

	zw.ball.pos.x=env->currentBall.pos.x;
	zw.ball.pos.y=env->currentBall.pos.y;
	zw.whosBall=env->whosBall;

#else
//为黄队从系统数据区接收动态数据并施以坐标变换
	double maxw = FLEFT+FRIGHT;
	double maxh = FTOP+FBOTTOM;

	for(int id=0; id<5; id++)
	{
		zw.home[id].pos.x=maxw-env->home[id].pos.x;
		zw.home[id].pos.y=maxh-env->home[id].pos.y;

		if(env->home[id].rotation>0)
			zw.home[id].ang=env->home[id].rotation-180;
		else
			zw.home[id].ang=env->home[id].rotation+180;

		zw.opponent[id].pos.x=maxw-env->opponent[id].pos.x;
		zw.opponent[id].pos.y=maxh-env->opponent[id].pos.y;

		if(env->opponent[id].rotation>0)
			zw.opponent[id].ang=env->opponent[id].rotation-180;
		else
			zw.opponent[id].ang=env->opponent[id].rotation+180;
	}

	zw.ball.pos.x=maxw-env->currentBall.pos.x;
	zw.ball.pos.y=maxh-env->currentBall.pos.y;

	if(env->whosBall==ANYONES_BALL)
		zw.whosBall=env->whosBall;
	else
		zw.whosBall=BLUE_BALL+YELLOW_BALL-env->whosBall;
#endif
///////////////////////////////////////////////////////////////////////////

//计算当前周期机器人和球的位移、速度和加速度////////////////////////////////////
	for(id=0; id<5; id++)
	{
		zw.home[id].dx = zw.home[id].pos.x - zw.home[id].last_pos.x;
		zw.home[id].dy = zw.home[id].pos.y - zw.home[id].last_pos.y;
		zw.home[id].dv = sqrt(zw.home[id].dx * zw.home[id].dx + zw.home[id].dy * zw.home[id].dy);
		zw.home[id].da = zw.home[id].dv-zw.home[id].dv1;

		zw.opponent[id].dx = zw.opponent[id].pos.x - zw.opponent[id].last_pos.x;
		zw.opponent[id].dy = zw.opponent[id].pos.y - zw.opponent[id].last_pos.y;
		zw.opponent[id].dv = sqrt(zw.opponent[id].dx * zw.opponent[id].dx + zw.opponent[id].dy * zw.opponent[id].dy);
	}

	zw.ball.dx = zw.ball.pos.x - zw.ball.last_pos.x;
	zw.ball.dy = zw.ball.pos.y - zw.ball.last_pos.y;
	zw.ball.dv = sqrt(zw.ball.dx * zw.ball.dx + zw.ball.dy * zw.ball.dy);
	zw.ball.da = zw.ball.dv-zw.ball.dv1;

	zw.gameState = env->gameState;
}
////////////////////////////////////////////////////////

//保存当前数据供下周期用///////////////////////////////////////
void PreserveData()
{
	zw.ball.last_pos.x=zw.ball.pos.x;//保存本周期球的位置
	zw.ball.last_pos.y=zw.ball.pos.y;
	zw.ball.dv1=zw.ball.dv;//保存球速

	for(int id=0; id<5; id++)
	{//保存机器人的位置和速度
		zw.home[id].last_pos.x=zw.home[id].pos.x;
		zw.home[id].last_pos.y=zw.home[id].pos.y;
		zw.home[id].last_ang=zw.home[id].ang;
		zw.home[id].dv1=zw.home[id].dv;

		zw.opponent[id].last_pos.x=zw.opponent[id].pos.x;
		zw.opponent[id].last_pos.y=zw.opponent[id].pos.y;
	}
}
//////////////////////////////////////////////////////////

⌨️ 快捷键说明

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