?? penaltydecision.cpp
字號:
/* * 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: Mohammad Salehe * * Released on Monday 1 August 2005, 10 Mordad 1384 by Mersad RoboCup Team. * For more information please read README file.*/#include <cassert>#include <Logger.h>#include <Types.h>#include <Command.h>#include <BasicTurn.h>#include <BasicDash.h>#include <Dribble.h>#include <SRPDribble.h>#include <Shoot.h>#include <NonPlayOn.h>#include <Intercept.h>#include <Degree.h>#include <GroupWorks.h>#include <PenaltyDecision.h>#include <GoaliePositioning.h>#include <GoalieIntercept.h>#include <AdvancedAgent.h>using namespace std;//#define PENALTY_DECISION_LOG//#define GOALIE_UNIFORM_NUM 11 --> Vay Salehe#define GOALIE_CATCH_NUM 0#define GOALIE_POSITIONING_NUM 1#define GOALIE_INTERCEPT_NUM 2#define GOTOKICK_NUM 3#define DRIBBLE_NUM 4#define SRPDRIBBLE_NUM 5#define SHOOT_NUM 6#define INTERCEPT_NUM 7PenaltyDecision::PenaltyDecision(const WorldModel *worldModel): BodyDecision(worldModel), withoutBallPlayOnDecision(worldModel){ addAdvancedAction(new GoalieCatch(worldModel), //0 AdvancedActionWeights(0, 1, 1), 2); addAdvancedAction(new GoaliePositioning(worldModel), //1 AdvancedActionWeights(0, 1, 1), 1); addAdvancedAction(new GoalieIntercept(worldModel), //2 AdvancedActionWeights(0, 1, 1), 1); addAdvancedAction(new NonPlayOnGotoKick(worldModel), //3 AdvancedActionWeights(0, 1, 1), 1); addAdvancedAction(new Dribble(worldModel), //4 AdvancedActionWeights(0, 1, 1), 1); addAdvancedAction(new SRPDribble(worldModel), //5 AdvancedActionWeights(0, 1, 1), 1); addAdvancedAction(new Shoot(worldModel), //6 AdvancedActionWeights(0, 1, 1), 1); addAdvancedAction(new Intercept(worldModel), //7 AdvancedActionWeights(0, 1, 1), 1); doneFlag = false;}PenaltyDecision::~PenaltyDecision(){}/*int PenaltyDecision::checkPlayMode(){#ifdef PENALTY_DECISION_LOGLOG << "PENALTY:chekcPlayMode" << endl;#endif if (worldModel->getVirtualPlayMode() == VPM_PENALTY_ON_FIELD) {#ifdef PENALTY_DECISION_LOGLOG << "VPM_POFO -> rotate field" << endl;#endif return 1;// Rotate Field Flags } if (worldModel->getVirtualPlayMode() == VPM_PENALTY_ON_FIELD_OPP) {#ifdef PENALTY_DECISION_LOGLOG << "VPM_POFO_OPP -> goalie rotate field" << endl;#endif return 2;// Rotate Field Flags ONLY for goalie } if (worldModel->getPlayMode() == PM_PENALTY_READY && (worldModel->getVirtualPlayMode() == VPM_PENALTY_MISS || worldModel->getVirtualPlayMode() == VPM_PENALTY_MISS_OPP || worldModel->getVirtualPlayMode() == VPM_PENALTY_SCORE || worldModel->getVirtualPlayMode() == VPM_PENALTY_SCORE_OPP)) { doneFlag = true; // OOOOOOOOOH MY GOD --> Salehe } return 0;}*/void PenaltyDecision::decide(int quickLevel, Form &form, const Library &library){#ifdef PENALTY_DECISION_LOGLOG << "PENALTY:doneFlag = " << doneFlag << endl;#endif resetValues(); resetQuickLevels(); if (worldModel->getBody().isGoalie()) form.headForm.tnMode = TNM_LOOK_CAREFULLY_TO_BALL; else form.headForm.tnMode = TNM_LOOK_CAREFULLY_TO_OPP_GOALIE; switch (worldModel->getPlayMode()) { case PM_PENALTY_SETUP: doneFlag = false; if (selectBallKicker() == 1) {#ifdef PENALTY_DECISION_LOGLOG << "PENALTY: Setup 1 1" << endl;#endif Point setupPoint; if (worldModel->getBody().isGoalie()) { setupPoint.x = -55; setupPoint.y = -22; } else { setupPoint.x = Degree::cos(worldModel->getBody().getUniNum() * 14 + 90) * 5; setupPoint.y = Degree::sin(worldModel->getBody().getUniNum() * 14 + 90) * 5; } ExactGotoPoint doGotoPoint(AT_PENALTY_DECISION, setupPoint, 1, worldModel->getBody()); command = doGotoPoint.getCommand(); if (command == NULL) command = new EmptyCommand(AT_PENALTY_DECISION); return; } else {#ifdef PENALTY_DECISION_LOGLOG << "PENALTY: Setup 1 2" << endl;#endif advancedActions[GOTOKICK_NUM]->getValue(library); advancedActions[GOTOKICK_NUM]->execute(form, library); command = advancedActions[GOTOKICK_NUM]->getCommand(); return; } break; case PM_PENALTY_SETUP_OPP: doneFlag = false; {#ifdef PENALTY_DECISION_LOGLOG << "PENALTY: SetupOpp 1 1" << endl;#endif Point setupPoint; if (worldModel->getBody().isGoalie()) { setupPoint.x = -40; setupPoint.y = 0; } else { setupPoint.x = Degree::cos(worldModel->getBody().getUniNum() * 14 + 90) * 5; setupPoint.y = Degree::sin(worldModel->getBody().getUniNum() * 14 + 90) * 5; } ExactGotoPoint doGotoPoint(AT_PENALTY_DECISION, setupPoint, 1, worldModel->getBody()); command = doGotoPoint.getCommand(); if (command == NULL) command = new EmptyCommand(AT_PENALTY_DECISION); return; break; } case PM_PENALTY_READY: if (doneFlag) { command = new EmptyCommand(AT_PENALTY_DECISION); return; } if (selectBallKicker() == 2) {#ifdef PENALTY_DECISION_LOGLOG << "PENALTY: Ready 1 1" << endl;#endif // Do a WithBall or WithoutBall Action if (!worldModel->getBall().isValid()) {#ifdef PENALTY_DECISION_LOGLOG << "PENALTY: Ready 1 2" << endl;#endif#ifdef PENALTY_DECISION_LOGLOG << "Penalty:Looking for ball." << endl;#endif command = new TurnCommand(AT_PENALTY_DECISION, 45); }// else if (worldModel->getBody().isGoalie())// {//#ifdef PENALTY_DECISION_LOG//LOG << "PENALTY: Ready 1 3" << endl;//#endif// assert(1 == 2);// // Goalie Penalty kicker (does come here?)// } else if (worldModel->isBallKickable()) {#ifdef PENALTY_DECISION_LOGLOG << "PENALTY: Ready 1 4" << endl;#endif quickLevels[DRIBBLE_NUM] = 1; quickLevels[SRPDRIBBLE_NUM] = 0; quickLevels[SHOOT_NUM] = 1;// LOG << "SALEHELOG 0" << endl; BodyDecision::decide(quickLevel, form, library); return; } else {#ifdef PENALTY_DECISION_LOGLOG << "PENALTY: Ready 1 5" << endl;#endif withoutBallPlayOnDecision.decide(quickLevel, WOBS_INTERCEPT, form, library); command = withoutBallPlayOnDecision.getCommand(); if (worldModel->getBody().isGoalie()) form.headForm.tnMode = TNM_LOOK_CAREFULLY_TO_BALL; else form.headForm.tnMode = TNM_LOOK_CAREFULLY_TO_OPP_GOALIE; return; } } else {#ifdef PENALTY_DECISION_LOGLOG << "PENALTY: Ready 2 1" << endl;#endif command = new EmptyCommand(AT_PENALTY_DECISION); return; } break; case PM_PENALTY_READY_OPP:#ifdef PENALTY_DECISION_LOGLOG << "PENALTY: ReadyOpp 1 1" << endl;#endif if (worldModel->getBody().isGoalie()) { quickLevels[GOALIE_CATCH_NUM] = 2; if (worldModel->getCurInterCalculate().existFastestTmmPlayer() && worldModel->getCurInterCalculate().getFastestTmmPlayer().isBody()) { // Intercept quickLevels[GOALIE_INTERCEPT_NUM] = 1; } else { // Positioning quickLevels[GOALIE_POSITIONING_NUM] = 1; } BodyDecision::decide(quickLevel, form, library); if (worldModel->getBody().isGoalie()) form.headForm.tnMode = TNM_LOOK_CAREFULLY_TO_BALL; else form.headForm.tnMode = TNM_LOOK_CAREFULLY_TO_OPP_GOALIE; } else { command = new EmptyCommand(AT_PENALTY_DECISION); return; } break; default: command = new EmptyCommand(AT_PENALTY_DECISION); return; break; }}int PenaltyDecision::selectBallKicker(){ if (worldModel->getBody().getUniNum() == 3) return 2; else return 1;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -