




免费预览已结束,剩余8页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
足球机器人程序代码 /应用程序模板 #include /判断自身与球的方位是否危险bool AzimuthDanger() double ballX = getBallX(); double myX = getX(); double radius = getBallRadius()+getRadius(); if(getAttack()0 & myX+radius*2ballX) return true; if(getAttack()0 & myX-radius*20 & getBallX()getCourtWidth()/2) | (getAttack()getCourtWidth()/2) ) if(getBallY()getCourtHeight()/2)&(getY()getBallY()return true; if(getBallY()getCourtHeight()/2)&(getY()0 & getBallHeading()PI/2 & getBallHeading()PI*3/2) if(goalMin50*tan(getBallHeading() + b)return true; else return false;else if(getAttack()=0 & getBallHeading()PI/2 | getBallHeading()3*PI/2) if(goalMintan(getBallHeading()*(getCourtWidth() - 50) + b & tan(getBallHeading()*(getCourtWidth() - 50) + bgoalMax) return true; else return false;else return false;/预测足球在times个单位时间后的位置void Next(int times, double* nextX, double* nextY)double velocity = getBallVelocity();double heading = getBallHeading();double acc = -getBallNegativeAcceleration();*nextX = getBallX();*nextY = getBallY();for (int i = 0; i 0) velocity = fmax(0, velocity+acc); else if (velocity 0) velocity = fmin(0, velocity -acc); / 撞墙检测 if (*nextX) getCourtWidth() heading = PI - heading; modifyInCourt(nextX, nextY, getBallRadius(); if (*nextY) getCourtHeight() heading = -heading; modifyInCourt(nextX, nextY, getBallRadius(); / 跌代计算球的运行线路,计算未来的击球点void OptimumPosition(double* hitedX ,double* hitedY ) *hitedX = getBallX(); *hitedY = getBallY(); for (int i = 0; i 200; i+) double nextX, nextY; Next(i, &nextX, &nextY); if (distance(nextX, nextY, getX(), getY() 0? 1:0; struct Bot bot; getBotById(id, &bot); return bot.x;double getBotY() int id = getAttack()0? 1:0; struct Bot bot; getBotById(id, &bot); return bot.y;double getBotVelocity() int id = getAttack()0? 1:0; struct Bot bot; getBotById(id, &bot); return bot.moveVelocity;bool BotBallBotDistance()double MDistance = distance(getX(), getY(), getBallX(), getBallY();double DDistance = distance(getBotX(), getBotY(), getBallX(), getBallY();if(MDistancegetMaxMoveVelocity()/2) ? Rn=1.1 : Rn=0.93; double MDDistance = 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越大,防守能力越强double R =(getBallRadius() + getRadius()*Rn);double tangentX1, tangentX2, tangentY1, tangentY2; double bestHitX, bestHitY; double distanceToTarget = distance(targetX, targetY, getX(), getY();if(distanceToTargetR) setMoveToward(targetX, targetY, getMaxMoveVelocity();return;double tangentBearing = acos(R/distanceToTarget);double ballToMeHeading = 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();double xx=0;double yy=0;if (distance(getX(), getY(), bestHitX, bestHitY) distance(getX(), getY(), tangentX1, tangentY1) xx=bestHitX; yy=bestHitY;else if (distance(bestHitX, bestHitY, tangentX1, tangentY1) (getBallRadius()+getRadius()*3 | getX()0 ? getBallRadius()-getRadius() : getRadius()-getBallRadius(); yy = MIN(getCourtHeight()-jj, yy); yy = MAX(jj, yy); /抄近路拦截 double MDistance = distance(getX(), getY(), getBallX(), getBallY(); double DDistance = distance(getBotX(), getBotY(), getBallX(), getBallY(); if(DDistancegetMoveVelocity()/2) int fx; if(getBallY()getCourtHeight()/2)fx=1; else fx=-1; yy+=fx*getBallRadius()*2; /沿对门边路滚动时的防范措施 if(getBallHeading()=PI/2 | getBallHeading()=3*PI/2) double bx=getAttack()0 ? getCourtWidth()-getBallRadius() : getBallRadius(); if(getBallX()=bx & getBallVelocity()getMaxMoveVelocity()*2/3) double jj=getBallRadius(); xx=getAttack()0? xx-jj : xx+jj; setMoveToward(xx, yy, getMaxMoveVelocity();void ShootGoal() /射门 double targetX = getOpponentGoalCenterX(); double targetY = getOpponentGoalCenterY(); Shoot(targetX, targetY); void ShootAttack() /带球射门 波浪式进攻 double targetX= getAttack()0 ? getBallX()*2 : getBallX()/2; double targetY=0; if( (getAttack()0 & getBallX()getCourtWidth()*3/5) | (getAttack()getCourtWidth()*2/5) ) if(getY()getBallY()targetY=getCourtHeight(); if(getBallY()0 & myXballX+Radius) | (getAttack()0 & myXgetBallY() targetY=0; else targetY=getCourtHeight(); Shoot(targetX, targetY); /预测防守void ForecastGuard()double x = getAttack() 0 ? getBallX()/2 : getCourtWidth()-(getCourtWidth()-getBallX()/2;double y = getBallY();for(int i=0; i0&nextX=x) | (getAttack()=x) y = nextY; break; /将y坐标限制在球门的范围内y = MIN(getCourtHeight() / 2 + getGoalWidth() / 2, y);y = MAX(getCourtHeight() / 2 - getGoalWidth() / 2, y);setMoveTo(x, y);void myGuard() double x = getAttack()0 ? getBallX()/2 : getCourtWidth()-(getCourtWidth()-getBallX()/2; double y = getBallY(); y = MIN(getCourtHeight()/2+getGoalWidth()/2, y); y = MAX(getCourtHeight()/2-getGoalWidth()/2, y); setMoveTo(x, y);/全力防守void GoAllOutGuard()double x = getAttack()0 ? getBallX()/2 : getCourtWidth()-(getCourtWidth()-getBallX()/2;double y = getBallY();y = MIN(getCourtHeight()/2+getGoalWidth()/2+getRadius()*2*2, y);y = MAX(getCourtHeight()/2-getGoalWidth()/2-getRadius()*2*2, y);setMoveTo(x, y);/防守反击void Guard()double Radius = getBallRadius()*2 + getRadius()*2;double Distance = distance(getX(), getY(), getBallX(), getBallY();if(DistanceRadius*10) myGuard(); else GoAllOutGuard();if(!AzimuthDanger()ShootAttack();return; /方位安全时攻击if(isHitBall() & !AzimuthDanger() & getBallVelocity()getMoveVelocity()/4) ShootAttack();return;if(BotBallBotDistance()ShootGoal(); /如果自己离球的距离小于敌人则进攻/判断进攻还是防守void AttackOrGuard() if(AzimuthDanger() & getBallVelocity()0)Guard();return; if(JudgeDanger() & getBallVelocity()getMaxMoveVelocity()/2)Guard();return; ShootAttack();/进攻门前争球void GuardConfrontEachOther() double Radius = getRadius()+getBallRadius()/2; double xx=getAttack()0 ? Radius : getCourtWidth()-Radius; double MaxY = getCourtHeight() / 2 + getGoalWidth() / 2 + getRadius()*4; double MinY = getCourtHeight() / 2 - getGoalWidth() / 2 - getRadius()*4; if(getBallVelocity()getMaxMoveVelocity()/2) if (getAttack()0 & getX()MaxY | getY()MinY) setMoveToward(getBallX(), getBallY(), getMaxMoveVelocity(); if(getAttack()getCourtWidth()-xx & (getY()MaxY | getY()DDistance)drawLine(getBotX(),getBotY(),getBallX(),getBallY(); else drawLine(getX(),getY(),getBallX(),getBallY(); if(MDistance=DDistance) drawLine(getX(),getY(),getBotX(),getBotY();/组合策略void startGame() double starttime=getTime(); double bgj=0; /被进攻次数 double gj=0; /进攻次数 char* tt=; int color=-1; while(1) double timejg=getTime()-starttime; if(gj-bgj10) /对方属于防守型机器人 攻击数大于被攻击数超过10次 tt=ShootGoal;color=-256; double bx=getBallX(); /球在对方场地 进攻 if ( (getAttack()0 & bxgetCourtWidth()/2) | (getAttack()0 & bxgetMaxMoveVelocity()/5) Guard(); tt=Guard;color=-1; if(getBallVelocity()0 & getBallX()getCourtWidth()*2/5) | (getAttack()0 & getBallX()0 & getBallX()getCourtWidth()*2/5) | (getAttack()getCourtWidth()*3/5) GoAllOutGuard(); tt=GoAllOutGuard;color=-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 等式性质说课课件
- 心理技能全套课件资源
- 心理学意识基础知识课件
- 抽成合同协议书范本
- 童诗白模拟电子技术课件
- 建设工程维修协议书范本
- 几方安全协议书范本
- 牛奶合作合同协议书范本
- 个人转让协议书范本大全
- 2025年娱乐、游览用船舶项目发展计划
- 2024年上海市中考英语试题和答案
- 律师事务所廉洁从业方案
- 《代谢组学介绍》课件
- 个别化教育计划(IEP)模板
- 2025届高考作文押题预测10篇(附题目)
- 矿山开采土方外运施工方案
- 零碳智慧园区解决方案
- 贵州旅投集团考试真题
- DL∕ T 748.3-2001 火力发电厂锅炉机组检修导则 第3部分阀门与汽水管道系统检修
- 初中必背古诗61首
- 沪教版一年级下册数学口算题大全带答案
评论
0/150
提交评论