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

📄 action.cpp

📁 FIRA机器人足球比赛5V5仿真组的一般的防守策略
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			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=12;
	double x2=19.8;
	double x3=33;
	double x4=48.7;
	double x5=54;
	double x6=80.4;
	double x7=88.3;
	
	double y1=11.9;
	double y2=27.9;
    double y3=43;
	double y4=58.6;
	double y5=70.5;
    
	Vector3D ball;
	ball.x=p->curball.x;
	ball.y=p->curball.y;

	if(ball.x<=x4&&ball.x>FLEFT&&ball.y<=FTOP&&ball.y>y5)
		ballArea=1;
	else if(ball.x<=FRIGHT&&ball.x>x4&&ball.y<=FTOP&&ball.y>y5)
		ballArea=19;
	else if(ball.x<=x1&&ball.x>FLEFT&&ball.y<=y5&&ball.y>y4)
        ballArea=2;
	else if(ball.x<=x2&&ball.x>x1&&ball.y<=y5&&ball.y>y4)
		ballArea=3;
	else if(ball.x<=x3&&ball.x>x2&&ball.y<=y5&&ball.y>y4)
		ballArea=4;
	else if(ball.x<=x4&&ball.x>x3&&ball.y<=y5&&ball.y>y4)
		ballArea=5;
	else if(ball.x<=x5&&ball.x>x4&&ball.y<=y5&&ball.y>y4)
		ballArea=20;
	else if(ball.x<=x6&&ball.x>x5&&ball.y<=y5&&ball.y>y4)
		ballArea=21;
	else if(ball.x<=x7&&ball.x>x6&&ball.y<=y5&&ball.y>y4)
		ballArea=22;
	else if(ball.x<=FRIGHT&&ball.x>x7&&ball.y<=y5&&ball.y>y4)
		ballArea=23;
	else if(ball.x<=x1&&ball.x>FLEFT&&ball.y<=y4&&ball.y>y3)
        ballArea=6;
	else if(ball.x<=x2&&ball.x>x1&&ball.y<=y4&&ball.y>y3)
		ballArea=7;
	else if(ball.x<=x3&&ball.x>x2&&ball.y<=y4&&ball.y>y3)
		ballArea=8;
	else if(ball.x<=x4&&ball.x>x3&&ball.y<=y4&&ball.y>y3)
		ballArea=9;
	else if(ball.x<=x5&&ball.x>x4&&ball.y<=y4&&ball.y>y3)
		ballArea=24;
	else if(ball.x<=x6&&ball.x>x5&&ball.y<=y4&&ball.y>y3)
		ballArea=25;
	else if(ball.x<=x7&&ball.x>x6&&ball.y<=y4&&ball.y>y3)
		ballArea=26;
	else if(ball.x<=FRIGHT&&ball.x>x7&&ball.y<=y4&&ball.y>y3)
		ballArea=27;
	else if(ball.x<=x1&&ball.x>FLEFT&&ball.y<=y3&&ball.y>y2)
        ballArea=10;
	else if(ball.x<=x2&&ball.x>x1&&ball.y<=y3&&ball.y>y2)
		ballArea=11;
	else if(ball.x<=x3&&ball.x>x2&&ball.y<=y3&&ball.y>y2)
		ballArea=12;
	else if(ball.x<=x4&&ball.x>x3&&ball.y<=y3&&ball.y>y2)
		ballArea=13;
	else if(ball.x<=x5&&ball.x>x4&&ball.y<=y3&&ball.y>y2)
		ballArea=28;
	else if(ball.x<=x6&&ball.x>x5&&ball.y<=y3&&ball.y>y2)
		ballArea=29;
	else if(ball.x<=x7&&ball.x>x6&&ball.y<=y3&&ball.y>y2)
		ballArea=30;
	else if(ball.x<=FRIGHT&&ball.x>x7&&ball.y<=y3&&ball.y>y2)
		ballArea=31;
	else if(ball.x<=x1&&ball.x>FLEFT&&ball.y<=y2&&ball.y>y1)
        ballArea=14;
	else if(ball.x<=x2&&ball.x>x1&&ball.y<=y2&&ball.y>y1)
		ballArea=15;
	else if(ball.x<=x3&&ball.x>x2&&ball.y<=y2&&ball.y>y1)
		ballArea=16;
	else if(ball.x<=x4&&ball.x>x3&&ball.y<=y2&&ball.y>y1)
		ballArea=17;
	else if(ball.x<=x5&&ball.x>x4&&ball.y<=y2&&ball.y>y1)
		ballArea=32;
	else if(ball.x<=x6&&ball.x>x5&&ball.y<=y2&&ball.y>y1)
		ballArea=33;
	else if(ball.x<=x7&&ball.x>x6&&ball.y<=y2&&ball.y>y1)
		ballArea=34;
	else if(ball.x<=FRIGHT&&ball.x>x7&&ball.y<=y2&&ball.y>y1)
		ballArea=35;
	else if(ball.x<=x4&&ball.x>FLEFT&&ball.y<=y1&&ball.y>FBOT)
		ballArea=18;
	else  ballArea=36;
	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,int count){
   
	Mydata * p;
	p=(Mydata *)env->userData;
	int 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;
}
int nearfield(Environment *env,int robot,double x,double y,double limit)
{
	Mydata * p;
	p=(Mydata *)env->userData;
	double disx,disy;
	disx=fabs(p->robot [robot].pos.x-x);
	disy=fabs(p->robot [robot].pos.y-y);
	{
		if(disx<limit)
			return 1;
		else if(disy<limit)
			return 2;
		else
			return 3;
	}
}

