SoccerCommand Player::deMeer5_Attacker(){SoccerCommand soc(CMD_ILLEGAL);

if (WM->isBeforeKickOff()){if (formations->getFormation() != FT_INITIAL || //不在开球的阵型    WM->getAgentGlobalPosition().getDistanceTo(WM->getStrategicPosition()) > 2.0)//返回当前球员位置   {    formations->setFormation(FT_INITIAL); // go to kick_off formation    soc = teleportToPos(WM->getStrategicPosition());//返回一个move命令将agent移到某一位置;返回一队员的战略位置   }else if (WM->isKickOffUs() && WM->getPlayerNumber() == KICKOFF_TEAMMATE_NUM) //我们开球,返回开球球员号码   {if (WM->isBallKickable())//球可踢    {     ObjectT ClosestTeamMate_Midfielder_Wing = WM->getClosestPlayerRelativeInSet(OBJECT_SET_TEAMMATES, PT_MIDFIELDER_WING);//我方最近的边侧中卫,返回最近球员的相对位置     if (ClosestTeamMate_Midfielder_Wing == OBJECT_ILLEGAL)     {      soc = SoccerCommand(CMD_TURN, VecPosition::normalizeAngle(WM->getAgentGlobalBodyAngle() + 60));//标准化角度(-180,180);返回当前agent身体的绝对角度      ACT->putCommandInQueue(alignNeckWithBody());//该skill使agent的脖子转向同身体一样的方向。该方法返回一个turn neck命令,并将身体相对于脖子的角度作为参数。     }else     {      soc = directPass(WM->getGlobalPosition(ClosestTeamMate_Midfielder_Wing), PASS_NORMAL);//返回全局位置//该方法使agent将球直接传给其他队员。参数pos表示传球的目的位置,通常是队友所在位置。//参数passType表示传球类型(PASS_NORMAL或PASS_FAST)。该方法调用kickTo将球以一个根据//传球类型得出的期望的末速度踢向目标位置。     }     Log.log(100, "take kick off");    }else    {     soc = intercept(false);//false 不是守门员//当截球方法被调用,首先判断agent能否在两个周期内使用closeIntercept//(对于守门员是closeIntereptGoalie)截球。当两个周期内不能实现时,//则agent使用一种迭代的方案即通过方法getInterceptionPointBall计算最优截球点。     Log.log(100, "move to ball to take kick-off");    }   }else // else turn to front   {    soc = turnBodyToPoint(WM->getAgentGlobalPosition() + VecPosition(1, 0), 0);//将agent的身体转向某一点;返回当前agent的绝对位置。    ACT->putCommandInQueue(turnNeckToPoint(WM->getBallPos(), soc));//将agent的脖子转向某点,它接收一个场上的绝对目标点   }}else{   soc = sonruoxin4attacker();}ACT->putCommandInQueue(soc);ACT->putCommandInQueue(WM->getChangeViewCommand());return soc;}

SoccerCommand Player::sonruoxin4attacker(){SoccerCommand soc(CMD_ILLEGAL);ObjectT ClosestTeamMateAhead = WM->getClosestAheadRelativeInSet(OBJECT_SET_TEAMMATES_NO_GOALIE);ObjectT ClosestOpponentAhead = WM->getClosestAheadRelativeInSet(OBJECT_SET_OPPONENTS);ObjectT ClosestTeamMate = WM->getClosestRelativeInSet(OBJECT_SET_TEAMMATES);ObjectT ClosestOpponent = WM->getClosestRelativeInSet(OBJECT_SET_OPPONENTS);static bool DeadBallUsLock = false;int iTmp;

if (WM->getConfidence(OBJECT_BALL) < PS->getBallConfThr())// 返回该对象信息的可信度。该可信度是与上次看到这个对象以及特定的时间(一般为上次接受信息的时间)相关的。{   soc = searchBall(); // if ball pos unknown   ACT->putCommandInQueue(alignNeckWithBody()); //使agent的脖子转向同身体一样的方向。该方法返回一个turn neck命令,并将身体相对于脖子的角度作为参数。}else if (WM->isBallKickable()) // if kickable{if (fabs(WM->getBallPos().getX()) > fabs(WM->predictPosAfterNrCycles(OBJECT_OPPONENT_GOALIE, 1).getX()))//对于直线上的点,给出y坐标求x坐标该方法预测对象o经过iCycle周期后的位置。如果对象为球,则只考虑球速的衰减。如果对象是球员,则假设球员每周期使用iDashPower进行dash。。   {if (WM->getAgentGlobalPosition().getDistanceTo(WM->getPosOpponentGoal())>25)//返回对方球门的位置坐标    {     soc = dribble((WM->getPosOpponentGoal()-WM->getAgentGlobalPosition()).getDirection(), 12);//返回当前坐标的方向。//该方法使agent盘球(带球)    }else    {     soc = kickTo(WM->getPosOpponentGoal(), SS->getBallSpeedMax());    }//cout<<WM->getCurrentCycle()<<' '<<WM->getPlayerNumber()<<" Ahead of goalie"<<endl;   }else   {//shoot    VecPosition ShootPoint,ShootChioce;    VecPosition posAgent = WM->getAgentGlobalPosition();    VecPosition posGoalKeeper= WM->getGlobalPosition(OBJECT_OPPONENT_GOALIE);double shoot_value=-100,value;double shoot_range = max(SS->getGoalWidth() * WM->getAgentGlobalPosition().getDistanceTo(     WM->getPosOpponentGoal()) / PITCH_LENGTH, 0.3);//场地长度    for(ShootPoint=VecPosition(PITCH_LENGTH/2,WM->getPosOpponentGoalTop().getY()+shoot_range);//(52.5,7.62)        ShootPoint.getY()<=WM->getPosOpponentGoalBottom().getY() - shoot_range;//-7.62        ShootPoint.setY(ShootPoint.getY()+0.3))    {if ((value=getshootprofit(ShootPoint))>shoot_value)     {      shoot_value=value;      ShootChioce=ShootPoint;     }    }    Log.log(100,"shoot_value is %lf",shoot_value);    Log.log(100,"VecPosition.y is %lf",ShootChioce.getY());if (( (shoot_value>26&&WM->getBallPos().getDistanceTo(posGoalKeeper)<14)     ||(WM->getConfidence(OBJECT_OPPONENT_GOALIE)<0.95&&WM->getBallPos().getX()>35&&fabs(WM->getBallPos().getY())<20)     ||WM->getBallPos().getDistanceTo(posGoalKeeper)<7)     &&!WM->isIndirectFreeKickUs())///我们是否有个free kick    {     soc=kickTo(ShootChioce,SS->getBallSpeedMax());     ACT->putCommandInQueue(alignNeckWithBody());     DeadBallUsLock = false;     Log.log(100, " shoot");    }elseif (WM->isDeadBallUs() && WM->getConfidence(ClosestTeamMate) < 0.98)     {      Log.log(100, " our dead ball, search for teammate");      soc = SoccerCommand(CMD_TURN, VecPosition::normalizeAngle(WM->getAgentGlobalBodyAngle() + 60));      ACT->putCommandInQueue(alignNeckWithBody());      WM->setChangeViewCommand(SoccerCommand(CMD_CHANGEVIEW, VA_NORMAL, VQ_HIGH));     }else     {double disToOpp=WM->getAgentGlobalPosition().getDistanceTo(WM->getGlobalPosition(ClosestOpponentAhead));if ((ClosestOpponentAhead==OBJECT_ILLEGAL || disToOpp>11) && !WM->isDeadBallUs()&&WM->getAgentStamina().getStamina()>2500)      {       Log.log(100,"dribble very fast 8 ");double length;if (fabs(WM->getBallPos().getX())<5)       {        soc=dribble((WM->getPosOpponentGoal()-WM->getBallPos()).getDirection(),5);       }else soc=dribble((WM->getPosOpponentGoal()-WM->getBallPos()).getDirection(),8);if (WM->getBallPos().getX()<40&&fabs(WM->getBallPos().getY())<20)       {        ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL, soc));       }else       {        ACT->putCommandInQueue(lookaround(soc));       }      }else if (disToOpp>9 && !WM->isDeadBallUs()&&WM->getAgentStamina().getStamina()>2000)      {       Log.log(100,"dribble fast 7");if (fabs(WM->getBallPos().getX())<5)       {        soc=dribble((WM->getPosOpponentGoal()-WM->getBallPos()).getDirection(),5);       }else soc=dribble((WM->getPosOpponentGoal()-WM->getBallPos()).getDirection(),7);if (WM->getBallPos().getX()<40&&fabs(WM->getBallPos().getY())<20)       {        ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL, soc));       }else       {        ACT->putCommandInQueue(lookaround(soc));       }      }else if (disToOpp>6 && !WM->isDeadBallUs())      {       soc=dribble((WM->getPosOpponentGoal()-WM->getBallPos()).getDirection(),5);       Log.log(100,"dribble 5");if (WM->getBallPos().getX()<40&&fabs(WM->getBallPos().getY())<20)       {        ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL, soc));       }else       {        ACT->putCommandInQueue(lookaround(soc));       }      }else      {//pass       if (!WM->isDeadBallUs())       { soc=getBestPassCmd_Attacker();if (soc.commandType == CMD_ILLEGAL) soc = getSecondPassCmd_Attacker(8);       }else       {if ((ClosestTeamMate!=OBJECT_ILLEGAL)&&(WM->getAgentGlobalPosition().getDistanceTo(ClosestTeamMate)<10)) soc=directPass(ClosestTeamMate,PASS_NORMAL);       }if (soc.commandType != CMD_ILLEGAL)       {// prevent too smart kick        if (WM->isDeadBallUs() && soc.dPower < 30.0) soc.dPower = 50.0;        ACT->putCommandInQueue(lookaround(soc));       }else if ( // if stamina low        WM->getAgentStamina().getStamina() < SS->getRecoverDecThr() * SS->getStaminaMax() + 600)       {if (WM->getBallPos().getX()<36&&ClosestTeamMate!=OBJECT_ILLEGAL&&WM->isOnside(ClosestTeamMate)&&WM->getConfidence(ClosestTeamMate)>0.95)        {if (WM->getGlobalPosition(ClosestTeamMate).getY()>0)          soc= throughPass(ClosestTeamMate,VecPosition(52.5,6));else          soc= throughPass(ClosestTeamMate,VecPosition(52.5,-6));         Log.log(100,"through pass");

        }else        {         VecPosition posOpGK=WM->getGlobalPosition(OBJECT_OPPONENT_GOALIE);if (posOpGK.getX()>0) soc=kickTo(VecPosition(52.5,-6),SS->getBallSpeedMax());else soc=kickTo(VecPosition(52.5,6),SS->getBallSpeedMax());        }       }else if (!WM->isDeadBallUs())       {if (disToOpp>2)        {double angOpp=VecPosition::normalizeAngle(WM->getGlobalBodyAngle(ClosestOpponentAhead));double outPlayAng;if ((angOpp>=0)&&(angOpp<180)) outPlayAng=fabs(VecPosition::normalizeAngle(angOpp+45));else   outPlayAng=fabs(VecPosition::normalizeAngle(angOpp-45));         soc=dribble(outPlayAng,5);         Log.log(100,"dangerous outPlayAng is %lf ",outPlayAng);        }/*else if (disToOpp>2)        {

        double angOpp=VecPosition::normalizeAngle(WM->getGlobalBodyAngle(ClosestOpponentAhead));        double outPlayAng;        if ((angOpp>=0)&&(angOpp<180)) outPlayAng=angOpp+45;        else   outPlayAng=angOpp-45;        VecPosition PosTo=WM->getAgentGlobalPosition()+VecPosition(3,outPlayAng,POLAR),*ballpos;        soc=outplayOpponent(ClosestOpponentAhead,PosTo,ballpos);        Log.log(100,"outplay");       }*/else        {         soc=holdBall();         Log.log(100,"hold ball");        }//soc=getBestDribbleCmd_Attacker(-100);        if (WM->getBallPos().getX()<40&&fabs(WM->getBallPos().getY())<20)        {         ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL, soc));        }else        {         ACT->putCommandInQueue(lookaround(soc));        }       }      }      WM->setChangeViewCommand(SoccerCommand(CMD_CHANGEVIEW, VA_NARROW, VQ_HIGH));    }   }}else if (WM->getBallPos().getDistanceTo(WM->predictPosAfterNrCycles(OBJECT_OPPONENT_GOALIE, 1)) <= SS->getTackleDist()+1 && WM->getProbTackleSucceeds() > PS->getTackleConfThr() ){   soc = tackle((WM->getPosOpponentGoal()-WM->getAgentGlobalPosition()).getDirection());}// if we get a dead ball, and it's not in our penalty area (if is, the goalie will take it sooner or later)// if this player is closest to the ball, he will go to take the ballelse if (WM->isDeadBallUs()   && WM->getClosestInSetTo(OBJECT_SET_TEAMMATES, OBJECT_BALL) == WM->getAgentObjectType()){   Log.log(100, " go to take dead ball");// if not in position, move to position   if (WM->getRelativeDistance(OBJECT_BALL) >= SS->getMaximalKickDist())   {    soc = moveToPos(getDeadBallPosition(), 5); // move to take dead ball// if stamina low, dash slowly    if (soc.commandType == CMD_DASH && WM->getAgentStamina().getStamina() < SS->getRecoverDecThr() * SS->getStaminaMax() + 800)    {     Log.log(100, " but stamina is too low");     soc.dPower = 30.0 * WM->getAgentStamina().getRecovery();    }    ACT->putCommandInQueue(lookaround(soc));   }// else wait till kickable signal   else   {    soc = turnBodyToPoint(WM->getPosOpponentGoal());    ACT->putCommandInQueue(lookaround(soc));   }   WM->setChangeViewCommand(SoccerCommand(CMD_CHANGEVIEW, VA_NARROW, VQ_HIGH));}// if this player is 2nd closest to the ball, he will go to back up the 1st oneelse if (WM->isDeadBallUs() && !WM->isBallInOwnPenaltyArea()   && WM->getSecondClosestInSetTo(OBJECT_SET_TEAMMATES, OBJECT_BALL) == WM->getAgentObjectType()){   Log.log(100, " go to backup dead ball");// if not in position, move to position   if (WM->getRelativeDistance(OBJECT_BALL) >= 6.0)   {    soc = moveToPos(getDeadBallBackUpPosition(), 5); // move to take dead ball// if stamina low, dash slowly    if (soc.commandType == CMD_DASH && WM->getAgentStamina().getStamina() < SS->getRecoverDecThr() * SS->getStaminaMax() + 800)    {     Log.log(100, " but stamina is too low");     soc.dPower = 30.0 * WM->getAgentStamina().getRecovery();    }    ACT->putCommandInQueue(lookaround(soc));   }// else wait till kickable signal   else   {    soc = turnBodyToPoint(WM->getGlobalPosition(OBJECT_BALL));    ACT->putCommandInQueue(lookaround(soc));   }   WM->setChangeViewCommand(SoccerCommand(CMD_CHANGEVIEW, VA_NARROW, VQ_HIGH));}else{ // if fastest to ball   int cycles_fastest_to_ball, cycles_intercept;   ObjectT obj_fastest_to_ball = WM->getFastestInSetTo(OBJECT_SET_TEAMMATES_NO_GOALIE, OBJECT_BALL, &cycles_fastest_to_ball);   WM->predictCommandToInterceptBall(WM->getAgentObjectType(), interceptClose(), &cycles_intercept);// if fastest to ball, intercept it   if (( obj_fastest_to_ball == WM->getAgentObjectType() || cycles_intercept<=cycles_fastest_to_ball+1 )    && !WM->isDeadBallThem() && !WM->isDeadBallUs())   {    Log.log(100, " fastest to ball; can get there in %d cycles", cycles_intercept);    soc = intercept(false);if (soc.commandType == CMD_DASH && // if stamina low     WM->getAgentStamina().getStamina() < SS->getRecoverDecThr() * SS->getStaminaMax() + 200)    {     Log.log(100, " I will be slow");     soc.dPower = 30.0 * WM->getAgentStamina().getRecovery(); // dash slow    }if (WM->getBallPos().getX()<40&&fabs(WM->getBallPos().getY())<20)    {     ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL, soc));    }else    {     ACT->putCommandInQueue(lookaround(soc));    }    WM->setChangeViewCommand(SoccerCommand(CMD_CHANGEVIEW, VA_NARROW, VQ_HIGH));   }

else if (WM->getAgentGlobalPosition().getDistanceTo(WM->getStrategicPosition()) > 1.5 + fabs(WM->getAgentGlobalPosition().getX() - WM->getBallPos().getX()) / 10.0 )// if not near strategic pos   {if (WM->getAgentStamina().getStamina() > // if stamina high     SS->getRecoverDecThr() * SS->getStaminaMax() + 800)    {     soc = moveToPos(WM->getStrategicPosition(), PS->getPlayerWhenToTurnAngle());if(WM->isInTheirPenaltyArea(WM->getBallPos())      soc=kickTo(WM->getPosOpponentGoal(),SS->getBallSpeedMax());else      soc = dribble((WM->getPosOpponentGoal()-WM->getAgentGlobalPosition()).getDirection(),DRIBBLE_FAST);    }else // else watch front    {     soc = turnBodyToPoint(WM->getStrategicPosition());    }if (WM->isDeadBallUs())    {     ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL, soc));    }else    {     ACT->putCommandInQueue(lookaround(soc));    }    WM->setChangeViewCommand(SoccerCommand(CMD_CHANGEVIEW, VA_NARROW, VQ_HIGH));   }else   {    Log.log(100, " nothing to do but watching ball or looking around");if (WM->isDeadBallUs())    {     soc = turnBodyToPoint(WM->getBallPos());     ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL, soc));    }else    {     soc = turnBodyToPoint(WM->getAgentGlobalPosition() + VecPosition(100, 0), 0);     ACT->putCommandInQueue(lookaround(soc));    }    WM->setChangeViewCommand(SoccerCommand(CMD_CHANGEVIEW, VA_NARROW, VQ_HIGH));   }}

return soc;}

//***************************************************************************88double BasicPlayer::getShootProfit(VecPosition ShootPoint){double value=10,dis=0,n2=0,n3=0;int iIndex,num=0,n1=0,n4=0,nall=0;double dis_OP[10]={0};Line shoot_line = Line::makeLineFromTwoPoints(WM->getBallPos(),ShootPoint);double dis_GK=shoot_line.getDistanceWithPoint(WM->predictPosAfterNrCycles(OBJECT_OPPONENT_GOALIE, 1));double dis_GK_Ball=WM->getBallPos().getDistanceTo(WM->getGlobalPosition(OBJECT_OPPONENT_GOALIE));if (dis_GK>4.0) n2=32.0;else n2=8*dis_GK;if (dis_GK_Ball>20) n3=-8;else   n3=-0.4*dis_GK_Ball;for (ObjectT o = WM->iterateObjectStart(iIndex, OBJECT_SET_OPPONENTS , PS->getPlayerConfThr());o != OBJECT_ILLEGAL;o = WM->iterateObjectNext(iIndex, OBJECT_SET_OPPONENTS , PS->getPlayerConfThr()))if (dis=shoot_line.getDistanceWithPoint(WM->predictPosAfterNrCycles(o, 1))<3    && !WM->getAgentGlobalPosition().isInFrontOf(o)&& o!=OBJECT_OPPONENT_GOALIE )   {    num++;    n1=0;if (dis>2) n1=n1+2;else if (dis>1) n1=n1+1;else n1=n1-2;    dis_OP[num]=dis;    nall+=n1;   }/*if (num==0) value=n2+n3+5;   else {   if (nall>=0) value=n2+n3+nall/num;   else value=n2+n3+nall/num;}*/   value=n2+n3;return value;}/******************************/SoccerCommand BasicPlayer::getBestPassCmd_Attacker(){//return SoccerCommand(CMD_ILLEGAL);return getBestPassCmd_Defender();}

转载于:https://www.cnblogs.com/syxchina/archive/2010/05/29/2197411.html

deMeer5_Attacker相关推荐

最新文章

  1. 国产光刻机的现状究竟如何?
  2. 【必看】这6个吓人的Linux命令,你用过吗?
  3. js md5 过滤表情 数据签名
  4. 想要使用 for循环,就要添加 索引器
  5. 两阶段3D目标检测网络 SIENet: Spatial Information Enhancement Network for 3D Object Detection from Point Cloud
  6. C语言 数组指针 - C语言零基础入门教程
  7. length函数的头文件_Framebuffer 应用编程中涉及的 API 函数
  8. 数据结构之线性表(附代码)
  9. 终于有人把大数据架构讲明白了
  10. rapidxml学习记录
  11. 热传导方程以及Matlab求解
  12. heaps入门---1
  13. 网吧游戏更新对比软件技术报告
  14. 电信宽带华为HG8245光纤猫开路由、WIFI的破解办法
  15. Windows平台下常见快捷指令
  16. 打开浏览器时主页被锁定怎么也改不掉的一个好办法
  17. 为什么单例模式中的Double Check要加volatile
  18. 程序员和产品经理凡尔赛文学对话
  19. 详解人工智能(AI) 机器学习(ML) 深度学习(DL)
  20. UnionPay,ChinaPay 最新 银联支付接口C#\Asp.net\MVC 版本

热门文章

  1. C语言精髓篇|函数的参数和返回值
  2. mysql8 安装_MySQL8.x安装使用
  3. html5编辑器新手用,3款容易上手的HTML5编辑工具推荐~
  4. div alert html,基于jQuery的弹出消息插件 DivAlert之旅(一)
  5. java爬虫jsoup_Java爬虫之利用Jsoup自制简单的搜索引擎
  6. mybatis mysql demo_SpringBoot(入门Demo,整合mybatis,连接mysql)
  7. java list 取几个字段组装成map_24道Java各类常见问题整理
  8. springboot 打包_springboot打包-体积太大怎么办
  9. uniapp怎么引入css_CSS 三种基础选择器
  10. ubuntu按方向键出现abcd_Ubuntu Vi方向键[A [B [C [D问题解决