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

📄 action.cpp

📁 FIRA机器人足球比赛5V5仿真组的一般的防守策略
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//		RegulateAngle(omiga);
	if(vl>125)vl=125;
	if(vl<-125)vl=-125;
	if(vr>125)vr=125;
	if(vr<-125)vr=-125;
	double angle = (vr - vl)/2;

	RegulateAngle(omiga);		//应该没有大于180 的角速度罢

	omiga += ANGLE_A*(ANGLE_B* angle-omiga);

	if( vr > vl )
	{	
		if( vl >= 0 || vr <=0 )
		{
			omiga -= 4 * ANGLE_K * angle * angle;
		}
	}
	else if( vr < vl )
	{	
		if( vr >= 0 || vl <=0 )
		{
			omiga += 4 * ANGLE_K * angle * angle;
		}
	}

	RegulateAngle(omiga);		//应该没有大于180 的角速度罢

	return omiga;

}

//
/*VelocityOne 计算在当前速度speed的基础上以左右轮速vl,vr控制,下一个周期达到的速度
返回  下一个周期达到的速度
*/
//
double VelocityOne(double speed,double vl,double vr)
{
	if(vl>125)vl=125;
	if(vl<-125)vl=-125;
	if(vr>125)vr=125;
	if(vr<-125)vr=-125;

	if(speed > 3 || speed < -3)
		speed =0;

	if( vl==0 && vr==0 )
		speed += -SPEED_ODD * speed;
	else
		speed += SPEED_A*( SPEED_B*(vl +vr)/2-speed);
	return speed;
}



//
/*Count 计算robot跑道pos位置的周期数

*/
//
int Count( Environment *env, int robot,Vector3D pos)
{
	Mydata * p;
	p=(Mydata *)env->userData;
	
	double v=0,s=0;
	double  distance=0;
	int n=0;
	double turnangle=0,vangle=0;
	double posangle=0,sangle=0;
	double dx,dy;

	dx = pos.x - p->robot[robot].pos.x ;
	dy = pos.y - p->robot[robot].pos.y ;
	
	distance = Distance(p->robot[robot].pos , pos);
	posangle = Atan(dy,dx);

//omiga
	turnangle = posangle - p->robot[robot].rotation;		
	RegulateAngle(turnangle);

	if(turnangle > 90)
	{
		turnangle-=180;
	}
	else if(turnangle < -90)
	{
		turnangle+=180;
	}

	double omiga=p->robot[robot].rotation - p->myoldpos[robot].z ;
	RegulateAngle(omiga);

	if( turnangle <0 )
	{
		turnangle = - turnangle;	
		if( omiga < 0)
			omiga= -omiga;
	}

	do{
		omiga=AngleOne(omiga,-120,120);
		sangle+=omiga;
		n++;	
	}while(sangle < turnangle);
	n--;
//omiga	
	v= sqrt(p->myspeed[robot].x * p->myspeed[robot].x + p->myspeed[robot].y*p->myspeed[robot].y);
	vangle = p->myspeed[robot].z - posangle;
	RegulateAngle(vangle);
	if( vangle <-90 || vangle > 90 )
		v=-v;
	do{//跑位的步数
		//还没有考虑反向 是怎么办呢  
		v=VelocityOne(v,110,110);
		s+=v;
		n++;
	}while(s < distance);
	n--;
	return n;
}

//
/*Goalie 让robot守门

*/
//
void Goalie ( Environment *env, int robot )
{//先校正姿态,再去拦球
	Mydata * p;
	p=(Mydata *)env->userData;
	
	Vector3D go;

	double OX=	FLEFT - (GTOP - GBOT);	// 该点为球门中心 向后移动半个球门
	double OY=	(FTOP + FBOT)/2;			//球门中心	
	double ballx=p->curball.x	;
	double bally=p->curball.y	;
	double gx = p->robot[robot].pos.x ;	
	double gx_outline = FLEFT + 2.2;		//对x坐标的限定,防止离球门线太远了
	double gx_inline = FLEFT + 1.8;
	double gy = p->robot[robot].pos.y;		//跑位点,初值为当前位置
	double goalline = FLEFT + 3;
	bool   notout= true;	//不出击
	bool   standby = true;	//限制x 坐标
	bool   XX=false;	//是否旋转

	if( XX && ballx < gx + 0.5 )
	{//旋转
		if(bally < gy && bally > gy-4 )
		{
			Velocity(env,robot,-125,125);
			return ;
		}
		else if(bally > gy && bally < gy+4)
		{
			Velocity(env,robot,125,-125);
			return ;
		}
	}

	gy = OY + ( goalline - OX ) * (bally - OY)/(ballx - OX);
	
	if(notout)
	{
		if(gy > GTOP+3)
			gy = GTOP+3;
		else if(gy < GBOT-3)
			gy = GBOT-3;
	}
	go.y = gy ;

	if(standby)
	{
		if(gx > gx_outline )
			gx = gx_outline;
		else if(gx < gx_inline)
			gx = gx_inline;
	}

	go.x = gx ;
		GoaliePosition(env,robot,go,90,1.5);

}

void Goalie ( Environment *env, int robot,Vector3D pos)
{//先校正姿态,再去拦球
	Mydata * p;
	p=(Mydata *)env->userData;
	
	Vector3D go;
    PredictBall(env,2);
	double ballx=p->preball.x;
	double bally=p->preball.y;
	double gx =pos.x;	

	double gx_outline = pos.x+ 2.2;		
	double gx_inline = pos.x+ 1.8;

	double gy =p->preball.y;	
	double goalline = pos.x+ 3;

	bool   standby = true;	//限制x 坐标



	if(ballx < gx +3&&fabs(p->robot[robot].pos.y-bally)<4){
      Kick(env,robot,CONSTGATE);
		 return ;
	}
	
	go.y = gy ;

	if(standby)
	{
		if(gx > gx_outline )
			gx = gx_outline;
		else if(gx < gx_inline)
			gx = gx_inline;
	}

	go.x = gx ;
		GoaliePosition(env,robot,go,90,1.5);

}

//////
/*Meetball_p	求出robot追到球的最佳位置

*/
//
Vector3D Meetball_p( Environment *env, int robot)
{//求出robot追到球的位置
	Mydata * p;
	p=(Mydata *)env->userData;

	Vector3D meetpoint={0,0,-1};
	double dis=Distance(p->curball,p->robot[robot].pos);

	double t =0 ;
	double vb=0;
	double v=1.9;		//按照最大速度计算
	double pos_angle,b_sp_angle;

	pos_angle = Atan(p->curball.y - p->robot[robot].pos.y , p->curball.x - p->robot[robot].pos.x);
	b_sp_angle = p->ballspeed.z ;
	vb = (p->ballspeed.y * p->ballspeed.y + p->ballspeed.x * p->ballspeed.x);
	t = sin((b_sp_angle - pos_angle) * PI /180);
	t = vb* t*t;
	v=v*v;
	if( v > t )
	{
		v = sqrt( v - t) + sqrt( vb ) * cos((b_sp_angle - pos_angle) * PI /180);
		if( v > 0.1)
		{
			t = dis /v;	//得到步数
			meetpoint.x = p->ballspeed.x *t + p->curball.x ;
			meetpoint.y = p->ballspeed.y *t + p->curball.y ;
			meetpoint.z = t;
		}
	}

	return meetpoint;

}
//////
/*Meetball_y	求出该队员和求相遇的 y 坐标
maxn用于限制追到球的最长的时间(周期数)
*/
//
Vector3D Meetball_y( Environment *env ,double X,double maxn)
{//求出该队员和求相遇的 y 坐标

	Mydata * p;
	p=(Mydata *)env->userData;
	double dx = X -p->curball.x;

	Vector3D meetpoint={0,0,-1};
	

	if( dx > 0 )
	{//球在  左方,目标在右边
		if(p->ballspeed.x > 0.1)
			meetpoint.z = dx / p->ballspeed.x;
	}
	else
	{//球在 右边 ,目标在左方	//dx < 0 
		if(p->ballspeed.x < -0.1)
			meetpoint.z = dx / p->ballspeed.x;
	}

	if( meetpoint.z > 0 )
	{
		meetpoint.x = X;
		meetpoint.y = p->ballspeed.y * meetpoint.z + p->curball.y;
	}
	return meetpoint;

}

