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

📄 decision.cpp

📁 本程序是2005年参加中国机器人大赛的比赛程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:

		}
		else if (angle>=0 && angle<=-20)
		{
			player.slxSimpleAction(100,80,250);

		}
		else if (angle>=-160 && angle<=-180)
		{
			player.slxSimpleAction(80,100,250);

		}		

		isboundary=1;
	}
    else if(y<=limit && x>=limit && x<=abs(field.Width())-limit)
	{
		if(angle>=20 && angle<=160)
		{
			player.slxSimpleAction(100,100,250);
		}
		else if(angle>=-160 && angle<=-20)
		{
			player.slxSimpleAction(-100,-100,250);

		}
		else if (angle>=0 && angle<=20)
		{
			player.slxSimpleAction(80,100,250);

		}
		else if (angle>=160 && angle<=180)
		{
			player.slxSimpleAction(100,80,250);

		}
		else if (angle>=0 && angle<=-20)
		{
			player.slxSimpleAction(-80,-100,250);

		}
		else if (angle>=-160 && angle<=-180)
		{
			player.slxSimpleAction(-100,-80,250);

		}
		isboundary=1;
	}
	else if(x<=limit)
	{

		if(abs(y-doory)>0.5*Player::FieldStruct.Goal_Width)
		{
			if(angle>=-70 && angle<=70)
			{
				player.slxSimpleAction(100,100,250);
			}
			else if(angle>=110 || angle<=-110)
			{
				player.slxSimpleAction(-100,-100,250);
			
			}
			else if(angle>=70 && angle<=90)
			{
				player.slxSimpleAction(100,80,250);
			}
			else if(angle<=-70 && angle>=-90)
			{
				player.slxSimpleAction(80,100,250);
			}
			else if(angle<=110 && angle>=90)
			{
				player.slxSimpleAction(-100,-80,250);
			}
			else if(angle>=-110 && angle<=-90)
			{
				player.slxSimpleAction(-80,-100,250);
			}
		}
		else
		{
			if(g_Ball.Get_vPos().x>x)
			{
				FindBall(player);
			}
			else
			{
				player.slxSimpleAction(0,0,0);
			}
		}

	
		isboundary=1;
	}
    else if(abs(field.Width())-x<=limit)
	{
		if(abs(y-doory)>0.5*Player::FieldStruct.Goal_Width)
		{
		
			if(angle>=-70 && angle<=70)
			{
				player.slxSimpleAction(-100,-100,250);
			}
			else if(angle>=110 || angle<=-110)
			{
				player.slxSimpleAction(100,100,250);
			
			}
			else if(angle>=70 && angle<=90)
			{
				player.slxSimpleAction(-80,-100,250);
			}
			else if(angle<=-70 && angle>=-90)
			{
				player.slxSimpleAction(-100,-80,250);
			}
			else if(angle<=110 && angle>=90)
			{
				player.slxSimpleAction(80,100,250);
			}
			else if(angle>=-110 && angle<=-90)
			{
				player.slxSimpleAction(100,80,250);
			}
		}
		else
		{
			FindBall(player);

		}
		isboundary=1;
	}



}

void CDecision::DefenceBall(Player &player, CRect rect)
{
	int fieldwidth=abs(Player::FieldStruct.m_Field.Width());
//	FILE *pFile;	
//	pFile=fopen("aaa.txt","a+");
//	fprintf(pFile,"fieldwidth=%d,rect=%d,%d,%d,%d,p=%d,%d\n",fieldwidth,rect.left,rect.top,rect.right,rect.bottom,player.Get_vPos().x,player.Get_vPos().y );
	if(g_Ball.Get_vPos().x>int(0.3*fieldwidth))
	{
		if(InRect(player,rect)==0)
		{
			Vector r=Vector(rect.left+abs(rect.Width()*0.5),rect.top+abs(rect.Height()*0.5));
			FindObject(player,r);
			
		}
	}
	else
	{
		FindBall(player);
	}


}

