📄 decision.cpp
字号:
}
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 + -