//////
/*Meetball_x	求出该队员和求相遇的 x 坐标
maxn用于限制追到球的最长的时间(周期数)
*/
//
Vector3D Meetball_x( Environment *env ,double Y,double maxn)
{//求出该队员和求相遇的 x 坐标

	Mydata * p;
	p=(Mydata *)env->userData;
	double dy = Y -p->curball.y;

	Vector3D meetpoint={0,0,-1};


	if( dy > 0 )
	{//球在  下方,目标在上
		if(p->ballspeed.y > 0.01)
			meetpoint.z = dy / p->ballspeed.y;
	}
	else
	{//球在 上方 ,目标在下	//dx < 0 
		if(p->ballspeed.y < -0.01)
			meetpoint.z = dy / p->ballspeed.y;
	}

	if( meetpoint.z > 0 )
	{
		meetpoint.y = Y;
		meetpoint.x = p->ballspeed.x * meetpoint.z + p->curball.x ;
	}
	return meetpoint;

}

//////
/*Within  判断robot队员和球的距离是否再LENGTH规定的范围内
返回true  or false

*/
//
bool Within(Environment* env,int robot,double LENGTH)
{
	Mydata* p;
	p=(Mydata*)env->userData;

	const double steps=50;
	int who=robot;
	double dis;

	Vector3D ballgo={0,0,0};
	Vector3D robotgo={0,0,0};
	Vector3D ball=p->curball;	
	

	ballgo.x = ball.x + steps * p->myspeed[who].x;
	ballgo.y = ball.y + steps * p->myspeed[who].y;
	
	dis=Distance(ballgo,p->robot[robot].pos);

	if(dis < LENGTH)
	{
		return true;
	}
	return false;

}
bool oppWithin(Environment* env,int robot,double LENGTH)
{
	Mydata* p;
	p=(Mydata*)env->userData;

	const double steps=50;
	int who=robot;
	double dis;

	Vector3D ballgo={0,0,0};
	Vector3D robotgo={0,0,0};
	Vector3D ball=p->curball;	
	

	ballgo.x = ball.x + steps * p->opspeed[who].x;
	ballgo.y = ball.y + steps * p->opspeed[who].y;
	
	dis=Distance(ballgo,p->opp[robot].pos);

	if(dis < LENGTH)
	{
		return true;
	}
	return false;


}
/*
prdictopp 预测经过steps个周期之后对方机器人的位置
函数返回结果:经过steps个周期之后球的位置
*/
Vector3D PredictOpp(Environment *env,int robot,int steps)
{
	Mydata * p;
	p=(Mydata *)env->userData;
	
	Vector3D predictopp;
	Vector3D oppspeed;
	int i=0;
	
	predictopp.x  = p->opp[robot].pos.x;			//赋初值
	predictopp.y = p->opp[robot].pos .y;

	oppspeed.x = p->opspeed[robot].x ;
	oppspeed.y = p->opspeed[robot].y ;
	for(i=0;i<steps;i++)
	{
		predictopp.x  += oppspeed.x ;
		predictopp.y += oppspeed.y ;
	}
return predictopp;
}


