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

📄 setplay.cpp

📁 2002年
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "setplay.h"
#include "worldmodel.h"
#include "skill.h"
#include "log.h"
#include "agent.h"
#include "utils.h"

/*****************  Set Play   ****************************/
void Set_Play::AddRole(float attackness, float leftness, const Vector& pos){
	roles[total_roles].attackness = attackness;
	roles[total_roles].leftness = leftness;
	roles[total_roles].strategical_pos = pos;
	total_roles ++;
}

void Set_Play::AddRole(UNum No, const Vector& pos){
	roles[total_roles].No = No;
	roles[total_roles].strategical_pos = pos;
	total_roles ++;
}

bool Set_Play::IsRole(UNum No){
	int i;
	for(i = 0; i< total_roles; i++){
		if(No == roles[i].No) return true;
	}
	return false;
}

bool Set_Play::IsExecutor(UNum No){
	return bool(No == Executor);
}

Vector Set_Play::GetSetPlayPos(UNum No){
	int i;
	for(i = 0; i< total_roles; i++){
		if (No == roles[i].No){
			return roles[i].strategical_pos;
		}
	}
	return Vector(-1, -1);
}

Vector Set_Play::GetMySetPlayPos(){ 
	return GetSetPlayPos(ClientParam::Number);
}

bool Set_Play::RecentSeen(){
	return bool(situation.SightTime>situation.CurrentTime-2); 
	
}

/********************  Before Kick Off  **********************/
void BeforeKickOff::set_roles(){
	total_roles=0;
	Counter =0;
	AddRole(1, Vector(-47.0f,0.0f));
	AddRole(3, Vector(-25.0f,-12.0f));
	AddRole(5, Vector(-25.0f,12.0f));
	AddRole(2, Vector(-20.0f,20.0f));
    AddRole(4, Vector(-20.0f,-20.0f));
	AddRole(7, Vector( -5.0f,8.0f));
	AddRole(8, Vector( -5.0f,-8.0f));

	if (situation.kickoff_mode == KickOff_Mine)
	{
		AddRole(6, Vector(-15.0f,0.0f));
		AddRole(10, Vector(-0.5f, 0.0f));
		AddRole(9, Vector(-0.1f,18.0f));
		AddRole(11,Vector(-0.1f,-18.0f));
	}
	else{
		AddRole(6,Vector(-15.0f,0.0f));
		AddRole(10, Vector(-10.0f, 0.0f));
		AddRole(9, Vector(-0.5f,18.0f));
		AddRole(11,Vector(-0.5f,-18.0f));
	}
	situation.ChangeSetPlay(SPST_Prego);
}

bool BeforeKickOff::within_range(Vector& pos){
	return bool((Self.pos - pos).mod2() < 3);
}

void BeforeKickOff ::going(){
	if (situation.IsSetPlayState(SPST_Initialize)){
		set_roles();
	}
	Vector initialpos = GetMySetPlayPos();	
	if (!PitchInfo.WithInField(initialpos))
		return;
	if (!within_range(initialpos)){
		if (fill_pos_move_time >= 8){
			Skill::action.move(initialpos);
			fill_pos_move_time = 0;
		}
		fill_pos_move_time ++;
	}
	/*
	else{
		if (fill_pos_turn_time >= 8){
			AngleDeg angle =  Self.pos.Angle() - Self.bodyfacing + 180;
			angle = NormalizeAngle(angle);
			if (fabs(angle) > 10){
				Skill::action.turn(angle);
				fill_pos_turn_time = 0;
			}
		}
		else 
			Agent::motion.donothing();
		fill_pos_turn_time ++;
	}
	Counter++;*/
}

void Newsetplay::CheckHeadingAndStamina()//检查队友是否正以正常速度向球移动 
{	UNum i;
	Vector meanvel,balldir;

	for (i=2;i<=SP_team_size;i++)
	{
	if (Trackmark[i].x>ServerParam::pitch_length/2 || !MyPlayer(i).pos_valid()) 
	{
		HeadingToBall[i] = 1.0f - 2.0f * (situation.CurrentTime - situation.ModeChangedTime)/ ServerParam::drop_ball_time;
	}
	else
	{
		meanvel=MyPlayer(i).pos-Trackmark[i];
		balldir=ball.pos-MyPlayer(i).pos;
		if (balldir.mod()<1.0f)
			HeadingToBall[i]=1.0f;
		else
		{
			balldir.Normalize();
			HeadingToBall[i]=
				((meanvel.x*balldir.x+meanvel.y*balldir.y)/ClientParam::setplay_speed+1)/2;
		}
	}
	pose_limitation(HeadingToBall[i],0,1);
	if (MyPlayer(i).pos_valid())
				Trackmark[i]=MyPlayer(i).pos;
	else 
				Trackmark[i]=Vector(ServerParam::pitch_length,ServerParam::pitch_width);
	}

}