void oppOrder(Environment *env)
{
	Mydata * p;
	p=(Mydata *)env->userData;
    int i,j,a[4];
    double dis[4],b[4],temple;
    double dy=0;

    b[0]=dis[0]=Distance(p->opp[1].pos ,p->curball);
	b[1]=dis[1]=Distance(p->opp[2].pos,p->curball);
	b[2]=dis[2]=Distance(p->opp[3].pos,p->curball);
	b[3]=dis[3]=Distance(p->opp[4].pos,p->curball);
         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->oppmainrobot=a[0];
	p->oppslowrobot=a[1];
	p->oppcutrobot=a[2];
	p->oppdefentrobot=a[3];
}
 
void Order(Environment *env)
{
	Mydata * p;
	p=(Mydata *)env->userData;
    int i,j,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 2: 
      case 3:
	  case 4:
      case 8: 
	  case 12:
      case 14:
	  case 15:
	  case 16:
	  case 6:
	  case 7:
	  case 10:
	  case 11:
	  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 1:
	  case 5:
	  case 9:
	  case 13:
	  case 17:
	  case 18:
	  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];

      case 19:
      case 24:
	  case 28:
	  case 32:
	  case 36:

	 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];
	record=p->cutrobot;
        break;
	  case 22:
	  case 21:
	  case 23:
	  case 25:
	  case 26:
	  case 27:
		  	 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];
    if(!Within(env,record,1))
		p->cutrobot=record;

	else{
		if(p->ballspeed.z<0){
           dy=100;
		for(i=1;i<5;i++)
			if(i!=a[3] )
			{
			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=1;i<5;i++)
			 if(i!=a[3])
			 {
			 if(p->robot[i].pos.y>dy){
				 dy=p->robot[i].pos.y;
				 record=i;
			 }
			 }
			 p->mainrobot=p->cutrobot;
			 p->cutrobot=record;
		}    
	  }

	 for(i=1;i<5;i++)
		 if(i!=a[3])
		 {
       if(i!=p->cutrobot&&i!=p->mainrobot)
		   p->slowrobot=i;
		 }

		  break;
		  case 29:
		  case 30:
		  case 31:
		  case 33:
		  case 34:
		  case 35:
			  	 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];
    if(!Within(env,record,1))
		p->cutrobot=record;

	else{
		if(p->ballspeed.z<0){
           dy=100;
		for(i=1;i<5;i++)
		 if(i!=a[3])
		 {
			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=1;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=1;i<5;i++)
		  if(i!=a[3])
		 {
       if(i!=p->cutrobot&&i!=p->mainrobot)
		   p->slowrobot=i;
		 }

		  break;
		  }

	 }

	 


⌨️ 快捷键说明

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