⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 penaltydecision.cpp

📁 mersad源码 03年robocup 季军 可以研究一下大家
💻 CPP
字号:
/* *  Copyright 2002-2004, Mersad Team, Allame 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. * *  Created by: Mohammad Salehe *  Released on Friday 1 April 2005 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>using namespace std;//#define PENALTY_DECISION_LOG#define GOALIE_UNIFORM_NUM 11#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,				SayDecisionFlags &sayFlags, TurnNeckMode &turnNeckMode,				Positioning positioning):				BodyDecision(worldModel, sayFlags, turnNeckMode),				withoutBallPlayOnDecision(worldModel, sayFlags,	turnNeckMode, 				positioning){	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;	}	return 0;}DecideType PenaltyDecision::decide(int quickLevel, DecideType lastDecide){#ifdef PENALTY_DECISION_LOGLOG << "PENALTY:doneFlag = " << doneFlag << endl;#endif	resetValues();	resetQuickLevels();	if (worldModel->getBody().isGoalie())		turnNeckMode = TNM_LOOK_CAREFULLY_TO_BALL;	else		turnNeckMode = 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(setupPoint, 1, worldModel->getBody());			command = doGotoPoint.getCommand();			if (command == NULL)				command = new EmptyCommand();			return DT_NONE;		}						else		{#ifdef PENALTY_DECISION_LOGLOG << "PENALTY: Setup 1 2" << endl;#endif			advancedActions[GOTOKICK_NUM]->getValue();			advancedActions[GOTOKICK_NUM]->execute(sayFlags);			command = advancedActions[GOTOKICK_NUM]->getCommand();			return advancedActions[GOTOKICK_NUM]->getType();		}		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(setupPoint, 1, worldModel->getBody());			command = doGotoPoint.getCommand();			if (command == NULL)				command = new EmptyCommand();			return DT_NONE;			break;		}			case PM_PENALTY_READY:		if (doneFlag)		{			command = new EmptyCommand();			return DT_NONE;		}					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(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;				return BodyDecision::decide(quickLevel);			}			else			{#ifdef PENALTY_DECISION_LOGLOG << "PENALTY: Ready 1 5" << endl;#endif				DecideType tempDecideType;				tempDecideType = withoutBallPlayOnDecision.decide(quickLevel,						lastDecide, WOBS_INTERCEPT);				command = withoutBallPlayOnDecision.getCommand();				if (worldModel->getBody().isGoalie())					turnNeckMode = TNM_LOOK_CAREFULLY_TO_BALL;				else					turnNeckMode = TNM_LOOK_CAREFULLY_TO_OPP_GOALIE;				return tempDecideType;			}		}		else		{#ifdef PENALTY_DECISION_LOGLOG << "PENALTY: Ready 2 1" << endl;#endif			command = new EmptyCommand();			return DT_NONE;		}		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);			if (worldModel->getBody().isGoalie())				turnNeckMode = TNM_LOOK_CAREFULLY_TO_BALL;			else				turnNeckMode = TNM_LOOK_CAREFULLY_TO_OPP_GOALIE;		}		else		{			command = new EmptyCommand();			return DT_NONE;		}		break;			default:		command = new EmptyCommand();		return DT_NONE;		break;	}	return DT_NONE;}int PenaltyDecision::selectBallKicker(){	if (worldModel->getBody().getUniNum() == 3)		return 2;	else		return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -