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

📄 worldmodel.cpp

📁 2006年世界杯足球赛2D仿真组第16名的源代码。在此代码上随便改改
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/* *  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 *  and is modified by: Mohammad Salehe, Mostafa Rokooey, *                      Sassan Haradji, Darioush Jalali * *  Released on Monday 1 August 2005, 10 Mordad 1384 by Mersad RoboCup Team. *  For more information please read README file.*/#include <cmath>#include <sstream>#include <cassert>#include <iostream>#include <Config.h>#include <Logger.h>#include <Basics.h>#include <Degree.h>#include <Defines.h>#include <WorldModel.h>#include <SayEncoding.h>using namespace std;using namespace Basics;using namespace Degree;#define OPP_OFFLINE_LOCAL_X 20#define OPP_OFFLINE_LOCAL_Y 10#define MARKING_DECAY_FACTOR (0.8)#define MARKING_THRESHOLD    (2.0)#define MARKING_AREA         (2.75)// class WorldModelWorldModel::WorldModel(){	unsigned i;	if (config["Agent"]["Server"]["OfflinePlayer"].asBool())		timer = new VirtualTimer();	else		timer = new OnlineTimer();	seeCycle = 0;	curCycle = 0;	curTime = 0;	fieldSide = SI_LEFT;	playMode = PM_BEFORE_KICK_OFF;	virtualPlayMode = VPM_NONE;	playModeRemainCycle = 0;	setBodyReplaced(false);	initViewPartDirs();	resetSeeDeltaCycles();	freeKickAdvicerSayCycle = 0;	curKickCalculate.init();	// Objects on the field.	flagsNum = 0;	goalsNum = 0;	linesNum = 0;	for (i = 0; i < FLAGS_NUM; i++)		flags[i] = new FieldFlag();	for (i = 0; i < GOALS_NUM; i++)		goals[i] = new FieldGoal();	for (i = 0; i < LINES_NUM; i++)		lines[i] = new FieldLine();	ball = new Ball;	body = new Body;	for (i = 0; i < FULL_PLAYERS_NUM; i++)	{		fullPlayers[TID_TEAMMATE][i] = new Player(PLM_FULL);		fullPlayers[TID_TEAMMATE][i]->setUniNum(i + 1);	}	for (i = 0; i < FULL_PLAYERS_NUM; i++)	{		fullPlayers[TID_OPPONENT][i] = new Player(PLM_FULL);		fullPlayers[TID_OPPONENT][i]->setUniNum(i + 1);	}	for (i = 0; i < HALF_PLAYERS_NUM; i++)		halfPlayers[TID_TEAMMATE][i] = new Player(PLM_HALF);	for (i = 0; i < HALF_PLAYERS_NUM; i++)		halfPlayers[TID_OPPONENT][i] = new Player(PLM_HALF);	for (i = 0; i < QUARTER_PLAYERS_NUM; i++)		quarterPlayers[i] = new Player(PLM_QUARTER);}WorldModel::WorldModel(const WorldModel &worldModelCopy){	copyFrom(worldModelCopy, false);	LOG << "WorldModel copied." << endl;}WorldModel::~WorldModel(){	unsigned i;	delete timer;	for (i = 0; i < FLAGS_NUM; i++)		delete flags[i];	for (i = 0; i < GOALS_NUM; i++)		delete goals[i];	for (i = 0; i < LINES_NUM; i++)		delete lines[i];	delete ball;	if (!isBodyReplaced())		delete body; // else it will be deleted with other players.	for (i = 0; i < FULL_PLAYERS_NUM; i++)		delete fullPlayers[TID_TEAMMATE][i];	for (i = 0; i < FULL_PLAYERS_NUM; i++)		delete fullPlayers[TID_OPPONENT][i];	for (i = 0; i < HALF_PLAYERS_NUM; i++)		delete halfPlayers[TID_TEAMMATE][i];	for (i = 0; i < HALF_PLAYERS_NUM; i++)		delete halfPlayers[TID_OPPONENT][i];	for (i = 0; i < QUARTER_PLAYERS_NUM; i++)		delete quarterPlayers[i];}void WorldModel::copyFrom(const WorldModel &worldModelCopy, bool constructed){	unsigned i;	if (constructed)	{		LOG << "WorldModel copying 1" << endl;			delete timer;			for (i = 0; i < FLAGS_NUM; i++)			delete flags[i];		for (i = 0; i < GOALS_NUM; i++)			delete goals[i];		for (i = 0; i < LINES_NUM; i++)			delete lines[i];			delete ball;			if (!isBodyReplaced())			delete body; // else it will be deleted with other players.			for (i = 0; i < FULL_PLAYERS_NUM; i++)			delete fullPlayers[TID_TEAMMATE][i];		for (i = 0; i < FULL_PLAYERS_NUM; i++)			delete fullPlayers[TID_OPPONENT][i];			for (i = 0; i < HALF_PLAYERS_NUM; i++)			delete halfPlayers[TID_TEAMMATE][i];		for (i = 0; i < HALF_PLAYERS_NUM; i++)			delete halfPlayers[TID_OPPONENT][i];			for (i = 0; i < QUARTER_PLAYERS_NUM; i++)			delete quarterPlayers[i];	}	LOG << "WorldModel copying 2" << endl;	*this = worldModelCopy;	if (dynamic_cast<OnlineTimer *>(worldModelCopy.timer))		timer = new OnlineTimer((const OnlineTimer&)*(worldModelCopy.timer));	else		timer = new VirtualTimer((const VirtualTimer&)*(worldModelCopy.timer));	for (i = 0; i < FLAGS_NUM; i++)		flags[i] = new FieldFlag(*(worldModelCopy.flags[i]));	for (i = 0; i < GOALS_NUM; i++)		goals[i] = new FieldGoal(*(worldModelCopy.goals[i]));	for (i = 0; i < LINES_NUM; i++)		lines[i] = new FieldLine(*(worldModelCopy.lines[i]));	ball = new Ball(*(worldModelCopy.ball));	body = new Body(*(worldModelCopy.body));	for (i = 0; i < FULL_PLAYERS_NUM; i++)		fullPlayers[TID_TEAMMATE][i] =			new Player(*(worldModelCopy.fullPlayers[TID_TEAMMATE][i]));	for (i = 0; i < FULL_PLAYERS_NUM; i++)		fullPlayers[TID_OPPONENT][i] =			new Player(*(worldModelCopy.fullPlayers[TID_OPPONENT][i]));	for (i = 0; i < HALF_PLAYERS_NUM; i++)		halfPlayers[TID_TEAMMATE][i] =			new Player(*(worldModelCopy.halfPlayers[TID_TEAMMATE][i]));	for (i = 0; i < HALF_PLAYERS_NUM; i++)		halfPlayers[TID_OPPONENT][i] =			new Player(*(worldModelCopy.halfPlayers[TID_OPPONENT][i]));	for (i = 0; i < QUARTER_PLAYERS_NUM; i++)		quarterPlayers[i] =			new Player(*(worldModelCopy.quarterPlayers[i]));	if (worldModelCopy.bodyReplacedFlag)		replaceBodyInPlayersList(worldModelCopy.body->getUniNum());}void WorldModel::updateAfterSenseBody(){	curKickCalculate.setValid(false);	resetHearedVarsAfterSenseBody();}void WorldModel::initServerParam(const SExpression &exp){	int i;	SExpAtomic *at = dynamic_cast<SExpAtomic *>(exp[0]);	assert(at);	assert(at->asString() == "server_param");	for (i = 1; i < exp.size(); i++)	{		SExpression *se = dynamic_cast<SExpression *>(exp[i]);		assert(se);		SExpAtomic *at1 = dynamic_cast<SExpAtomic *>((*se)[0]);		assert(at1);		SExpAtomic *at2 = dynamic_cast<SExpAtomic *>((*se)[1]);		assert(at2);		serverParam.add(at1->asString(), at2->asString());	}	// now I can set default variables of objects.	ball->setServerParamVars(serverParam);	for (i = 0; i < FULL_PLAYERS_NUM; i++)		fullPlayers[TID_TEAMMATE][i]->setServerParamVars(serverParam);	for (i = 0; i < FULL_PLAYERS_NUM; i++)		fullPlayers[TID_OPPONENT][i]->setServerParamVars(serverParam);	for (i = 0; i < HALF_PLAYERS_NUM; i++)		halfPlayers[TID_TEAMMATE][i]->setServerParamVars(serverParam);	for (i = 0; i < HALF_PLAYERS_NUM; i++)		halfPlayers[TID_OPPONENT][i]->setServerParamVars(serverParam);	for (i = 0; i < QUARTER_PLAYERS_NUM; i++)		quarterPlayers[i]->setServerParamVars(serverParam);}void WorldModel::initPlayerParam(const SExpression &exp){	int i;	SExpAtomic *at = dynamic_cast<SExpAtomic *>(exp[0]);	assert(at);	assert(at->asString() == "player_param");	for (i = 1; i < exp.size(); i++)	{		SExpression *se = dynamic_cast<SExpression *>(exp[i]);		assert(se);		SExpAtomic *at1 = dynamic_cast<SExpAtomic *>((*se)[0]);		assert(at1);		SExpAtomic *at2 = dynamic_cast<SExpAtomic *>((*se)[1]);		assert(at2);		playerParam.add(at1->asString(), at2->asString());	}	playerTypes = vector<Param>(playerParam["player_types"].asInt());}void WorldModel::initPlayerType(const SExpression &exp){	int i;	SExpAtomic *at = dynamic_cast<SExpAtomic *>(exp[0]);	assert(at);	assert(at->asString() == "player_type");	const SExpression &seid = exp["id"];	at = dynamic_cast<SExpAtomic *>(seid[1]);	assert(at);	int id = at->asInt();		for (i = 2; i < exp.size(); i++)	{		SExpression *se = dynamic_cast<SExpression *>(exp[i]);		assert(se);		SExpAtomic *at1 = dynamic_cast<SExpAtomic *>((*se)[0]);		assert(at1);		SExpAtomic *at2 = dynamic_cast<SExpAtomic *>((*se)[1]);		assert(at2);		playerTypes[id].add(at1->asString(), at2->asString());	}	if (id == 0) // now I can set default players type.	{		for (i = 0; i < FULL_PLAYERS_NUM; i++)			fullPlayers[TID_TEAMMATE][i]->setType(0, playerTypes[0]);		for (i = 0; i < FULL_PLAYERS_NUM; i++)			fullPlayers[TID_OPPONENT][i]->setType(0, playerTypes[0]);		for (i = 0; i < HALF_PLAYERS_NUM; i++)			halfPlayers[TID_TEAMMATE][i]->setType(0, playerTypes[0]);		for (i = 0; i < HALF_PLAYERS_NUM; i++)			halfPlayers[TID_OPPONENT][i]->setType(0, playerTypes[0]);		for (i = 0; i < QUARTER_PLAYERS_NUM; i++)			quarterPlayers[i]->setType(0, playerTypes[0]);	}}void WorldModel::parseSee(const SExpression &exp){	SExpAtomic *at;	SExpression *se1,*se2;	int i;	at = dynamic_cast<SExpAtomic *>(exp[0]);	assert(at);	assert(at->asString() == "see");	// See time	at = dynamic_cast<SExpAtomic *>(exp[1]);	assert(at);	seeCycle = at->asInt();	seeTime = getCurTime();	for (i = 2; i < exp.size(); i++)	{		se1 = dynamic_cast<SExpression *>(exp[i]);		assert(se1);		se2 = dynamic_cast<SExpression *>((*se1)[0]);		assert(se2);		at = dynamic_cast<SExpAtomic *>((*se2)[0]);		assert(at);		switch (at->asString()[0])		{		case 'f':			parseFlag(*se1);			break;		case 'g':			parseGoal(*se1);			break;		case 'l':			parseLine(*se1);			break;		case 'b':		case 'B':			parseBall(*se1);			break;		case 'p':		case 'P':			parsePlayer(*se1);			break;		case 'F':		case 'L':		case 'G':			break; // Going to trash.		default:			assert(0);		}	}}void WorldModel::parseFlag(const SExpression &exp){	SExpression *se;	int flagId;	se = dynamic_cast<SExpression *>(exp[0]);	assert(se);	flagId = fieldData.getFlagId(*se);	flags[flagsNum]->parse(flagId, exp, getCurTime());	flagsNum++;}void WorldModel::parseGoal(const SExpression &exp){	SExpression *se;	int goalId;	se = dynamic_cast<SExpression *>(exp[0]);	assert(se);	goalId = fieldData.getGoalId(*se);	goals[goalsNum]->parse(goalId, exp, getCurTime());	goalsNum++;}void WorldModel::parseLine(const SExpression &exp){	SExpression *se;	int lineId;	se = dynamic_cast<SExpression *>(exp[0]);	assert(se);	lineId = fieldData.getLineId(*se);	lines[linesNum]->parse(lineId, exp, getCurTime());	linesNum++;}void WorldModel::parseBall(const SExpression &exp){	ball->parse(exp, getCurTime());}void WorldModel::parsePlayer(const SExpression &exp){	SExpression *se;	SExpAtomic *at;	string ourTeamName;	TeamId teamId = TID_UNKNOWN;	unsigned uniNum = 0;	bool isGoalie = false;	unsigned i;	se = dynamic_cast<SExpression *>(exp[0]);	assert(se);		if (se->size() > 1)	{		at = dynamic_cast<SExpAtomic *>((*se)[1]);		assert(at);		ourTeamName = (string)"\"" +			config["Agent"]["Public"]["TeamName"].asString() + "\"";		if (at->toString() == ourTeamName)			teamId = TID_TEAMMATE;		else			teamId = TID_OPPONENT;	}	if (se->size() > 2)	{		at = dynamic_cast<SExpAtomic *>((*se)[2]);		assert(at);		uniNum = at->asInt();	}	if (se->size() > 3)	{		at = dynamic_cast<SExpAtomic *>((*se)[3]);		assert(at);		assert(at->toString() == "goalie");

⌨️ 快捷键说明

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