////////////
/* PredictBall	预测经过 steps 个周期之后球的位置
	函数返回结果:经过 steps 个周期之后球的位置
	
	考虑撞墙的过程

*/
////////////
void PredictBall(Environment *env,int steps)
{
	Mydata * p;
	p=(Mydata *)env->userData;
	
	Vector3D predictball;
	Vector3D ballspeed;
	int i=0;


	predictball.x = p->curball.x;			//赋初值
	predictball.y = p->curball.y;

	ballspeed.x = p->ballspeed.x ;
	ballspeed.y = p->ballspeed.y ;
	ballspeed.z = p->ballspeed.z ;
	
	for(i=0;i<steps;i++)
	{
		predictball.x += ballspeed.x ;
		predictball.y += ballspeed.y ;
//处理撞墙
		if( predictball.x > FRIGHT )
		{
			predictball.x -= ballspeed.x ;	//retern
			predictball.y -= ballspeed.y ;

			ballspeed.x *=-SPEED_NORMAL;	//loose 
			ballspeed.y *= SPEED_TANGENT;

			predictball.x += ballspeed.x ;	//go on
			predictball.y += ballspeed.y ;

		}
		else if( predictball.x < FLEFT )
		{
			predictball.x -= ballspeed.x ;	//retern
			predictball.y -= ballspeed.y ;

			ballspeed.x *=-SPEED_NORMAL;	//loose 
			ballspeed.y *= SPEED_TANGENT;

			predictball.x += ballspeed.x ;	//go on
			predictball.y += ballspeed.y ;

		}
		else if( predictball.y < FBOT )
		{
			predictball.x -= ballspeed.x ;	//retern
			predictball.y -= ballspeed.y ;

			ballspeed.x *= SPEED_TANGENT;	//loose 
			ballspeed.y *=-SPEED_NORMAL;

			predictball.x += ballspeed.x ;	//go on
			predictball.y += ballspeed.y ;

		}
		else if( predictball.y > FTOP )
		{
			predictball.x -= ballspeed.x ;	//retern
			predictball.y -= ballspeed.y ;

			ballspeed.x *= SPEED_TANGENT;	//loose 
			ballspeed.y *=-SPEED_NORMAL;

			predictball.x += ballspeed.x ;	//go on
			predictball.y += ballspeed.y ;
		}

		if( predictball.x + predictball.y > FRIGHT +FTOP -CORNER)
		{//右上
			double vx,vy;	
			vy=0.7071*ballspeed.y + 0.7071*ballspeed.x;	//变换1
			vx=-0.7071*ballspeed.y + 0.7071*ballspeed.x;

			predictball.x -= ballspeed.x ;	//retern
			predictball.y -= ballspeed.y ;

			vx *= SPEED_TANGENT;	//loose 
			vy *=-SPEED_NORMAL;

			ballspeed.y = 0.7071 * vy - 0.7071 * vx;	//变换2
			ballspeed.x = 0.7071 * vy + 0.7071 * vx;

			predictball.x += ballspeed.x ;	//go on
			predictball.y += ballspeed.y ;

		}
		else if( predictball.x + predictball.y < FLEFTX +FBOT+CORNER)
		{//左下
			double vx,vy;	
			vy=0.7071*ballspeed.y + 0.7071*ballspeed.x;	//变换1
			vx=-0.7071*ballspeed.y + 0.7071*ballspeed.x;

			predictball.x -= ballspeed.x ;	//retern
			predictball.y -= ballspeed.y ;

			vx *= SPEED_TANGENT;	//loose 
			vy *=-SPEED_NORMAL;

			ballspeed.y = 0.7071 * vy - 0.7071 * vx;	//变换2
			ballspeed.x = 0.7071 * vy + 0.7071 * vx;

			predictball.x += ballspeed.x ;	//go on
			predictball.y += ballspeed.y ;	
		}
		else if( predictball.x - predictball.y > FRIGHT -FBOT -CORNER)
		{//右下
			double vx,vy;	
			vy=0.7071*ballspeed.y - 0.7071*ballspeed.x;	//变换1
			vx=0.7071*ballspeed.y + 0.7071*ballspeed.x;

			predictball.x -= ballspeed.x ;	//retern
			predictball.y -= ballspeed.y ;

			vx *= SPEED_TANGENT;	//loose 
			vy *=-SPEED_NORMAL;

			ballspeed.y = 0.7071 * vy + 0.7071 * vx;	//变换2
			ballspeed.x = -0.7071 * vy + 0.7071 * vx;

			predictball.x += ballspeed.x ;	//go on
			predictball.y += ballspeed.y ;			
		}
		else if( predictball.y - predictball.x > FTOP - FLEFT-CORNER)
		{//左上
			double vx,vy;	
			vy=0.7071*ballspeed.y - 0.7071*ballspeed.x;	//变换1
			vx=0.7071*ballspeed.y + 0.7071*ballspeed.x;

			predictball.x -= ballspeed.x ;	//retern
			predictball.y -= ballspeed.y ;

			vx *= SPEED_TANGENT;	//loose 
			vy *=-SPEED_NORMAL;

			ballspeed.y = 0.7071 * vy + 0.7071 * vx;	//变换2
			ballspeed.x = -0.7071 * vy + 0.7071 * vx;

			predictball.x += ballspeed.x ;	//go on

⌨️ 快捷键说明

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