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

📄 penaltydecision.cpp

📁 RoboCup 2D 仿真组老牌强队Mersad 2005的完整源代码
💻 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 + -