机器人足球代码1汇编.docx
- 文档编号:4862889
- 上传时间:2022-12-10
- 格式:DOCX
- 页数:11
- 大小:17.89KB
机器人足球代码1汇编.docx
《机器人足球代码1汇编.docx》由会员分享,可在线阅读,更多相关《机器人足球代码1汇编.docx(11页珍藏版)》请在冰豆网上搜索。
机器人足球代码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() { 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() { 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() { setMoveToward(getBall
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 机器人 足球 代码 汇编