void CDecision::FindBall(Player &player)
{
	//关键问题是根据距离选择动作类型和动作执行时间
	//估计需要在SimpleAction增加几个动作类型和动作执行时间
	Vector r3;
	int pangle;
	int rpangle;
	int temp1;
	int temp2;
	int r3angle;
	int limit;
	int distance;
	int vl;
	int vr;
	int time;
	r3=g_Ball.Get_vPos()-player.Get_vPos();
	pangle=player.Get_m_Angle();
/*	if(pangle>=0)
		rpangle=pangle-180;
	else
		rpangle=pangle+180;
*/
	pangle=(pangle+360) % 360;
	rpangle=(pangle+180) % 360;
	r3angle=(int(r3.GetAngle())+360) % 360;
    limit=30;//实际测试
	distance=80;
    temp1=int(pangle-r3angle);
	if (temp1>270)
		temp1=temp1-360;
	else if( temp1<-270)
		temp1=temp1+360;

	temp2=int(rpangle-r3angle);
	if (temp2>270)
		temp2=temp2-360;
	else if( temp2<-270)
		temp2=temp2+360;
	

//	FILE *pFile;	
//	pFile=fopen("999.txt","a+");
//	fprintf(pFile,"pangle=%d,temp1=%d,temp2=%d,r3angle=%d\n",pangle,temp1,temp2,r3angle);
	


	if(fabs(temp1)<=limit)
	{
		if(r3.mod()<distance)//实际测试
		{
			vl=120;
			vr=120;
			time=250;
			
		}
		else 
		{
			vl=100;
			vr=100;
			time=250;
			
		}
		player.slxSimpleAction(vl,vr,time);//正向直线向前
//		fprintf(pFile,"正向直线向前\n");
	}
	else if(fabs(temp2)<=limit)
	{
		if(r3.mod()<distance)
		{
			vl=-125;
			vr=-125;
			time=250;
		}
		else 
		{
			vl=-100;
			vr=-100;
			time=250;
		}
		player.slxSimpleAction(vl,vr,time);//反向直线向后
//		fprintf(pFile,"正向直线向后\n");
	}
	else if(temp1>limit && temp1<=90)
	{
		if(r3.mod() <distance)
		{
			vl=80;
			vr=-80;
			time=180;
		}//原地正向右转
		else
		{
			vr=100;
			vl=125;
			time=180;
		}//弧线正向右转
 	    player.slxSimpleAction(vl,vr,time);
//		fprintf(pFile,"正向右转\n");
	}
	else if(temp1<-limit && temp1>=-90)
	{
		if(r3.mod() <distance)
		{
			vl=-80;
			vr=80;
			time=180;
		}//原地正向左转
		else
		{
			vl=100;
			vr=125;
			time=250;
		}//弧线正向左转
 	    player.slxSimpleAction(vl,vr,time);
//		fprintf(pFile,"正向左转\n");
	}
	
	else if(temp2>limit && temp2<=90)
	{
		if(r3.mod() <distance)
		{
			vl=80;
			vr=-80;
			time=180;
		}//原地反向右转
		else
		{
			vl=-100;
			vr=-125;
			time=250;
		}//弧线反向右转
 	    player.slxSimpleAction(vl,vr,time);
//		fprintf(pFile,"反向右转\n");
	}
	else if(temp2<-limit && temp2>=-90)
	{
		if(r3.mod() <distance)
		{
			vl=-80;
			vr=80;
			time=180;
		}//原地反向左转
		else
		{
			vr=-100;
			vl=-125;
			time=250;
		}//弧线反向左转
 	    player.slxSimpleAction(vl,vr,time);	
//			fprintf(pFile,"反向左转\n");

	}
}

