1、 return false;/判断球的运动方向 返回true 危险bool JudgeDanger()double ballX = getBallX();double ballY = getBallY();double goalMin = getCourtHeight()/2-getGoalWidth()/2;double goalMax = getCourtHeight()/2+getGoalWidth()/2;double b = ballY - tan(getBallHeading()*ballX;if(getAttack() getBallHeading()PI/2 & getBall
2、Heading()PI*3/2) if(goalMin50*tan(getBallHeading() + b)return true; else return false;else if(getAttack()PI/2 | getBallHeading()2*PI &3*PI/2)tan(getBallHeading()*(getCourtWidth() - 50) + b & tan(getBallHeading()*(getCourtWidth() - 50) + bgoalMax) return true;else return false;/预测足球在times个单位时间后的位置voi
3、d 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, velo
4、city -acc); / 撞墙检测 if (*nextX) getCourtWidth() heading = PI - heading; modifyInCourt(nextX, nextY, getBallRadius(); if (*nextY) getCourtHeight() heading = -heading;/ 跌代计算球的运行线路,计算未来的击球点void OptimumPosition(double* hitedX ,double* hitedY ) *hitedX = getBallX(); *hitedY = getBallY(); for (int i = 0; 2
5、00; 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() return bot.y;double getBotVelocity() return bot.moveVelocity;bool BotBallBotDistance()double MDistance = distance(getX(), getY(), ge
6、tBallX(), 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+getR
7、adius()*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
8、(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,bal
9、lToMeHeading - tangentBearing,R,&tangentX2, &tangentY2);nextPoint(ballX, ballY,heading(targetX, targetY, ballX, ballY),R,&bestHitX, &bestHitY);modifyInCourt(&tangentY1, getRadius();tangentY2, getRadius();bestHitY, getRadius();double xx=0;double yy=0;if (distance(getX(), getY(), bestHitX, bestHitY) d
10、istance(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
11、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 | getBal
12、lHeading()=3*PI/2) double bx=getAttack() getCourtWidth()-getBallRadius() : getBallRadius(); if(getBallX()=bx &getMaxMoveVelocity()*2/3) double jj=getBallRadius(); xx=getAttack() xx-jj : xx+jj;setMoveToward(xx, yy, getMaxMoveVelocity();void ShootGoal() /射门 double targetX = getOpponentGoalCenterX(); d
13、ouble targetY = getOpponentGoalCenterY(); Shoot(targetX, targetY);void ShootAttack() /带球射门 波浪式进攻 double targetX= getAttack() getBallX()*2 : getBallX()/2; double targetY=0;getCourtWidth()*3/5) | (getAttack()getCourtWidth()*2/5) ) if(getY()getBallY()targetY=getCourtHeight(); if(getBallY() myXballX+Rad
14、ius) | (getAttack() myXgetBallY() targetY=0; else targetY=getCourtHeight();/预测防守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;/将y坐标限制在球门的范围内y = MIN(getCourtHeight(
15、) / 2 + getGoalWidth() / 2, y);y = MAX(getCourtHeight() / 2 - getGoalWidth() / 2, y);setMoveTo(x, y);void myGuard() double x = getAttack() double y = getBallY(); y = MIN(getCourtHeight()/2+getGoalWidth()/2, y); y = MAX(getCourtHeight()/2-getGoalWidth()/2, y); setMoveTo(x, y);/全力防守void GoAllOutGuard(
16、)double x = getAttack()y = MIN(getCourtHeight()/2+getGoalWidth()/2+getRadius()*2*2, y);y = MAX(getCourtHeight()/2-getGoalWidth()/2-getRadius()*2*2, y);/防守反击void Guard()double Radius = getBallRadius()*2 + getRadius()*2;double Distance = distance(getX(), getY(), getBallX(), getBallY();if(DistanceRadiu
17、s*10) myGuard();else GoAllOutGuard();if(!AzimuthDanger()ShootAttack(); /方位安全时攻击if(isHitBall() & !AzimuthDanger() &getMoveVelocity()/4) ShootAttack();if(BotBallBotDistance()ShootGoal(); /如果自己离球的距离小于敌人则进攻/判断进攻还是防守void AttackOrGuard() if(AzimuthDanger() &0)Guard(); if(JudgeDanger() &getMaxMoveVelocity(
18、)/2)Guard(); ShootAttack();/进攻门前争球void GuardConfrontEachOther() double Radius = getRadius()+getBallRadius()/2; double xx=getAttack() Radius : getCourtWidth()-Radius; double MaxY = getCourtHeight() / 2 + getGoalWidth() / 2 + getRadius()*4; double MinY = getCourtHeight() / 2 - getGoalWidth() / 2 - getRadius()*4;getMaxMoveVelocity()/2) if (getAttack() getX()MaxY | getY()MinY) setMoveToward(getBall
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1