📄 action.cpp
字号:
predictball.y += ballspeed.y ;
}
//处理四角
}
p->preball.x = predictball.x ;
p->preball.y = predictball.y ;
p->preball.z = Atan( ballspeed.y ,ballspeed.x );
}
////////////
/* Kick 让robot把球踢到ToPos的位置
*/
////////////
void Kick(Environment *env , int robot , Vector3D ToPos )
{
Mydata * p;
p=(Mydata *)env->userData;
PredictBall(env,2);
Vector3D ball = p->preball;
Vector3D RobotToBall; //人和球的相对位置
RobotToBall.x = ball.x - p->robot[robot].pos.x ;
RobotToBall.y = ball.y - p->robot[robot].pos.y ;
RobotToBall.z = Atan(p->robot[robot].pos , ball);
Vector3D BallToGate ; //球和球门的相对位置
BallToGate.x = ToPos.x - ball.x ;
BallToGate.y = ToPos.y - ball.y ;
BallToGate.z = Atan(ball , ToPos);
double RunAngle ;
RunAngle = RobotToBall.z - BallToGate.z;
RegulateAngle(RunAngle);
RunAngle = RobotToBall.z + RunAngle /2; // 可以调整 2
RegulateAngle(RunAngle);
PAngle(env,robot,RunAngle,125);
}
void Kick(Environment *env , int robot ,int robot1)//踢人
{
Mydata * p;
p=(Mydata *)env->userData;
Vector3D RobotToBall; //人和球的相对位置
RobotToBall.x = p->robot[robot1].pos.x- p->robot[robot].pos.x ;
RobotToBall.y = p->robot[robot1].pos.y- p->robot[robot].pos.y ;
RobotToBall.z = Atan(p->robot[robot].pos , p->robot[robot1].pos);
Vector3D BallToGate ; //球和球门的相对位置
BallToGate.x = CONSTGATE.x- p->robot[robot1].pos.x;
BallToGate.y = CONSTGATE.y- p->robot[robot1].pos.y;
BallToGate.z = Atan(p->robot[robot1].pos,CONSTGATE);
double RunAngle ;
RunAngle = RobotToBall.z - BallToGate.z;
RegulateAngle(RunAngle);
RunAngle = RobotToBall.z + RunAngle /2 ; // 可以调整 2
RegulateAngle(RunAngle);
PAngle(env,robot,RunAngle,125);
}
void Kick(Environment *env,int robot,int steps,double limits){
Mydata *p=(Mydata*)env->userData;
double dx,dy,angle;
dx=p->curball.x-p->robot[robot].pos.x;
dy=p->curball.y-p->robot[robot].pos.y;
angle=Atan(dy,dx);
PredictBall(env,steps);
if(angle<90&&angle>-90){
if(p->curball.y>41.8)
PositionBallX(env,robot,p->preball,-125,3);
else
PositionBallX(env,robot,p->preball,125,3);
}
else
shoot(env,robot);
}
////////////
/* CheckBall 返回球所在的分区号
*/
////////////
int CheckBall(Environment *env)
{
Mydata * p;
p=(Mydata *)env->userData;
int ballArea;
double x1=12;
double x2=19.8;
double x3=33;
double x4=48.7;
double x5=54;
double x6=80.4;
double x7=88.3;
double y1=11.9;
double y2=27.9;
double y3=43;
double y4=58.6;
double y5=70.5;
Vector3D ball;
ball.x=p->curball.x;
ball.y=p->curball.y;
if(ball.x<=x4&&ball.x>FLEFT&&ball.y<=FTOP&&ball.y>y5)
ballArea=1;
else if(ball.x<=FRIGHT&&ball.x>x4&&ball.y<=FTOP&&ball.y>y5)
ballArea=19;
else if(ball.x<=x1&&ball.x>FLEFT&&ball.y<=y5&&ball.y>y4)
ballArea=2;
else if(ball.x<=x2&&ball.x>x1&&ball.y<=y5&&ball.y>y4)
ballArea=3;
else if(ball.x<=x3&&ball.x>x2&&ball.y<=y5&&ball.y>y4)
ballArea=4;
else if(ball.x<=x4&&ball.x>x3&&ball.y<=y5&&ball.y>y4)
ballArea=5;
else if(ball.x<=x5&&ball.x>x4&&ball.y<=y5&&ball.y>y4)
ballArea=20;
else if(ball.x<=x6&&ball.x>x5&&ball.y<=y5&&ball.y>y4)
ballArea=21;
else if(ball.x<=x7&&ball.x>x6&&ball.y<=y5&&ball.y>y4)
ballArea=22;
else if(ball.x<=FRIGHT&&ball.x>x7&&ball.y<=y5&&ball.y>y4)
ballArea=23;
else if(ball.x<=x1&&ball.x>FLEFT&&ball.y<=y4&&ball.y>y3)
ballArea=6;
else if(ball.x<=x2&&ball.x>x1&&ball.y<=y4&&ball.y>y3)
ballArea=7;
else if(ball.x<=x3&&ball.x>x2&&ball.y<=y4&&ball.y>y3)
ballArea=8;
else if(ball.x<=x4&&ball.x>x3&&ball.y<=y4&&ball.y>y3)
ballArea=9;
else if(ball.x<=x5&&ball.x>x4&&ball.y<=y4&&ball.y>y3)
ballArea=24;
else if(ball.x<=x6&&ball.x>x5&&ball.y<=y4&&ball.y>y3)
ballArea=25;
else if(ball.x<=x7&&ball.x>x6&&ball.y<=y4&&ball.y>y3)
ballArea=26;
else if(ball.x<=FRIGHT&&ball.x>x7&&ball.y<=y4&&ball.y>y3)
ballArea=27;
else if(ball.x<=x1&&ball.x>FLEFT&&ball.y<=y3&&ball.y>y2)
ballArea=10;
else if(ball.x<=x2&&ball.x>x1&&ball.y<=y3&&ball.y>y2)
ballArea=11;
else if(ball.x<=x3&&ball.x>x2&&ball.y<=y3&&ball.y>y2)
ballArea=12;
else if(ball.x<=x4&&ball.x>x3&&ball.y<=y3&&ball.y>y2)
ballArea=13;
else if(ball.x<=x5&&ball.x>x4&&ball.y<=y3&&ball.y>y2)
ballArea=28;
else if(ball.x<=x6&&ball.x>x5&&ball.y<=y3&&ball.y>y2)
ballArea=29;
else if(ball.x<=x7&&ball.x>x6&&ball.y<=y3&&ball.y>y2)
ballArea=30;
else if(ball.x<=FRIGHT&&ball.x>x7&&ball.y<=y3&&ball.y>y2)
ballArea=31;
else if(ball.x<=x1&&ball.x>FLEFT&&ball.y<=y2&&ball.y>y1)
ballArea=14;
else if(ball.x<=x2&&ball.x>x1&&ball.y<=y2&&ball.y>y1)
ballArea=15;
else if(ball.x<=x3&&ball.x>x2&&ball.y<=y2&&ball.y>y1)
ballArea=16;
else if(ball.x<=x4&&ball.x>x3&&ball.y<=y2&&ball.y>y1)
ballArea=17;
else if(ball.x<=x5&&ball.x>x4&&ball.y<=y2&&ball.y>y1)
ballArea=32;
else if(ball.x<=x6&&ball.x>x5&&ball.y<=y2&&ball.y>y1)
ballArea=33;
else if(ball.x<=x7&&ball.x>x6&&ball.y<=y2&&ball.y>y1)
ballArea=34;
else if(ball.x<=FRIGHT&&ball.x>x7&&ball.y<=y2&&ball.y>y1)
ballArea=35;
else if(ball.x<=x4&&ball.x>FLEFT&&ball.y<=y1&&ball.y>FBOT)
ballArea=18;
else ballArea=36;
return ballArea;
}
void shoot(Environment *env,int robot){
Mydata *p=(Mydata *)env->userData;
double w1,w2,alfa;
double dx,dy;
if(p->curball.y>GBOT&&p->curball.y<=GTOP/2){
if(p->ballspeed.z>85&&p->ballspeed.z<95)
PositionBallX(env,robot,p->curball,-90,4);
else if(p->ballspeed.z<-85&&p->ballspeed.z>-95)
PositionBallX(env,robot,p->curball,90,4);
}
else if(p->curball.y>=GTOP/2&&p->curball.y<=GTOP){
if(p->ballspeed.z>85&&p->ballspeed.z<95)
PositionBallX(env,robot,p->curball,-90,4);
else if(p->ballspeed.z<-85&&p->ballspeed.z>-95)
PositionBallX(env,robot,p->curball,90,4);
}
if(p->robot[robot].pos.x<=p->curball.x){
PredictBall(env,2);
dx=GRIGHT-p->robot[robot].pos.x;
dy=GTOP-p->robot[robot].pos.y;
w1=Atan(dy,dx);
dx=GRIGHT-p->robot[robot].pos.x;
dy=GBOT-p->robot[robot].pos.y;
w2=Atan(dy,dx);
dx=p->preball.x-p->robot[robot].pos.x;
dy=p->preball.y-p->robot[robot].pos.y;
alfa=Atan(dy,dx);
if((w1-alfa)*(w2-alfa)<=0)
PAngle(env,robot,alfa,125);
else if(p->curball.y<FBOT+4&&p->robot[robot].pos.y<FBOT+4)
Kick(env,robot,BOTGATE);
else if(p->curball.y>FTOP-4&&p->robot[robot].pos.y>FBOT-4)
Kick(env,robot,TOPGATE);
else
Kick(env,robot,CONSTGATE);
}
else
Kick(env,robot,CONSTGATE);
}
bool shoot1(Environment *env,int robot,int count){
Mydata * p;
p=(Mydata *)env->userData;
int i=1,k;
double angle;
double dx,dy;
if(p->ballspeed.y>=0.5||p->ballspeed.y<=-0.5){
if(p->ballspeed.y>0){
count=(GTOP-p->curball.y)/p->ballspeed.y;
}
else{
count=fabs((p->curball.y-GBOT)/p->ballspeed.y);
}
}
if(count>=600)
count=600;
while(i<=count){
PredictBall(env,i);
k=Count(env,robot,p->preball);
if(abs(i-k)<=3)
if(p->preball.y<=GTOP+4&&p->preball.y>=GBOT-4){//调整角度准备射门
break;
}
i++;
}
if(i<=count){
dx=p->preball.x-p->robot[robot].pos.x;
dy=p->preball.y-p->robot[robot].pos.y;
angle=Atan(dy,dx);
PAngle(env,robot,angle,125);
return true;
}
else
return false;
}
int nearfield(Environment *env,int robot,double x,double y,double limit)
{
Mydata * p;
p=(Mydata *)env->userData;
double disx,disy;
disx=fabs(p->robot [robot].pos.x-x);
disy=fabs(p->robot [robot].pos.y-y);
{
if(disx<limit)
return 1;
else if(disy<limit)
return 2;
else
return 3;
}
}
void oppOrder(Environment *env)
{
Mydata * p;
p=(Mydata *)env->userData;
int i,j,a[4];
double dis[4],b[4],temple;
double dy=0;
b[0]=dis[0]=Distance(p->opp[1].pos ,p->curball);
b[1]=dis[1]=Distance(p->opp[2].pos,p->curball);
b[2]=dis[2]=Distance(p->opp[3].pos,p->curball);
b[3]=dis[3]=Distance(p->opp[4].pos,p->curball);
for(i=0;i<3;i++)
for(j=i+1;j<4;j++){
if(b[i]>b[j]){
temple=b[i];
b[i]=b[j];
b[j]=temple;
}
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(dis[j]==b[i])
a[i]=j+1;
p->oppmainrobot=a[0];
p->oppslowrobot=a[1];
p->oppcutrobot=a[2];
p->oppdefentrobot=a[3];
}
void Order(Environment *env)
{
Mydata * p;
p=(Mydata *)env->userData;
int i,j,a[4];
double dis[4],b[4],temple;
double dy=0;
static record=2;
b[0]=dis[0]=Distance(p->robot[1].pos,p->curball);
b[1]=dis[1]=Distance(p->robot[2].pos,p->curball);
b[2]=dis[2]=Distance(p->robot[3].pos,p->curball);
b[3]=dis[3]=Distance(p->robot[4].pos,p->curball);
switch(p->ballArea){
case 2:
case 3:
case 4:
case 8:
case 12:
case 14:
case 15:
case 16:
case 6:
case 7:
case 10:
case 11:
for(i=0;i<3;i++)
for(j=i+1;j<4;j++){
if(b[i]>b[j]){
temple=b[i];
b[i]=b[j];
b[j]=temple;
}
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(dis[j]==b[i])
a[i]=j+1;
p->mainrobot=a[0];
p->slowrobot=a[1];
p->cutrobot =a[2];
p->defentrobot=a[3];
break;
case 1:
case 5:
case 9:
case 13:
case 17:
case 18:
for(i=0;i<3;i++)
for(j=i+1;j<4;j++){
if(b[i]>b[j]){
temple=b[i];
b[i]=b[j];
b[j]=temple;
}
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(dis[j]==b[i])
a[i]=j+1;
p->mainrobot=a[0];
p->slowrobot=a[1];
p->cutrobot=a[2];
p->defentrobot=a[3];
case 19:
case 24:
case 28:
case 32:
case 36:
for(i=0;i<3;i++)
for(j=i+1;j<4;j++){
if(b[i]>b[j]){
temple=b[i];
b[i]=b[j];
b[j]=temple;
}
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(dis[j]==b[i])
a[i]=j+1;
p->mainrobot=a[0];
p->slowrobot=a[1];
p->cutrobot=a[2];
p->defentrobot=a[3];
record=p->cutrobot;
break;
case 22:
case 21:
case 23:
case 25:
case 26:
case 27:
for(i=0;i<3;i++)
for(j=i+1;j<4;j++){
if(b[i]>b[j]){
temple=b[i];
b[i]=b[j];
b[j]=temple;
}
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(dis[j]==b[i])
a[i]=j+1;
p->mainrobot=a[0];
p->slowrobot=a[1];
p->cutrobot=a[2];
p->defentrobot=a[3];
if(!Within(env,record,1))
p->cutrobot=record;
else{
if(p->ballspeed.z<0){
dy=100;
for(i=1;i<5;i++)
if(i!=a[3] )
{
if(p->robot[i].pos.y<dy)
{
dy=p->robot[i].pos.y;
record=i;
}
}
p->mainrobot=p->cutrobot;
p->cutrobot=record;
}
else{
dy=0;
for(i=1;i<5;i++)
if(i!=a[3])
{
if(p->robot[i].pos.y>dy){
dy=p->robot[i].pos.y;
record=i;
}
}
p->mainrobot=p->cutrobot;
p->cutrobot=record;
}
}
for(i=1;i<5;i++)
if(i!=a[3])
{
if(i!=p->cutrobot&&i!=p->mainrobot)
p->slowrobot=i;
}
break;
case 29:
case 30:
case 31:
case 33:
case 34:
case 35:
for(i=0;i<3;i++)
for(j=i+1;j<4;j++){
if(b[i]>b[j]){
temple=b[i];
b[i]=b[j];
b[j]=temple;
}
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(dis[j]==b[i])
a[i]=j+1;
p->mainrobot=a[0];
p->slowrobot=a[1];
p->cutrobot=a[2];
p->defentrobot=a[3];
if(!Within(env,record,1))
p->cutrobot=record;
else{
if(p->ballspeed.z<0){
dy=100;
for(i=1;i<5;i++)
if(i!=a[3])
{
if(p->robot[i].pos.y<dy){
dy=p->robot[i].pos.y;
record=i;
}
}
p->mainrobot=p->cutrobot;
p->cutrobot=record;
}
else{
dy=0;
for(i=1;i<5;i++)
{
if(p->robot[i].pos.y>dy){
dy=p->robot[i].pos.y;
record=i;
}
}
p->mainrobot=p->cutrobot;
p->cutrobot=record;
}
}
for(i=1;i<5;i++)
if(i!=a[3])
{
if(i!=p->cutrobot&&i!=p->mainrobot)
p->slowrobot=i;
}
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -