机器人足球代码1汇编.docx

上传人:b****4 文档编号:4862889 上传时间:2022-12-10 格式:DOCX 页数:11 大小:17.89KB
下载 相关 举报
机器人足球代码1汇编.docx_第1页
第1页 / 共11页
机器人足球代码1汇编.docx_第2页
第2页 / 共11页
机器人足球代码1汇编.docx_第3页
第3页 / 共11页
机器人足球代码1汇编.docx_第4页
第4页 / 共11页
机器人足球代码1汇编.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

机器人足球代码1汇编.docx

《机器人足球代码1汇编.docx》由会员分享,可在线阅读,更多相关《机器人足球代码1汇编.docx(11页珍藏版)》请在冰豆网上搜索。

机器人足球代码1汇编.docx

机器人足球代码1汇编

足球机器人程序代码

//应用程序模板

#include

//判断自身与球的方位是否危险

boolAzimuthDanger()

{

   doubleballX=getBallX();

   doublemyX=getX();

   doubleradius=getBallRadius()+getRadius();

   

   if(getAttack()>0&&myX+radius*2>ballX)returntrue;

   if(getAttack()<0&&myX-radius*2

   

   

   if((getAttack()>0&&getBallX()getCourtWidth()/2))

   {

       if((getBallY()>getCourtHeight()/2)&&(getY()>getBallY()))returntrue;

       if((getBallY()

   }

   

   returnfalse;

}

//判断球的运动方向返回true危险

boolJudgeDanger()

{

doubleballX=getBallX();

doubleballY=getBallY();

doublegoalMin=getCourtHeight()/2-getGoalWidth()/2;

doublegoalMax=getCourtHeight()/2+getGoalWidth()/2;

doubleb=ballY-tan(getBallHeading())*ballX;

if(getAttack()>0&&getBallHeading()>PI/2&&getBallHeading()

{

   if(goalMin<50*tan(getBallHeading())+b&&goalMax>50*tan(getBallHeading())+b)returntrue;

   elsereturnfalse;

}

elseif(getAttack()<=0&&(getBallHeading()>=0&&getBallHeading()

         ||getBallHeading()<2*PI&&getBallHeading()>3*PI/2))

{   

     if(goalMin

     returntrue;elsereturnfalse;

}

elsereturnfalse;

}

//预测足球在times个单位时间后的位置

voidNext(inttimes,double*nextX,double*nextY)

{

doublevelocity=getBallVelocity();

doubleheading=getBallHeading();

doubleacc=-getBallNegativeAcceleration();

*nextX=getBallX();

*nextY=getBallY();

for(inti=0;i

{

  if(velocity==0)break;   

  nextPoint(*nextX,*nextY,heading,velocity,nextX,nextY);

  //摩擦减速

  if(velocity>0)velocity=fmax(0,velocity+acc);

  elseif(velocity<0)velocity=fmin(0,velocity-acc);

  

  //撞墙检测

  if((*nextX)<0||(*nextX)>getCourtWidth())

  {

   heading=PI-heading;

   modifyInCourt(nextX,nextY,getBallRadius());

  }

  if((*nextY)<0||(*nextY)>getCourtHeight())

  {

   heading=-heading;

   modifyInCourt(nextX,nextY,getBallRadius());

  }

}

}

//跌代计算球的运行线路,计算未来的击球点

voidOptimumPosition(double*hitedX,double*hitedY)

{

   *hitedX=getBallX();

   *hitedY=getBallY();

   for(inti=0;i<200;i++)

   {

       doublenextX,nextY;

       Next(i,&nextX,&nextY);

       if(distance(nextX,nextY,getX(),getY())

       {

           hitedX=&nextX;

           hitedY=&nextY;

           break;

       }

   }

}

//1v1得到敌机坐标

doublegetBotX()

{

   intid=getAttack()>0?

1:

0;

   structBotbot;

   getBotById(id,&bot);

   returnbot.x;

}

doublegetBotY()

{

   intid=getAttack()>0?

1:

0;

   structBotbot;

   getBotById(id,&bot);

   returnbot.y;

}

doublegetBotVelocity()

{

   intid=getAttack()>0?

1:

0;

   structBotbot;

   getBotById(id,&bot);

   returnbot.moveVelocity;

}

boolBotBallBotDistance()

{

doubleMDistance=distance(getX(),getY(),getBallX(),getBallY());

doubleDDistance=distance(getBotX(),getBotY(),getBallX(),getBallY());

if(MDistance

returnfalse;

}

//将球踢向目标

voidShoot(doubletargetX,doubletargetY)

{

doubleballX,ballY;

OptimumPosition(&ballX,&ballY);

doubleRn=0.93;

Rn=(AzimuthDanger()&&getBallVelocity()>getMaxMoveVelocity()/2)?

Rn=1.1:

Rn=0.93;

       doubleMDDistance=distance(getX(),getY(),getBotX(),getBotY());//争球

       if(getBallVelocity()

          &&MDDistance<=getBallRadius()*2+getRadius()*2

          &&(getX()==getBotX()||getY()==getBotY()))Rn=0.1;

       

       if(getBotVelocity()==0)Rn=0.93;

//R越小,抢劫能力就越强,R越大,防守能力越强

doubleR=((getBallRadius()+getRadius())*Rn);

doubletangentX1,tangentX2,tangentY1,tangentY2;

doublebestHitX,bestHitY;

doubledistanceToTarget=distance(targetX,targetY,getX(),getY());

if(distanceToTarget

doubletangentBearing=acos(R/distanceToTarget);

doubleballToMeHeading=heading(ballX,ballY,getX(),getY());

nextPoint(ballX,ballY,ballToMeHeading+tangentBearing,R,&tangentX1,&tangentY1);

nextPoint(ballX,ballY,ballToMeHeading-tangentBearing,R,&tangentX2,&tangentY2);

nextPoint(ballX,ballY,heading(targetX,targetY,ballX,ballY),R,&bestHitX,&bestHitY);

modifyInCourt(&tangentX1,&tangentY1,getRadius());

modifyInCourt(&tangentX2,&tangentY2,getRadius());

modifyInCourt(&bestHitX,&bestHitY,getRadius());

doublexx=0;

doubleyy=0;

if(distance(getX(),getY(),bestHitX,bestHitY)

{

     xx=bestHitX;yy=bestHitY;

}

elseif(distance(bestHitX,bestHitY,tangentX1,tangentY1)

{

     xx=tangentX1;yy=tangentY1;

}

else

{

     xx=tangentX2;yy=tangentY2;

}

       //防止争边球

       if(getX()>(getBallRadius()+getRadius())*3||getX()

       {

           doublejj=getBallRadius()-getRadius()>0?

getBallRadius()-getRadius():

getRadius()-getBallRadius();

           yy=MIN(getCourtHeight()-jj,yy);

           yy=MAX(jj,yy);

       }

       

      //抄近路拦截

      

           doubleMDistance=distance(getX(),getY(),getBallX(),getBallY());

           doubleDDistance=distance(getBotX(),getBotY(),getBallX(),getBallY());

           

           if(DDistance

           {

               if(getBallVelocity()>getMoveVelocity()/2)

               {

                    intfx;

                    if(getBallY()>getCourtHeight()/2)fx=1;

                    elsefx=-1;

                

                    yy+=fx*getBallRadius()*2;

               }

           }

      

      //沿对门边路滚动时的防范措施

      if(getBallHeading()==PI/2||getBallHeading()==3*PI/2)

      {

          doublebx=getAttack()>0?

getCourtWidth()-getBallRadius():

getBallRadius();

          if(getBallX()==bx&&getBallVelocity()>getMaxMoveVelocity()*2/3)

          {

              doublejj=getBallRadius();

              xx=getAttack()>0?

xx-jj:

xx+jj;

          }

      }

      

setMoveToward(xx,yy,getMaxMoveVelocity());

}

voidShootGoal()//射门

{

   doubletargetX=getOpponentGoalCenterX();

   doubletargetY=getOpponentGoalCenterY();

   Shoot(targetX,targetY);  

}

voidShootAttack()//带球射门波浪式进攻

{

   doubletargetX=getAttack()>0?

getBallX()*2:

getBallX()/2;

   doubletargetY=0;

   if((getAttack()>0&&getBallX()getCourtWidth()*2/5))

   {

       if(getY()

       if(getBallY()

       

targetY=MIN(getCourtHeight()/2+getGoalWidth()/2-getBallRadius(),targetY);

targetY=MAX(getCourtHeight()/2-getGoalWidth()/2+getBallRadius(),targetY);

       Shoot(targetX,targetY);

   }elseShootGoal();

}

//防止乌龙的策略

voidOwngoal()

{

if(JudgeDanger())

{

   doubleRadius=getBallRadius()+getRadius();

   doubleDistance=distance(getX(),getY(),getBallX(),getBallY());

   doubleballX=getBallX();

   doublemyX=getX();

   doubletargetX=ballX;

   doubletargetY=0;

   

   if((getAttack()>0&&myX>ballX+Radius)||(getAttack()<0&&myX

   {

     if(getY()>getBallY())targetY=0;

     elsetargetY=getCourtHeight();

     Shoot(targetX,targetY);

   }

}

}

//预测防守

voidForecastGuard()

{

doublex=getAttack()>0?

getBallX()/2:

getCourtWidth()-(getCourtWidth()-getBallX())/2;

doubley=getBallY();

for(inti=0;i<50;i++)

{

  doublenextX,nextY;

  Next(i,&nextX,&nextY);

  if((getAttack()>0&&nextX<=x)||(getAttack()<0&&nextX>=x))

  {

   y=nextY;

   break;

  }

}

//将y坐标限制在球门的范围内

y=MIN(getCourtHeight()/2+getGoalWidth()/2,y);

y=MAX(getCourtHeight()/2-getGoalWidth()/2,y);

setMoveTo(x,y);

}

voidmyGuard()

{

   doublex=getAttack()>0?

getBallX()/2:

getCourtWidth()-(getCourtWidth()-getBallX())/2;

   doubley=getBallY();

   y=MIN(getCourtHeight()/2+getGoalWidth()/2,y);

   y=MAX(getCourtHeight()/2-getGoalWidth()/2,y);

   setMoveTo(x,y);

}

//全力防守

voidGoAllOutGuard()

{

doublex=getAttack()>0?

getBallX()/2:

getCourtWidth()-(getCourtWidth()-getBallX())/2;

doubley=getBallY();

y=MIN(getCourtHeight()/2+getGoalWidth()/2+getRadius()*2*2,y);

y=MAX(getCourtHeight()/2-getGoalWidth()/2-getRadius()*2*2,y);

setMoveTo(x,y);

}

//防守反击

voidGuard()

{

doubleRadius=getBallRadius()*2+getRadius()*2;

doubleDistance=distance(getX(),getY(),getBallX(),getBallY());

if(Distance>Radius*10)myGuard();

else

{

     GoAllOutGuard();

}

if(!

AzimuthDanger()){ShootAttack();return;}//方位安全时攻击

if(isHitBall()&&!

AzimuthDanger()&&getBallVelocity()>getMoveVelocity()/4){ShootAttack();return;}

if(BotBallBotDistance()){ShootGoal();}//如果自己离球的距离小于敌人则进攻

}

//判断进攻还是防守

voidAttackOrGuard()

{

  if(AzimuthDanger()&&getBallVelocity()>0){Guard();return;}

  if(JudgeDanger()&&getBallVelocity()>getMaxMoveVelocity()/2){Guard();return;}

  ShootAttack();

}

//进攻门前争球

voidGuardConfrontEachOther()

{

   doubleRadius=getRadius()+getBallRadius()/2;

   doublexx=getAttack()>0?

Radius:

getCourtWidth()-Radius;

   

   doubleMaxY=getCourtHeight()/2+getGoalWidth()/2+getRadius()*4;

   doubleMinY=getCourtHeight()/2-getGoalWidth()/2-getRadius()*4;

   

   if(getBallVelocity()>getMaxMoveVelocity()/2)

   {

       if(getAttack()>0&&getX()MaxY||getY()

       {

           setMoveToward(getBall

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1