worldmodel.cpp

来自「2002年」· C++ 代码 · 共 219 行

CPP
219
字号
#include "worldmodel.h"
#include "utils.h"
#include "agent.h"
#include "log.h"

namespace wm
{
	Situation situation;
	Formation formation;
	
	Field FieldInfo;
	Pitch PitchInfo;
	
	PlayerType playertypes[SP_player_types];
	Ball ball;
	Player MyTeam[SP_team_size];
	Player TheirTeam[SP_team_size];
	MySelf Self;
	UnknownPlayerList UnknownTheirPlayerList;	
	UnknownPlayerList UnknownMyPlayerList;		
	UnknownPlayerList TeamlessPlayerList;	
	
	Player NULLPLAYER;
	
	void InitializeObjs(){
		/* If I am on the right half of the court, all the coordinates shall be rotated */
		bool rotate = false;
		if (situation.MySide == 'l'){
			rotate = false;
		}
		else if (situation.MySide == 'r'){
			rotate = true;
		}
		else{
			my_error("Which side do i take?");
		}
		
		int i;
		
		PitchInfo.Initialize(rotate);
		/**********        Intialize  Players           ****************************************/
		for(i=0; i < SP_team_size; i++){
			MyTeam[i].ChangeType(0);
			MyTeam[i].set_conf_param(ClientParam::conf_max, ClientParam::conf_decay, ClientParam::min_valid_conf);
			MyTeam[i].set_objtype(OBJ_Player);
			MyTeam[i].set_side(Side_My);
			MyTeam[i].set_inside_no(i+1);
			MyTeam[i].SetRole(FieldParam::FP_attackness[i], FieldParam::FP_leftness[i], FieldParam::FP_aggressiveness[i], FieldParam::FP_creativeness[i]);
			TheirTeam[i].ChangeType(0);
			TheirTeam[i].set_conf_param(ClientParam::conf_max, ClientParam::conf_decay, ClientParam::min_valid_conf);
			TheirTeam[i].set_objtype(OBJ_Player);
			TheirTeam[i].set_inside_no(i+1+SP_team_size);
			TheirTeam[i].set_side(Side_Opp);
		}
		UnknownMyPlayerList.set_side(Side_My);
		UnknownTheirPlayerList.set_side(Side_Opp);
		TeamlessPlayerList.set_side(Side_Unknown);
		
		Self.set_inside_no(Agent::MyNumber);
		Self.ChangeType(0);
		Self.set_conf_param(ClientParam::conf_max, ClientParam::conf_decay, ClientParam::min_valid_conf);
		Self.Is_goalie = ClientParam::goalie;
		
		/**********        Intialize   ball            ****************************************/
		ball.set_speed_param(ServerParam::ball_speed_max,ServerParam::ball_decay);
		ball.set_conf_param(ClientParam::conf_max, ClientParam::conf_decay, ClientParam::min_ball_valid_conf);
		ball.set_objtype(OBJ_Ball);
		
		if (!formation.FMDefenseNet.RestoreNet(ClientParam::FM_defense_weightfile)){
			my_error("load weight file %s failed", ClientParam::FM_defense_weightfile);
		}

		if (!formation.FMOffenseNet.RestoreNet(ClientParam::FM_offense_weightfile)){
			my_error("load weight file %s failed", ClientParam::FM_offense_weightfile);
		}
		
		if (!FieldInfo.OffSensitivityNet.RestoreNet(ClientParam::Off_sen_weightfile)){
			my_error("load weightfile %s failed", ClientParam::Off_sen_weightfile);
		}
		
		if (!FieldInfo.DF_SensitivityNet.RestoreNet(ClientParam::DF_Sensitivity_weightfile)){
			my_error("load weightfile %s failed", ClientParam::DF_Sensitivity_weightfile);
		}
	
		/**********       Initialize  My Role      **********************************/
		Self.SetRole(ClientParam::attackness, ClientParam::leftness, ClientParam::aggressiveness, ClientParam::creativeness);
		/*********        Set Formations         *********************************/
		formation.SetFormation();
		/*********        set field information ************************************/
		FieldInfo.Initialize();
		if(FieldInfo.IsValidmygoalie()) 
			MyPlayer(FieldInfo.mygoalie).Is_goalie = true;
		if(FieldInfo.IsValidtheirgoalie()) 
			TheirPlayer(FieldInfo.theirgoalie).Is_goalie = true;
	}
	
	
	Player& GetPlayer(char side, UNum No){
		return (side == situation.MySide) ? MyPlayer(No) : TheirPlayer(No);
	}
	
	Player& GetPlayer(UNum No){
		if (No == Agent::MyNumber)
			return Self;
		if (No > 0){
			int seg = (No -1 ) / SP_team_size;
			int rem = (No -1) % SP_team_size;
			switch(seg){
			case 0:
				return MyTeam[rem];
			case 1:
				return TheirTeam[rem];
			case 2:
			case 3:
#ifdef _DEBUG_MOD
				if (!UnknownMyPlayerList.IsIdxValid(rem)){
					DoLog(LOG_BUG, "unkmy bug here %d", No);
					break;
				}
#endif
				return *UnknownMyPlayerList.List[rem];
			case 4:
			case 5:
#ifdef _DEBUG_MOD
				if(!UnknownTheirPlayerList.IsIdxValid(rem)){
					DoLog(LOG_BUG, "unktheir bug here %d", No);
					break;
				}
#endif
				return *UnknownTheirPlayerList.List[rem];
			case 6:
#ifdef _DEBUG_MOD
				if(!TeamlessPlayerList.IsIdxValid(rem)){
					DoLog(LOG_BUG, "teamless bug here No %d", No);
					break;
				}
#endif
				return *TeamlessPlayerList.List[rem];
			}
		}
		else{
			DoLog(LOG_BUG, "why no <= 0 1 %d", No);
		}
		return NULLPLAYER;
	}
	
	Player& TheirPlayer(UNum No){
		if (No > 0){
			int seg = (No -1 ) / SP_team_size;
			int rem = (No -1) % SP_team_size;
			switch(seg){
			case 0:
			case 1:
				return TheirTeam[rem];
			case 4:
			case 5:
#ifdef _DEBUG_MOD
				if(!UnknownTheirPlayerList.IsIdxValid(rem)){
					DoLog(LOG_BUG, "unktheir bug here 1 %d", No);
					break;
				}
#endif
				return *UnknownTheirPlayerList.List[rem];
			case 6:
#ifdef _DEBUG_MOD
				if(!TeamlessPlayerList.IsIdxValid(rem)){
					DoLog(LOG_BUG, "(their)teamless bug here No %d", No);
					break;
				}
#endif
				return *TeamlessPlayerList.List[rem];
			}
		}
		else{
#ifdef _DEBUG_MOD
			DoLog(LOG_BUG, "why no <= 0 3 %d", No);
#endif
		}
		return NULLPLAYER;
	}
	
	Player& MyPlayer(UNum No){
		if (No == Agent::MyNumber)
			return Self;
		if (No > 0){
			int seg = (No -1 ) / SP_team_size;
			int rem = (No -1) % SP_team_size;
			switch(seg){
			case 0:
				return MyTeam[rem];
			case 2:
			case 3:
#ifdef _DEBUG_MOD
				if (!UnknownMyPlayerList.IsIdxValid(rem)){
					DoLog(LOG_BUG, "unkmy bug here 1 %d", No);
					break;
				}
#endif
				return *UnknownMyPlayerList.List[rem];
			case 6:
#ifdef _DEBUG_MOD
				if(!TeamlessPlayerList.IsIdxValid(rem)){
					DoLog(LOG_BUG, "(my)teamless bug here No %d", No);
					break;
				}
#endif
				return *TeamlessPlayerList.List[rem];
			}
		}
		else{
#ifdef _DEBUG_MOD
			DoLog(LOG_BUG, "why no <= 0 2 %d", No);
#endif
		}
		return NULLPLAYER;
	}
	
}

⌨️ 快捷键说明

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