UNum Newsetplay::JudgeExecutor()
{	
	Vector meanvel,balldir;
	UNum i,select=Agent::MyNumber;
	float min_pos_dis,min_cur_dis,player_i_pos_dis,player_i_cur_dis;
	Vector ofpos;
	if (situation.IsGoalieKick) return FieldParam::FP_goalie_number;
	if (ball.kickable()) return Agent::MyNumber;
	if (situation.playmode == PM_My_Kick_Off && Self.IsForward() && Self.IsMid())
		return Agent::MyNumber;
	if (Player::IsMyPlayer(situation.ballcontroller)&&(FieldInfo.mygoalie != situation.ballcontroller))
		return situation.ballcontroller;
	if (Counter%6==0&&Counter > 0) CheckHeadingAndStamina();
	ofpos=formation.GetOffensivePoint(Self.attackness, Self.leftness, ball.pos);
	min_pos_dis=ofpos.dist(ball.pos);
	min_cur_dis=ball.distance;
	for (i=2;i<=SP_team_size;i++)
		if (i!=Agent::MyNumber)
	{
		if (HeadingToBall[i]<0.75) continue;
		/*不考虑没有开球趋向的球员:
			可能的原因:1。本来不应由他开球
						2。该队员误判,故应由其它队员弥补
						3。体力不足

									*/
		player_i_cur_dis=MyPlayer(i).pos.dist(ball.pos);
		if (situation.CurrentTime - situation.ModeChangedTime < ServerParam::drop_ball_time/4)
		{
			ofpos=formation.GetOffensivePoint(FieldParam::FP_attackness[Idx(i)],FieldParam::FP_leftness[Idx(i)],ball.pos);
			player_i_pos_dis=ofpos.dist(ball.pos);
			if (player_i_pos_dis>1.2*min_pos_dis) continue;
			//本位点明显比其它人离球近
			if (min_pos_dis>1.2*player_i_pos_dis)
			{
				select=i;
				min_pos_dis=player_i_pos_dis;
				min_cur_dis=player_i_cur_dis;
			}
			else
			{
				//本位点离球差不多近,且现在所处距离明显近
				if (player_i_cur_dis>1.2*min_cur_dis) continue;
				if (min_cur_dis>1.2*player_i_cur_dis||i>select)//两者均相近,取号码大者
				{
					select=i;
					min_pos_dis=player_i_pos_dis;
					min_cur_dis=player_i_cur_dis;
				}
			}
		}
		else 
		{
			if (player_i_cur_dis*1.1 < min_cur_dis || (min_cur_dis*1.1 > player_i_cur_dis && i>select))
			{
				select = i;
				min_cur_dis=player_i_cur_dis;
			}
		}
	}
	return select;
}


bool Newsetplay::CanExecute(){
	//moved out
	return true;
}


void Newsetplay::AssistGo(){//接应跑动
	/*假设向六个方向分别移动一定距离,估计可能得到的传球评价,与
		当前位置的评价比较,若优于当前位置则移动*/
	Agent::positioning.Offense();
	if (FieldInfo.IsOffside())
		return;
	if (ball.distance<ServerParam::free_kick_buffer-Self.kickable_area||
		situation.IsGoalieKick&&PitchInfo.my_penaltyarea.IsWithin(Self.pos))
	{
		DoLog(LOG_SETPLAY,"Assist going away");
		if (situation.IsGoalieKick&&PitchInfo.my_penaltyarea.IsWithin(Self.pos))
		{
			if (Agent::MyNumber == 5 || Agent::MyNumber == 3)
				Agent::motion.smartgoto(Self.pos+Vector(2,0),ClientParam::setplay_speed);
			else if (Agent::MyNumber ==2)
				Agent::motion.smartgoto(Self.pos+Vector(0,2),ClientParam::setplay_speed);
			else if (Agent::MyNumber ==4)
				Agent::motion.smartgoto(Self.pos+Vector(0,-2),ClientParam::setplay_speed);
			else
			Agent::motion.smartgoto(Self.pos+Polar2Vector(2,ball.global_angle+180),ClientParam::setplay_speed);
		}
		else
			Agent::motion.smartgoto(Self.pos+Polar2Vector(2,ball.global_angle+180),ClientParam::setplay_speed);
		return;
	}
	if (situation.IsGoalieKick)
	{
		if (Self.pos.x>ServerParam::penalty_area_length -ServerParam::semi_pitch_length+5.0f)
		{
			DoLog(LOG_SETPLAY,"Assist going just ahead");
			Agent::motion.smartgoto(Self.pos-Vector(2,0),ClientParam::setplay_speed);
			return;
		}
	}
	else
	{
		if (ball.distance>ServerParam::unum_far_length-5.0f)
		{
			DoLog(LOG_SETPLAY,"Assist going just ahead");
			Agent::motion.smartgoto(ball.pos,ClientParam::setplay_speed);
			return;
		}
	}
}

bool Newsetplay::ShouldAssist(){
	/*
	接应条件:
		自己与球连线附近一定方位内没有其他队员
	*/
	UNum i;
	Line playerline;
	Ray balltrack;
	bool res=true;
	Vector MyOfPos,TheirOfPos;
	if (situation.IsSetPlayState(SPST_Initialize)) 
		return false;
	if (Executor==Agent::MyNumber) return false;
	if (situation.IsGoalieKick)
	{
		/*if (Agent::MyNumber>1 && Agent::MyNumber<6) return true;
		else return false;*/
		return (Self.IsBack())&&(!Self.Is_goalie);
	}
	if (!ball.pos_valid()) return false;
	MyOfPos = formation.GetOffensivePoint(Self.attackness,Self.leftness,ball.pos);

⌨️ 快捷键说明

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