?? offense.cpp
字號(hào):
/* * Copyright 2002-2005, Mersad Team, Allameh Helli High School (NODET). * * This program is free software, you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * This file is created by: Ahmad Boorghany * * Released on Monday 1 August 2005, 10 Mordad 1384 by Mersad RoboCup Team. * For more information please read README file.*/#include <cmath>#include <Pass.h>#include <Logger.h>#include <Basics.h>#include <Defines.h>#include <Offense.h>#include <BasicDash.h>#include <BasicTurn.h>#include <AdvancedAgent.h>using namespace std;Offense::Offense(const WorldModel *worldModel): AdvancedAction(worldModel){}Offense::~Offense(){}float Offense::getValue(const Library &library){ LOG << "Offense::getValue" << endl;/* if (worldModel->getPlayMode() != PM_PLAY_ON) { nonPlayOnOffense(); return AD_NORMAL_VALUE; } offenseDecision = getOffenseDecision(); if (offenseDecision == OD_GETTING_CROSS) { resetWeights();// logWeights(); applyInterceptCalcWeights();// logWeights(); applyHomeWeights();// logWeights(); applyShootWeights();// logWeights(); offenseMax = getMaxWeight(); if (offenseMax == NOVALUE) offensePoint = positioning.getHomePoint( worldModel->getBody().getUniNum()); else offensePoint = getWeightPoint(offenseMax); } else { offenseMax = NOVALUE; offensePoint = positioning.getHomePoint( worldModel->getBody().getUniNum()); }*/ return AD_MIN_VALUE;}void Offense::execute(Form &form, const Library &library){ LOG << "Offense::execute" << endl; Point offensePoint = library.positioning.getHomePoint(worldModel->getBody().getUniNum()); command = library.positioning.getPositioningCommand(offensePoint); command->setCreator(AT_OFFENSE);/* if (worldModel->getPlayMode() != PM_PLAY_ON) { command = DashNormalGotoPoint( positioning.getHomePoint(worldModel->getBody().getUniNum()), 1, worldModel->getBody()).getCommand(); if (!command) { command = new EmptyCommand(); } } if (worldModel->getBody().getDistance(offensePoint) < 2) command = TurnToObject(worldModel->getBall(), worldModel->getBody(), 5).getCommand(); else command = DashNormalGotoPoint(offensePoint, 1, worldModel->getBody()).getCommand(); if (!command) command = new EmptyCommand();*/}Point Offense::getHomePoint(int playerUniNum, const Library &library){ return library.positioning.getHomePoint(playerUniNum);}/*Point Offense::getWeightPoint(unsigned num){ return Point(52 - OFFENSE_X_SIZE + (num % OFFENSE_X_NUM), floor((float)num / OFFENSE_X_NUM) - OFFENSE_Y_SIZE / 2);}void Offense::applyInterceptCalcWeights(){ LOG << "Offense::applyInterceptCalcWeights" << endl; interCalc.startSession(0); interCalc.updateByWorldModel(worldModel); Vector vector; vector.setByPoints(worldModel->getBall().getPos(), CROSS_CENTER_POINT); vector.setAsPolar(2.7, vector.getDirection()); Ball simBall; for (unsigned i = 0; i < CROSS_CALCULATES_NUM; i++) { simBall = worldModel->getBall(); simBall.setVel() = vector; simBall.setVel().rotate(((int)i - CROSS_CALCULATES_NUM / 2.00) * CROSS_DIR_STEP);//LOG << "New interCalc." << endl// << "simBall pos: " << simBall.getPos() << endl// << "simBall vel: " << simBall.getVel() << endl; simBall.simulateByDynamics(worldModel->getBody()); interCalc.setVirtualBall(simBall); interCalc.run(); if (interCalc.existFastestPlayer() && interCalc.getFastestPlayer().getTeamId() == TID_OPPONENT) applyOneInterceptCalcWeight(interCalc.getFastestInterPlayer()); }}void Offense::applyOneInterceptCalcWeight(const InterceptPlayer &checkPlayer){ LOG << "Offense::applyOneInterceptCalcWeight" << endl; float dist = checkPlayer.getPlayer().getDistance( checkPlayer.getInterPoint());//LOG << "dist: " << dist << endl;//LOG << "interPoint: " << checkPlayer.getInterPoint() << endl;//LOG << "fastestPos: " << checkPlayer.getPlayer().getPos() << endl; for (unsigned i = 0;i < OFFENSE_POINTS_NUM; i++) if (getWeightPoint(i).getDistance(checkPlayer.getInterPoint()) < dist - FASTEST_DELTA_DIST) {//LOG << "i entered: " << i << endl;//LOG << "point: " << getWeightPoint(i) << endl; if (!valids[i]) continue;//LOG << "i added: " << i << endl; if (checkPlayer.getPlayer().isGoalie()) weights[i] += INTERCEPT_CALC_WEIGHT; else weights[i] += INTERCEPT_CALC_WEIGHT; }}void Offense::applyHomeWeights(){ LOG << "Offense::applyHomeWeights" << endl; Point homePoint(positioning.getHomePoint( worldModel->getBody().getUniNum())); for (unsigned i = 0;i < OFFENSE_POINTS_NUM; i++) { if (!valids[i]) continue; weights[i] += Basics::reRate(getWeightPoint(i).getDistance(homePoint), 0, 15, 0, HOME_DIST_WEIGHT, RRM_REVERSE); }}void Offense::applyShootWeights(){ LOG << "Offense::applyShootWeights" << endl; float shootDir, shootDist, shootValue; for (unsigned i = 0;i < OFFENSE_POINTS_NUM; i++) { if (!valids[i]) continue; shootDir = Pass::getShootDirValue(getWeightPoint(i), worldModel); shootDist = hypot(getWeightPoint(i).x - 52.5, fmin(getWeightPoint(i).y - 4, getWeightPoint(i).y + 4)); shootValue = shootDir - shootDist / 3; weights[i] += Basics::reRate(shootValue, 35, 90, 0, SHOOT_WEIGHT, RRM_DIRECT); }}unsigned Offense::getMaxWeight(){ unsigned maxer = NOVALUE; for (unsigned i = 1; i < OFFENSE_POINTS_NUM; i++) { if (!valids[i]) continue; if (maxer == NOVALUE || weights[i] > weights[maxer]) maxer = i; } if (maxer != NOVALUE) LOG << "Offense max weight: " << weights[maxer] << endl; return maxer;}void Offense::resetWeights(void){ float offsideX = worldModel->getOppOffsideLine(); for (unsigned i = 0; i < OFFENSE_POINTS_NUM; i++) { weights[i] = 0; if (getWeightPoint(i).x > offsideX - OFFSIDE_SURE_DIST) valids[i] = false; else valids[i] = true; }}OffenseDecision Offense::getOffenseDecision(){ if (worldModel->getBall().getPos().getX() > CROSS_PERMITTED_X && (worldModel->getBallStatus() == BS_KICKABLE_TMM || worldModel->getBallStatus() == BS_KICKABLE_TMM_OPP || worldModel->getBallStatus() == BS_FREE_BALL_TMM || worldModel->getBallStatus() == BS_FREE_BALL_TMM_OPP) && worldModel->getBody().getPostNum() >= 9) return OD_GETTING_CROSS; return OD_NONE;}void Offense::logWeights(){ float lastY = getWeightPoint(0).y; LOG << "Offense points:" << endl; for (unsigned i = 0; i < OFFENSE_POINTS_NUM; i++) { if (lastY != getWeightPoint(i).y) { LOG << endl; lastY = getWeightPoint(i).y; } LOG << "P" << getWeightPoint(i) << "V" << valids[i] << "W" << weights[i] << "\t"; } LOG << endl;}void Offense::nonPlayOnOffense(){ offensePoint = positioning.getHomePoint( worldModel->getBody().getUniNum()); return;}*/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -