机器人足球代码1汇编.docx
《机器人足球代码1汇编.docx》由会员分享,可在线阅读,更多相关《机器人足球代码1汇编.docx(11页珍藏版)》请在冰豆网上搜索。
![机器人足球代码1汇编.docx](https://file1.bdocx.com/fileroot1/2022-12/10/22071ade-4545-48de-bade-2b0574b8140f/22071ade-4545-48de-bade-2b0574b8140f1.gif)
机器人足球代码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(MDistancereturnfalse;
}
//将球踢向目标
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(distanceToTargetdoubletangentBearing=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