📄 player.c
字号:
} else if (area == 4 || area == 5) { if (canThroughPass(posThroughPass, speedThroughPass)) { soc = directPass(posThroughPass, PASS_FAST); Log.logWithTime(777, " pass to tmt(%d)", SoccerTypes::getIndex(tmtPass) + 1); } else { soc = clearBall(CLEAR_BALL_GOAL, sideType); Log.logWithTime(777, " clear goal "); } } else { soc = shoot(posShoot); Log.logWithTime(777, " last shoot with the p (%f)", shootP); } } else if (WM-> getFastestInSetTo(OBJECT_SET_TEAMMATES, OBJECT_BALL, &iTmp) == WM->getAgentObjectType() && !WM->isDeadBallThem()) { // if fastest to ball soc = intercept(false); // intercept the ball soc = adjustDashPowerForStamina(soc, ACT_INTERCEPT); } else soc = markOpponent(posStrat); return soc;}/*! 中场的决策。 * */SoccerCommand Player::midfielderStrategy(){ SoccerCommand soc(CMD_ILLEGAL); // for goal VecPosition posGoal(52.5, 0); //for me VecPosition posAgent = WM->getAgentGlobalPosition(); VecPosition posStrat = WM->getMyStrategicPosition(); double myX = posAgent.getX(); double myY = posAgent.getY(); int area = WM->getPosArea(posAgent); //自己所在的区域。 SideT sideType = WM->getSide(); AngDeg angBody = WM->getAgentGlobalBodyAngle(); AngDeg angBody2Goal = VecPosition::normalizeAngle((posGoal - posAgent).getDirection() - angBody); int numOpp4 = WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS, Circle(posAgent, 4.0)); // for ball VecPosition posBall = WM->getBallPos(); double spBall = WM->getBallSpeed(); // for shoot VecPosition posShoot(PITCH_LENGTH / 2.0, (-1 + 2 * (WM->getCurrentCycle() % 2)) * 0.4 * SS->getGoalWidth()); // for pass ObjectT tmtPass = OBJECT_ILLEGAL; VecPosition posPass; AngDeg angPass = 0; double speedPass = 2.0; // for through pass ObjectT tmtThroughPass = OBJECT_ILLEGAL; VecPosition posThroughPass(52.5, 0); AngDeg angThroughPass = 0; double speedThroughPass = 2.0; // for dribble AngDeg angDribble = 0; // for intercept int iTmp; formationDecision(); //确定比赛阵型。 if (WM->getConfidence(OBJECT_BALL) < PS->getBallConfThr()) { soc = searchBall(); // if ball pos unknown } else if (WM->isBallKickable()) { // if kickable double shootP = WM->getAgentShootProbability(posShoot); if (shootP >= 0.9) { soc = shoot(posShoot); Log.logWithTime(777, " shoot with the p (%f)", shootP); return soc; } else if (fabs(angBody2Goal) > 90 && numOpp4 == 0) { if (spBall < 1.7) { soc = turnWithBallTo(0, PS->getTurnWithBallAngThr(), PS->getTurnWithBallFreezeThr()); Log.logWithTime(777, " turn with ball"); } else { soc = freezeBall(); Log.logWithTime(777, " freeze ball"); } } else if (isPlayOn && WM->canDribble(angDribble, DRIBBLE_FAST)) { soc = dribble(angDribble, DRIBBLE_FAST); Log.logWithTime(777, " dribble fast "); } else if (canThroughPass(tmtThroughPass, posThroughPass)) { soc = throughPass(tmtThroughPass, posThroughPass); Log.logWithTime(777, "through pass"); } else if (WM->canSmartPassBallToTmt(tmtPass, angPass, speedPass)) { soc = smartPassBallToTmt(tmtPass, angPass, speedPass); Log.logWithTime(777, " pass to tmt(%d)", SoccerTypes::getIndex(tmtPass) + 1); } else if (isPlayOn && WM->canDribble(angDribble, DRIBBLE_SLOW)) { soc = dribble(angDribble, DRIBBLE_SLOW); Log.logWithTime(777, " dribble slow "); } else if (isPlayOn && WM->canDribble(angDribble, DRIBBLE_WITHBALL)) { soc = dribble(angDribble, DRIBBLE_WITHBALL); Log.logWithTime(777, " dribble with ball "); } else if (area == 1) { soc = clearBall(CLEAR_BALL_DEFENSIVE, sideType); Log.logWithTime(777, " clear defensive "); } else if (area == 2) { soc = clearBall(CLEAR_BALL_OFFENSIVE_SIDE, sideType); Log.logWithTime(777, " clear offensive "); } else if (area == 3) { soc = clearBall(CLEAR_BALL_OFFENSIVE, sideType); Log.logWithTime(777, " clear offensive side "); } else if (area == 4 || area == 5) { if (canThroughPass(posThroughPass, speedThroughPass)) { soc = directPass(posThroughPass, PASS_FAST); Log.logWithTime(777, " pass to tmt(%d)", SoccerTypes::getIndex(tmtPass) + 1); } else { soc = clearBall(CLEAR_BALL_GOAL, sideType); Log.logWithTime(777, " clear goal "); } } else { soc = shoot(posShoot); Log.logWithTime(777, " last shoot with the p (%f)", shootP); } } else if (WM-> getFastestInSetTo(OBJECT_SET_TEAMMATES, OBJECT_BALL, &iTmp) == WM->getAgentObjectType() && !WM->isDeadBallThem()) { // if fastest to ball soc = intercept(false); // intercept the ball soc = adjustDashPowerForStamina(soc, ACT_INTERCEPT); } else { //if (WM->isBallInOurPossesion()) // soc = remarkOpponent(posStrat); //else soc = remarkOpponent(posStrat); } return soc;}/*! 前锋的决策。 * */SoccerCommand Player::attackerStrategy(){ SoccerCommand soc(CMD_ILLEGAL); // for goal VecPosition posGoal(52.5, 0); //for me VecPosition posAgent = WM->getAgentGlobalPosition(); VecPosition posStrat = WM->getMyStrategicPosition(); double myX = posAgent.getX(); double myY = posAgent.getY(); int area = WM->getPosArea(posAgent); //自己所在的区域。 SideT sideType = WM->getSide(); AngDeg angBody = WM->getAgentGlobalBodyAngle(); AngDeg angBody2Goal = VecPosition::normalizeAngle((posGoal - posAgent).getDirection() - angBody); int numOpp4 = WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS, Circle(posAgent, 4.0)); // for ball VecPosition posBall = WM->getBallPos(); double spBall = WM->getBallSpeed(); // for shoot VecPosition posShoot(PITCH_LENGTH / 2.0, (-1 + 2 * (WM->getCurrentCycle() % 2)) * 0.4 * SS->getGoalWidth()); // for pass ObjectT tmtPass = OBJECT_ILLEGAL; VecPosition posPass; AngDeg angPass = 0; double speedPass = 2.0; // for through pass ObjectT tmtThroughPass = OBJECT_ILLEGAL; VecPosition posThroughPass(52.5, 0); double speedThroughPass = 1.9; // for dribble; AngDeg angDribble = 0; // for intercept int iTmp; // for clear forward VecPosition posCorner(52.5, sign(myY) * 34); AngDeg angToCorner = (posCorner - posAgent).getDirection(); VecPosition posClearF = posBall + VecPosition(15, angToCorner, POLAR); double speedClearF = 1.0; formationDecision(); //确定比赛阵型。 if (WM->getConfidence(OBJECT_BALL) < PS->getBallConfThr()) { soc = searchBall(); // if ball pos unknown } else if (WM->isBallKickable()) { // if kickable //------------------------------------------------------// double shootP = WM->getAgentShootProbability(posShoot); if (shootP >= 0.9) { soc = shoot(posShoot); Log.logWithTime(777, " shoot with the p (%f)", shootP); //cout << endl << "shoot " << shootP * 100; return soc; } else if (canThroughPass(tmtThroughPass, posThroughPass)) { soc = throughPass(tmtThroughPass, posThroughPass); Log.logWithTime(777, "through pass"); } else if (fabs(angBody2Goal) > 90 && numOpp4 == 0) { if (spBall < 1.7) { soc = turnWithBallTo(0, PS->getTurnWithBallAngThr(), PS->getTurnWithBallFreezeThr()); Log.logWithTime(777, " turn with ball"); } else { soc = freezeBall(); Log.logWithTime(777, " freeze ball"); } } else if (canClearForward(posClearF, speedClearF)) { soc = kickTo(posClearF, speedClearF); } else if (isPlayOn && WM->canDribble(angDribble, DRIBBLE_FAST)) { soc = dribble(angDribble, DRIBBLE_FAST); Log.logWithTime(777, " dribble fast "); } else if (isPlayOn && WM->canDribble(angDribble, DRIBBLE_SLOW)) { soc = dribble(angDribble, DRIBBLE_SLOW); Log.logWithTime(777, " dribble slow "); } else if (WM->canSmartPassBallToTmt(tmtPass, angPass, speedPass)) { soc = smartPassBallToTmt(tmtPass, angPass, speedPass); Log.logWithTime(777, " pass to tmt(%d)", SoccerTypes::getIndex(tmtPass) + 1); } else if (isPlayOn && WM->canDribble(angDribble, DRIBBLE_WITHBALL)) { soc = dribble(angDribble, DRIBBLE_WITHBALL); Log.logWithTime(777, " dribble with ball "); } else if (area == 1) { soc = clearBall(CLEAR_BALL_DEFENSIVE, sideType); Log.logWithTime(777, " clear defensive "); } else if (area == 2) { soc = clearBall(CLEAR_BALL_OFFENSIVE_SIDE, sideType); Log.logWithTime(777, " clear offensive "); } else if (area == 3) { soc = clearBall(CLEAR_BALL_OFFENSIVE, sideType); Log.logWithTime(777, " clear offensive side "); } else if (area == 4 || area == 5) { if (canThroughPass(posThroughPass, speedThroughPass)) { soc = directPass(posThroughPass, PASS_FAST); } else { soc = clearBall(CLEAR_BALL_GOAL, sideType); Log.logWithTime(777, " clear goal "); } } else { soc = shoot(posShoot); Log.logWithTime(777, " last shoot with the p (%f)", shootP); } } else if (WM-> getFastestInSetTo(OBJECT_SET_TEAMMATES, OBJECT_BALL, &iTmp) == WM->getAgentObjectType() && !WM->isDeadBallThem()) { // if fastest to ball soc = intercept(false); // intercept the ball soc = adjustDashPowerForStamina(soc, ACT_INTERCEPT); } else{ soc = remarkOpponent(posStrat); //soc = markOpponent(posStrat); } return soc;}/*! * */bool Player::canThroughPass(VecPosition & pos, double &speed){ VecPosition posAgent = WM->getAgentGlobalPosition(); double myX = posAgent.getX(); double myY = posAgent.getY(); VecPosition posBall = WM->getBallPos(); //if (myX<30) if (WM->getPosArea(posAgent) < 5) return false; Line line1 = Line::makeLineFromPositionAndAngle(VecPosition(36, -20), 0); AngDeg angL, angR, angMax; if (myY > 0) { angL = (VecPosition(36, -20) - posBall).getDirection(); angR = (VecPosition(52.5, -20) - posBall).getDirection(); line1 = Line::makeLineFromPositionAndAngle(VecPosition(36, -20), 0); } else { angL = (VecPosition(52.5, 20) - posBall).getDirection(); angR = (VecPosition(36, 20) - posBall).getDirection(); line1 = Line::makeLineFromPositionAndAngle(VecPosition(36, 20), 0); } double dist = posAgent.getDistanceTo(VecPosition(52.5, 0)); AngDeg ang = WM->getDirectionOfWidestAngle(posBall, angL, angR, &angMax, dist); Line line2 = Line::makeLineFromPositionAndAngle(posBall, ang); pos = line2.getIntersection(line1); if (fabs(myY) > 10) speed = 1.9; else speed = 1.7; if (angMax > 10) return true; else return false;}/*! * */bool Player::canThroughPass(ObjectT & tmt, VecPosition & pos){ //return false; VecPosition posAgent = WM->getAgentGlobalPosition(); double myX = posAgent.getX(); double myY = posAgent.getY(); VecPosition posBall = WM->getBallPos(); int n = WM->getPlayerNumber(); if (myX < 0) return false; double dConfThr = PS->getPlayerConfThr(); int iIndex; ObjectSetT setTmt = OBJECT_SET_TEAMMATES; VecPosition posTmt(0, 0), posEnd(52.5, 0); AngDeg angTmp, angMax = -1000; //找到一个最好的接球者。 for (ObjectT o = WM->iterateObjectStart(iIndex, setTmt, dConfThr); o != OBJECT_ILLEGAL; o = WM->iterateObjectNext(iIndex, setTmt, dConfThr)) { if (SoccerTypes::getIndex(o) + 1 == WM->getPlayerNumber()) // don't include me continue; posTmt = WM->getGlobalPosition(o); if (fabs(posTmt.getY()) < 15 && posTmt.getX() < 30) continue; if (fabs(posTmt.getY()) > 24 && posTmt.getX() > 30) continue; if (fabs(posTmt.getX()) < 25 && WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS, Circle(posTmt, 8.0)) > 0) continue; double distToTmt = posBall.getDistanceTo(posTmt); if (distToTmt < 5 || distToTmt > 30) continue; if (fabs(myY) > fabs(posTmt.getY())) continue; if (posTmt.getX() < 30) posEnd.setVecPosition(52.5, posTmt.getY()); else posEnd.setVecPosition(52.5, sign(posTmt.getY()) * 6); VecPosition posShoot = getThroughPassShootingPoint(o, posEnd, &angTmp); if (WM-> getNrInSetInCircle(OBJECT_SET_OPPONENTS, Circle(posShoot, 8.0)) > 0) continue; if (angTmp > angMax) { angMax = angTmp; tmt = o; pos = posEnd; } } WM->iterateObjectDone(iIndex); if (angMax >= 15) { //cout << endl << " haha ! a good through pass!!"; return true; } else return false;}/* * */bool Player::canClearForward(VecPosition & posClearF, double &speedClearF){ VecPosition posBall = WM->getBallPos(); VecPosition posAgent = WM->getAgentGlobalPosition(); double myX = posAgent.getX(); double myY = posAgent.getY(); if (myX > 30 || myX < -5) return false; else if (WM-> getNrInSetInCircle(OBJECT_SET_OPPONENTS, Circle(posBall, 10)) == 0) return false; else { VecPosition posL, posR; if (myY > -0.5) { posL.setVecPosition(52.5, 20); posR.setVecPosition(52.5, 34); } else { posL.setVecPosition(52.5, -34); posR.setVecPosition(52.5, -20); } AngDeg angL = (posL - posBall).getDirection(); AngDeg angR = (posR - posBall).getDirection(); AngDeg angMax; AngDeg angClear = WM->getDirectionOfWidestAngle(posBall, angL, angR, &angMax, 30); posClearF = posBall + VecPosition(15, angClear, POLAR); if (myX < 20) speedClearF = 1.9; else if (myX < 25) speedClearF = 1.0; else speedClearF = 0.5; return true; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -