机器人足球代码1汇编Word文件下载.docx
《机器人足球代码1汇编Word文件下载.docx》由会员分享,可在线阅读,更多相关《机器人足球代码1汇编Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
}
returnfalse;
}
//判断球的运动方向返回true危险
boolJudgeDanger()
doubleballX=getBallX();
doubleballY=getBallY();
doublegoalMin=getCourtHeight()/2-getGoalWidth()/2;
doublegoalMax=getCourtHeight()/2+getGoalWidth()/2;
doubleb=ballY-tan(getBallHeading())*ballX;
if(getAttack()>
getBallHeading()>
PI/2&
getBallHeading()<
PI*3/2)
if(goalMin<
50*tan(getBallHeading())+b&
goalMax>
50*tan(getBallHeading())+b)returntrue;
elsereturnfalse;
elseif(getAttack()<
=0&
(getBallHeading()>
PI/2
||getBallHeading()<
2*PI&
3*PI/2))
{
tan(getBallHeading())*(getCourtWidth()-50)+b&
tan(getBallHeading())*(getCourtWidth()-50)+b<
goalMax)
returntrue;
elsereturnfalse;
//预测足球在times个单位时间后的位置
voidNext(inttimes,double*nextX,double*nextY)
doublevelocity=getBallVelocity();
doubleheading=getBallHeading();
doubleacc=-getBallNegativeAcceleration();
*nextX=getBallX();
*nextY=getBallY();
for(inti=0;
i<
times;
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;
//跌代计算球的运行线路,计算未来的击球点
voidOptimumPosition(double*hitedX,double*hitedY)
*hitedX=getBallX();
*hitedY=getBallY();
for(inti=0;
200;
doublenextX,nextY;
Next(i,&
nextX,&
nextY);
if(distance(nextX,nextY,getX(),getY())<
i*getMaxMoveVelocity())
hitedX=&
nextX;
hitedY=&
nextY;
break;
//1v1得到敌机坐标
doublegetBotX()
intid=getAttack()>
0?
1:
0;
structBotbot;
getBotById(id,&
bot);
returnbot.x;
doublegetBotY()
returnbot.y;
doublegetBotVelocity()
returnbot.moveVelocity;
boolBotBallBotDistance()
doubleMDistance=distance(getX(),getY(),getBallX(),getBallY());
doubleDDistance=distance(getBotX(),getBotY(),getBallX(),getBallY());
if(MDistance<
DDistance)returntrue;
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()<
getMaxMoveVelocity()/2
&
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<
R){setMoveToward(targetX,targetY,getMaxMoveVelocity());
return;
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(&
tangentY1,getRadius());
tangentY2,getRadius());
bestHitY,getRadius());
doublexx=0;
doubleyy=0;
if(distance(getX(),getY(),bestHitX,bestHitY)<
distance(getX(),getY(),tangentX1,tangentY1))
xx=bestHitX;
yy=bestHitY;
elseif(distance(bestHitX,bestHitY,tangentX1,tangentY1)<
distance(bestHitX,bestHitY,tangentX2,tangentY2))
xx=tangentX1;
yy=tangentY1;
else
xx=tangentX2;
yy=tangentY2;
//防止争边球
if(getX()>
(getBallRadius()+getRadius())*3||getX()<
getCourtWidth()-(getBallRadius()+getRadius())*3)
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<
MDistance)
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()>
getCourtWidth()-getBallRadius():
getBallRadius();
if(getBallX()==bx&
getMaxMoveVelocity()*2/3)
doublejj=getBallRadius();
xx=getAttack()>
xx-jj:
xx+jj;
setMoveToward(xx,yy,getMaxMoveVelocity());
voidShootGoal()//射门
doubletargetX=getOpponentGoalCenterX();
doubletargetY=getOpponentGoalCenterY();
Shoot(targetX,targetY);
voidShootAttack()//带球射门波浪式进攻
doubletargetX=getAttack()>
getBallX()*2:
getBallX()/2;
doubletargetY=0;
getCourtWidth()*3/5)||(getAttack()<
getCourtWidth()*2/5))
if(getY()<
getBallY())targetY=getCourtHeight();
if(getBallY()<
getCourtHeight()/4)targetY=getCourtHeight();
targetY=MIN(getCourtHeight()/2+getGoalWidth()/2-getBallRadius(),targetY);
targetY=MAX(getCourtHeight()/2-getGoalWidth()/2+getBallRadius(),targetY);
}elseShootGoal();
//防止乌龙的策略
voidOwngoal()
if(JudgeDanger())
doubleRadius=getBallRadius()+getRadius();
doubleDistance=distance(getX(),getY(),getBallX(),getBallY());
doubletargetX=ballX;
if((getAttack()>
myX>
ballX+Radius)||(getAttack()<
myX<
ballX-Radius))
if(getY()>
getBallY())targetY=0;
elsetargetY=getCourtHeight();
//预测防守
voidForecastGuard()
doublex=getAttack()>
0?
getBallX()/2:
getCourtWidth()-(getCourtWidth()-getBallX())/2;
doubley=getBallY();
for(inti=0;
i<
50;
if((getAttack()>
0&
nextX<
=x)||(getAttack()<
nextX>
=x))
y=nextY;
//将y坐标限制在球门的范围内
y=MIN(getCourtHeight()/2+getGoalWidth()/2,y);
y=MAX(getCourtHeight()/2-getGoalWidth()/2,y);
setMoveTo(x,y);
voidmyGuard()
doublex=getAttack()>
doubley=getBallY();
y=MIN(getCourtHeight()/2+getGoalWidth()/2,y);
y=MAX(getCourtHeight()/2-getGoalWidth()/2,y);
setMoveTo(x,y);
//全力防守
voidGoAllOutGuard()
doublex=getAttack()>
y=MIN(getCourtHeight()/2+getGoalWidth()/2+getRadius()*2*2,y);
y=MAX(getCourtHeight()/2-getGoalWidth()/2-getRadius()*2*2,y);
//防守反击
voidGuard()
doubleRadius=getBallRadius()*2+getRadius()*2;
doubleDistance=distance(getX(),getY(),getBallX(),getBallY());
if(Distance>
Radius*10)myGuard();
else
GoAllOutGuard();
if(!
AzimuthDanger()){ShootAttack();
}//方位安全时攻击
if(isHitBall()&
!
AzimuthDanger()&
getMoveVelocity()/4){ShootAttack();
if(BotBallBotDistance()){ShootGoal();
}//如果自己离球的距离小于敌人则进攻
//判断进攻还是防守
voidAttackOrGuard()
if(AzimuthDanger()&
0){Guard();
if(JudgeDanger()&
getMaxMoveVelocity()/2){Guard();
ShootAttack();
//进攻门前争球
voidGuardConfrontEachOther()
doubleRadius=getRadius()+getBallRadius()/2;
doublexx=getAttack()>
Radius:
getCourtWidth()-Radius;
doubleMaxY=getCourtHeight()/2+getGoalWidth()/2+getRadius()*4;
doubleMinY=getCourtHeight()/2-getGoalWidth()/2-getRadius()*4;
getMaxMoveVelocity()/2)
if(getAttack()>
getX()<
xx&
(getY()>
MaxY||getY()<
MinY))
setMoveToward(getBall