void CDecision::FindObject(Player &player, Vector &object)
{
	//关键问题是根据距离选择动作类型和动作执行时间
	//估计需要在SimpleAction增加几个动作类型和动作执行时间
	Vector r3;
	int pangle;
	int rpangle;
	int temp1;
	int temp2;
	int r3angle;
	int limit;
	int distance;
	int vl;
	int vr;
	int time;
	r3=object-player.Get_vPos();
	pangle=player.Get_m_Angle();
/*	if(pangle>=0)
		rpangle=pangle-180;
	else
		rpangle=pangle+180;
*/
	pangle=(pangle+360) % 360;
	rpangle=(pangle+180) % 360;
	r3angle=(int(r3.GetAngle())+360) % 360;
    limit=30;//实际测试
	distance=80;
    temp1=int(pangle-r3angle);
	if (temp1>270)
		temp1=temp1-360;
	else if( temp1<-270)
		temp1=temp1+360;

	temp2=int(rpangle-r3angle);
	if (temp2>270)
		temp2=temp2-360;
	else if( temp2<-270)
		temp2=temp2+360;
	

//	FILE *pFile;	
//	pFile=fopen("999.txt","a+");
//	fprintf(pFile,"pangle=%d,temp1=%d,temp2=%d,r3angle=%d\n",pangle,temp1,temp2,r3angle);
	


	if(fabs(temp1)<=limit)
	{
		if(r3.mod()<distance)//实际测试
		{
			vl=120;
			vr=120;
			time=250;
			
		}
		else 
		{
			vl=100;
			vr=100;
			time=250;
			
		}
		player.slxSimpleAction(vl,vr,time);//正向直线向前
//		fprintf(pFile,"正向直线向前\n");
	}
	else if(fabs(temp2)<=limit)
	{
		if(r3.mod()<distance)
		{
			vl=-125;
			vr=-125;
			time=250;
		}
		else 
		{
			vl=-100;
			vr=-100;
			time=250;
		}
		player.slxSimpleAction(vl,vr,time);//反向直线向后
//		fprintf(pFile,"正向直线向后\n");
	}
	else if(temp1>limit && temp1<=90)
	{
		if(r3.mod() <distance)
		{
			vl=80;
			vr=-80;
			time=180;
		}//原地正向右转
		else
		{
			vr=100;
			vl=125;
			time=180;
		}//弧线正向右转
 	    player.slxSimpleAction(vl,vr,time);
//		fprintf(pFile,"正向右转\n");
	}
	else if(temp1<-limit && temp1>=-90)
	{
		if(r3.mod() <distance)
		{
			vl=-80;
			vr=80;
			time=180;
		}//原地正向左转
		else
		{
			vl=100;
			vr=125;
			time=250;
		}//弧线正向左转
 	    player.slxSimpleAction(vl,vr,time);
//		fprintf(pFile,"正向左转\n");
	}
	
	else if(temp2>limit && temp2<=90)
	{
		if(r3.mod() <distance)
		{
			vl=80;
			vr=-80;
			time=180;
		}//原地反向右转
		else
		{
			vl=-100;
			vr=-125;
			time=250;
		}//弧线反向右转
 	    player.slxSimpleAction(vl,vr,time);
//		fprintf(pFile,"反向右转\n");
	}
	else if(temp2<-limit && temp2>=-90)
	{
		if(r3.mod() <distance)
		{
			vl=-80;
			vr=80;
			time=180;
		}//原地反向左转
		else
		{
			vr=-100;
			vl=-125;
			time=250;
		}//弧线反向左转
 	    player.slxSimpleAction(vl,vr,time);	
//			fprintf(pFile,"反向左转\n");

	}

}

void CDecision::Goalie(Player &player, CRect rect)
{
	int fieldwidth=abs(Player::FieldStruct.m_Field.Width());
	
	if(g_Ball.Get_vPos().x>int(0.2*fieldwidth))
	{
		if(InRect(player,rect)==1)
			player.slxSimpleAction(0,0,0);
		else
		{
			Vector r=Vector(rect.left+abs(rect.Width()*0.5),rect.top+abs(rect.Height()*0.5));
			FindObject(player,r);
			
		}
	}
	else
	{
		FindBall(player);
	}

}

int CDecision::InRect(Player &player, CRect rect)
{
	if(player.Get_vPos().x>rect.left && player.Get_vPos().x<rect.right && player.Get_vPos().y>rect.top && player.Get_vPos().y<rect.bottom)
		return 1;
	else
		return 0;

}

void CDecision::LostObject(Player &player)
{
	if(player.losttime<=200)
	{
		player.slxSimpleAction(120,120,200);
	}
	else
	{
		player.slxSimpleAction(-120,-120,200);

	}
	if(player.losttime>400)
		player.losttime=0;

}

⌨️ 快捷键说明

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