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

📄 vsv.cpp

📁 FIRA机器人足球赛simurosot5vs5
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/*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;

}
////////////
/* 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
			predictball.y += ballspeed.y ;			
		}

//处理四角		
	}

	p->preball.x = predictball.x ;
	p->preball.y = predictball.y ;
	p->preball.z = Atan( ballspeed.y ,ballspeed.x );
}

////////////
/* Kick	让robot把球踢到ToPos的位置

*/
////////////
void Kick(Environment *env , int  robot , Vector3D ToPos )
{
	Mydata * p;
	p=(Mydata *)env->userData;
    
    PredictBall(env,2);
	Vector3D ball = p->preball;		

	Vector3D RobotToBall;		//人和球的相对位置
	RobotToBall.x = ball.x - p->robot[robot].pos.x ;
	RobotToBall.y = ball.y - p->robot[robot].pos.y ;
	RobotToBall.z = Atan(p->robot[robot].pos , ball);
	
	Vector3D BallToGate ;		//球和球门的相对位置
	BallToGate.x = ToPos.x - ball.x ;
	BallToGate.y = ToPos.y - ball.y ;
	BallToGate.z = Atan(ball , ToPos);
	
	double RunAngle ;
	RunAngle = RobotToBall.z - BallToGate.z;
	RegulateAngle(RunAngle);
	
	RunAngle = RobotToBall.z + RunAngle /2;	// 可以调整  2 
	RegulateAngle(RunAngle);

	PAngle(env,robot,RunAngle,125);

}

void Kick(Environment *env , int  robot ,int robot1)//踢人
{
	Mydata * p;
	p=(Mydata *)env->userData;
	Vector3D RobotToBall;		//人和球的相对位置
	RobotToBall.x = p->robot[robot1].pos.x- p->robot[robot].pos.x ;
	RobotToBall.y = p->robot[robot1].pos.y- p->robot[robot].pos.y ;
	RobotToBall.z = Atan(p->robot[robot].pos , p->robot[robot1].pos);
	
	Vector3D BallToGate ;		//球和球门的相对位置
	BallToGate.x = CONSTGATE.x- p->robot[robot1].pos.x;
	BallToGate.y = CONSTGATE.y- p->robot[robot1].pos.y;
	BallToGate.z = Atan(p->robot[robot1].pos,CONSTGATE);
	
	double RunAngle ;
	RunAngle = RobotToBall.z - BallToGate.z;
	RegulateAngle(RunAngle);
	
	RunAngle = RobotToBall.z + RunAngle /2 ;	// 可以调整  2 
	RegulateAngle(RunAngle);

	PAngle(env,robot,RunAngle,125);

}

void Kick(Environment *env,int robot,int steps,double limits){

	Mydata *p=(Mydata*)env->userData;
	double dx,dy,angle;
    
	dx=p->curball.x-p->robot[robot].pos.x;
	dy=p->curball.y-p->robot[robot].pos.y;
	angle=Atan(dy,dx);
    PredictBall(env,steps);

	if(angle<90&&angle>-90){
		if(p->curball.y>41.8)
	      PositionBallX(env,robot,p->preball,-125,3);
		else
		  PositionBallX(env,robot,p->preball,125,3);
	}
	else 
      shoot(env,robot);
}

////////////
/* CheckBall	返回球所在的分区号

*/
////////////
int CheckBall(Environment *env)
{
	Mydata * p;
	p=(Mydata *)env->userData;
    int  ballArea;

	double x1=21.5;
	double x2=50.1;
	double x3=78.6;
	
	double y1=25.1;
	double y2=41.8;
    double y3=58.6;
    
	Vector3D ball;
	ball.x=p->curball.x;
	ball.y=p->curball.y;

	if(ball.x<=x1&&ball.x>FLEFT&&ball.y>FBOT&&ball.y<=y1)
		ballArea=1;
	else if(ball.x<=x1&&ball.x>FLEFT&&ball.y>Y1&&ball.y<=y2)
		ballArea=2;
	else if(ball.x<=x1&&ball.x>FLEFT&&ball.y>y2&&ball.y<=y3)
		ballArea=3;
	else if(ball.x<=x1&&ball.x>FLEFT&&ball.y>y3&&ball.y<FTOP)
		ballArea=4;
	else if(ball.x<=x2&&ball.y<=y1&&ball.y>FBOT)
		ballArea=5;
	else if(ball.x<=x2&&ball.y<=y2)
		ballArea=6;
	else if(ball.x<=x2&&ball.y<=y3)
		ballArea=7;
	else if(ball.x<=x2&&ball.y>y3&&ball.y<FTOP)
		ballArea=8;
	else if(ball.x<x3&&ball.y<=y1)
		ballArea=9;
	else if(ball.x<x3&&ball.y<=y2)
		ballArea=10;
	else if(ball.x<x3&&ball.y<=y3)
		ballArea=11;
	else if(ball.x<x3&&ball.y>y3&&ball.y<FTOP)
		ballArea=12;
	else if(ball.x>=x3&&ball.y<=y1)
		ballArea=13;
	else if(ball.x>=x3&&ball.y<=y2)
		ballArea=14;
	else if(ball.x>=x3&&ball.y<y3)
		ballArea=15;
	else  ballArea=16;
	return ballArea;

}

void shoot(Environment *env,int robot){
 
   Mydata *p=(Mydata *)env->userData;
   double w1,w2,alfa;
   double dx,dy;
   
   if(p->curball.y>GBOT&&p->curball.y<=GTOP/2){
     
	   if(p->ballspeed.z<85&&p->ballspeed.z<95)
		  PositionBallX(env,robot,p->curball,-90,4);

	   else if(p->ballspeed.z<-85&&p->ballspeed.z>-95)
		  PositionBallX(env,robot,p->curball,90,4);
   }

   else if(p->curball.y>=GTOP/2&&p->curball.y<=GTOP){

       if(p->ballspeed.z<85&&p->ballspeed.z<95)
		 PositionBallX(env,robot,p->curball,-90,4);

	   else if(p->ballspeed.z<-85&&p->ballspeed.z>-95)
		 PositionBallX(env,robot,p->curball,90,4);
   }
   
   if(p->robot[robot].pos.x<=p->curball.x){
     
	 PredictBall(env,2);  
     dx=GRIGHT-p->robot[robot].pos.x;
     dy=GTOP-p->robot[robot].pos.y;
     w1=Atan(dy,dx);

	 dx=GRIGHT-p->robot[robot].pos.x;
	 dy=GBOT-p->robot[robot].pos.y;
	 w2=Atan(dy,dx);

     dx=p->preball.x-p->robot[robot].pos.x;
	 dy=p->preball.y-p->robot[robot].pos.y;
     alfa=Atan(dy,dx);

	 if((w1-alfa)*(w2-alfa)<=0)
         PAngle(env,robot,alfa,125);

     else if(p->curball.y<FBOT+4&&p->robot[robot].pos.y<FBOT+4)
            Kick(env,robot,BOTGATE);

	 else if(p->curball.y>FTOP-4&&p->robot[robot].pos.y>FBOT-4)
			 Kick(env,robot,TOPGATE);
	 else 
		 Kick(env,robot,CONSTGATE);

   }
   else 
	   Kick(env,robot,CONSTGATE);
}



bool shoot1(Environment *env,int robot){
   
	Mydata *p=(Mydata *)env->userData;
	int count,i=1,k;
	double angle;
	double dx,dy;

	if(p->ballspeed.y>=0.5||p->ballspeed.y<=-0.5){ 

	  if(p->ballspeed.y>0){

	    	count=(GTOP-p->curball.y)/p->ballspeed.y;
	  }
	  else{
	    	count=fabs((p->curball.y-GBOT)/p->ballspeed.y);
	  }
	}
	
	if(count>=600)
		count=600;

    while(i<=count){
      
         PredictBall(env,i);
		 k=Count(env,robot,p->preball);

		 if(abs(i-k)<=3)
		   if(p->preball.y<=GTOP+4&&p->preball.y>=GBOT-4){//调整角度准备射门
                break;
			}
          i++;
		  }

	if(i<=count){
       dx=p->preball.x-p->robot[robot].pos.x;
	   dy=p->preball.y-p->robot[robot].pos.y;
       angle=Atan(dy,dx);
	   PAngle(env,robot,angle,125);
	   return true;
	}
   else 
	   return false;
}
 
void Order(Environment *env)
{
	Mydata * p;
	p=(Mydata *)env->userData;
    int i,j,k,a[4];
    double dis[4],b[4],temple;
    double dy=0;
	static record=2;
   
	b[0]=dis[0]=Distance(p->robot[1].pos,p->curball);
	b[1]=dis[1]=Distance(p->robot[2].pos,p->curball);
	b[2]=dis[2]=Distance(p->robot[3].pos,p->curball);
	b[3]=dis[3]=Distance(p->robot[4].pos,p->curball);

	switch(p->ballArea){
	  case 1: 
      case 4:
	  case 5:
      case 6: 
	  case 7:
      case 8:
	  for(i=0;i<3;i++)
		  for(j=i+1;j<4;j++){
			  if(b[i]>b[j]){
				 temple=b[i];
				 b[i]=b[j];
				 b[j]=temple;
			  }
		  }
      for(i=0;i<4;i++)
		for(j=0;j<4;j++)
           if(dis[j]==b[i])
			   a[i]=j+1;

    p->mainrobot=a[0];
	p->slowrobot=a[1];
	p->cutrobot=a[2];
	p->defentrobot=a[3];
        break;
	  case 2: 
	  case 3:
		  if(p->curball.y>p->robot[0].pos.y){
			  i=p->mainrobot;
		      p->mainrobot=p->cutrobot;
			  p->cutrobot=i;
		  }
		  break;
      case 9:
      case 10:
	  case 11:
	  case 12:
	  case 13:

	  if(dis[1]<dis[2]){
         
		if(dis[2]<=dis[3]){
			i=2;
			j=3;
			k=4;
		}
		else if(dis[1]<=dis[3]){
			i=2;
			j=4;
			k=3;
		}
		else{
			i=4;
			j=2;
			k=3;
		}
	}
	else{

		if(dis[1]<=dis[3]){
			i=3;
			j=2;
			k=4;
		}
		else if(dis[2]<=dis[3]){
			i=3;
			j=4;
			k=2;
		}
		else{
			i=4;
			j=3;
			k=2;
		}
	}

	p->mainrobot=i;
	p->slowrobot=j;
	p->cutrobot=k;
	record=p->cutrobot;
        break;
	  case 14: 
    if(!Within(env,record,1))
		p->cutrobot=record;

	else{
		if(p->ballspeed.z<0){
           dy=100;
		for(i=2;i<5;i++)
			if(p->robot[i].pos.y<dy){
				dy=p->robot[i].pos.y;
				record=i;
			}
			p->mainrobot=p->cutrobot;
			p->cutrobot=record;
		}
		else{
			dy=0;
         for(i=2;i<5;i++)
			 if(p->robot[i].pos.y>dy){
				 dy=p->robot[i].pos.y;
				 record=i;
			 }
			 p->mainrobot=p->cutrobot;
			 p->cutrobot=record;
		}    
	  }

	 for(i=2;i<5;i++)
       if(i!=p->cutrobot&&i!=p->mainrobot)
		   p->slowrobot=i;

		  break;
	  case 15:
	   
	  if(!Within(env,record,1))
		p->cutrobot=record;

	else{
		if(p->ballspeed.z<0){
           dy=100;
		for(i=2;i<5;i++)
			if(p->robot[i].pos.y<dy){
				dy=p->robot[i].pos.y;
				record=i;
			}
			p->mainrobot=p->cutrobot;
			p->cutrobot=record;
		}
		else{
			dy=0;
         for(i=2;i<5;i++)
			 if(p->robot[i].pos.y>dy){
				 dy=p->robot[i].pos.y;
				 record=i;
			 }
			 p->mainrobot=p->cutrobot;
			 p->cutrobot=record;
		}    
	}	
     for(i=2;i<5;i++)
       if(i!=p->cutrobot&&i!=p->mainrobot)
		   p->slowrobot=i;

		  break;
	  case 16:

	  if(dis[1]<dis[2]){
         
		if(dis[2]<=dis[3]){
			i=2;
			j=3;
			k=4;
		}
		else if(dis[1]<=dis[3]){
			i=2;
			j=4;
			k=3;
		}
		else{
			i=4;
			j=2;
			k=3;
		}
	}
	else{

		if(dis[1]<=dis[3]){
			i=3;
			j=2;
			k=4;
		}
		else if(dis[2]<=dis[3]){
			i=3;
			j=4;
			k=2;
		}
		else{
			i=4;
			j=3;
			k=2;
		}
	}

	p->mainrobot=i;
	p->slowrobot=j;
	p->cutrobot=k;
	record=p->cutrobot;
	break;
	}

}


⌨️ 快捷键说明

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