📄 vsv.cpp
字号:
/*Meetball_x 求出该队员和求相遇的 x 坐标
maxn用于限制追到球的最长的时间(周期数)
*/
//
Vector3D Meetball_x( Environment *env ,double Y,double maxn)
{//求出该队员和求相遇的 x 坐标
Mydata * p;
p=(Mydata *)env->userData;
double dy = Y -p->curball.y;
Vector3D meetpoint={0,0,-1};
if( dy > 0 )
{//球在 下方,目标在上
if(p->ballspeed.y > 0.01)
meetpoint.z = dy / p->ballspeed.y;
}
else
{//球在 上方 ,目标在下 //dx < 0
if(p->ballspeed.y < -0.01)
meetpoint.z = dy / p->ballspeed.y;
}
if( meetpoint.z > 0 )
{
meetpoint.y = Y;
meetpoint.x = p->ballspeed.x * meetpoint.z + p->curball.x ;
}
return meetpoint;
}
//////
/*Within 判断robot队员和球的距离是否再LENGTH规定的范围内
返回true or false
*/
//
bool Within(Environment* env,int robot,double LENGTH)
{
Mydata* p;
p=(Mydata*)env->userData;
const double steps=50;
int who=robot;
double dis;
Vector3D ballgo={0,0,0};
Vector3D robotgo={0,0,0};
Vector3D ball=p->curball;
ballgo.x = ball.x + steps * p->myspeed[who].x;
ballgo.y = ball.y + steps * p->myspeed[who].y;
dis=Distance(ballgo,p->robot[robot].pos);
if(dis < LENGTH)
{
return true;
}
return false;
}
////////////
/* PredictBall 预测经过 steps 个周期之后球的位置
函数返回结果:经过 steps 个周期之后球的位置
考虑撞墙的过程
*/
////////////
void PredictBall(Environment *env,int steps)
{
Mydata * p;
p=(Mydata *)env->userData;
Vector3D predictball;
Vector3D ballspeed;
int i=0;
predictball.x = p->curball.x; //赋初值
predictball.y = p->curball.y;
ballspeed.x = p->ballspeed.x ;
ballspeed.y = p->ballspeed.y ;
ballspeed.z = p->ballspeed.z ;
for(i=0;i<steps;i++)
{
predictball.x += ballspeed.x ;
predictball.y += ballspeed.y ;
//处理撞墙
if( predictball.x > FRIGHT )// 是不 是有问题哦???????
{
predictball.x -= ballspeed.x ; //retern
predictball.y -= ballspeed.y ;
ballspeed.x *=-SPEED_NORMAL; //loose
ballspeed.y *= SPEED_TANGENT;
predictball.x += ballspeed.x ; //go on
predictball.y += ballspeed.y ;
}
else if( predictball.x < FLEFT )
{
predictball.x -= ballspeed.x ; //retern
predictball.y -= ballspeed.y ;
ballspeed.x *=-SPEED_NORMAL; //loose
ballspeed.y *= SPEED_TANGENT;
predictball.x += ballspeed.x ; //go on
predictball.y += ballspeed.y ;
}
else if( predictball.y < FBOT )
{
predictball.x -= ballspeed.x ; //retern
predictball.y -= ballspeed.y ;
ballspeed.x *= SPEED_TANGENT; //loose
ballspeed.y *=-SPEED_NORMAL;
predictball.x += ballspeed.x ; //go on
predictball.y += ballspeed.y ;
}
else if( predictball.y > FTOP )
{
predictball.x -= ballspeed.x ; //retern
predictball.y -= ballspeed.y ;
ballspeed.x *= SPEED_TANGENT; //loose
ballspeed.y *=-SPEED_NORMAL;
predictball.x += ballspeed.x ; //go on
predictball.y += ballspeed.y ;
}
if( predictball.x + predictball.y > FRIGHT +FTOP -CORNER)
{//右上
double vx,vy;
vy=0.7071*ballspeed.y + 0.7071*ballspeed.x; //变换1
vx=-0.7071*ballspeed.y + 0.7071*ballspeed.x;
predictball.x -= ballspeed.x ; //retern
predictball.y -= ballspeed.y ;
vx *= SPEED_TANGENT; //loose
vy *=-SPEED_NORMAL;
ballspeed.y = 0.7071 * vy - 0.7071 * vx; //变换2
ballspeed.x = 0.7071 * vy + 0.7071 * vx;
predictball.x += ballspeed.x ; //go on
predictball.y += ballspeed.y ;
}
else if( predictball.x + predictball.y < FLEFTX +FBOT+CORNER)
{//左下
double vx,vy;
vy=0.7071*ballspeed.y + 0.7071*ballspeed.x; //变换1
vx=-0.7071*ballspeed.y + 0.7071*ballspeed.x;
predictball.x -= ballspeed.x ; //retern
predictball.y -= ballspeed.y ;
vx *= SPEED_TANGENT; //loose
vy *=-SPEED_NORMAL;
ballspeed.y = 0.7071 * vy - 0.7071 * vx; //变换2
ballspeed.x = 0.7071 * vy + 0.7071 * vx;
predictball.x += ballspeed.x ; //go on
predictball.y += ballspeed.y ;
}
else if( predictball.x - predictball.y > FRIGHT -FBOT -CORNER)
{//右下
double vx,vy;
vy=0.7071*ballspeed.y - 0.7071*ballspeed.x; //变换1
vx=0.7071*ballspeed.y + 0.7071*ballspeed.x;
predictball.x -= ballspeed.x ; //retern
predictball.y -= ballspeed.y ;
vx *= SPEED_TANGENT; //loose
vy *=-SPEED_NORMAL;
ballspeed.y = 0.7071 * vy + 0.7071 * vx; //变换2
ballspeed.x = -0.7071 * vy + 0.7071 * vx;
predictball.x += ballspeed.x ; //go on
predictball.y += ballspeed.y ;
}
else if( predictball.y - predictball.x > FTOP - FLEFT-CORNER)
{//左上
double vx,vy;
vy=0.7071*ballspeed.y - 0.7071*ballspeed.x; //变换1
vx=0.7071*ballspeed.y + 0.7071*ballspeed.x;
predictball.x -= ballspeed.x ; //retern
predictball.y -= ballspeed.y ;
vx *= SPEED_TANGENT; //loose
vy *=-SPEED_NORMAL;
ballspeed.y = 0.7071 * vy + 0.7071 * vx; //变换2
ballspeed.x = -0.7071 * vy + 0.7071 * vx;
predictball.x += ballspeed.x ; //go on
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=21.5;
double x2=50.1;
double x3=78.6;
double y1=25.1;
double y2=41.8;
double y3=58.6;
Vector3D ball;
ball.x=p->curball.x;
ball.y=p->curball.y;
if(ball.x<=x1&&ball.x>FLEFT&&ball.y>FBOT&&ball.y<=y1)
ballArea=1;
else if(ball.x<=x1&&ball.x>FLEFT&&ball.y>Y1&&ball.y<=y2)
ballArea=2;
else if(ball.x<=x1&&ball.x>FLEFT&&ball.y>y2&&ball.y<=y3)
ballArea=3;
else if(ball.x<=x1&&ball.x>FLEFT&&ball.y>y3&&ball.y<FTOP)
ballArea=4;
else if(ball.x<=x2&&ball.y<=y1&&ball.y>FBOT)
ballArea=5;
else if(ball.x<=x2&&ball.y<=y2)
ballArea=6;
else if(ball.x<=x2&&ball.y<=y3)
ballArea=7;
else if(ball.x<=x2&&ball.y>y3&&ball.y<FTOP)
ballArea=8;
else if(ball.x<x3&&ball.y<=y1)
ballArea=9;
else if(ball.x<x3&&ball.y<=y2)
ballArea=10;
else if(ball.x<x3&&ball.y<=y3)
ballArea=11;
else if(ball.x<x3&&ball.y>y3&&ball.y<FTOP)
ballArea=12;
else if(ball.x>=x3&&ball.y<=y1)
ballArea=13;
else if(ball.x>=x3&&ball.y<=y2)
ballArea=14;
else if(ball.x>=x3&&ball.y<y3)
ballArea=15;
else ballArea=16;
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){
Mydata *p=(Mydata *)env->userData;
int count,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;
}
void Order(Environment *env)
{
Mydata * p;
p=(Mydata *)env->userData;
int i,j,k,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 1:
case 4:
case 5:
case 6:
case 7:
case 8:
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 2:
case 3:
if(p->curball.y>p->robot[0].pos.y){
i=p->mainrobot;
p->mainrobot=p->cutrobot;
p->cutrobot=i;
}
break;
case 9:
case 10:
case 11:
case 12:
case 13:
if(dis[1]<dis[2]){
if(dis[2]<=dis[3]){
i=2;
j=3;
k=4;
}
else if(dis[1]<=dis[3]){
i=2;
j=4;
k=3;
}
else{
i=4;
j=2;
k=3;
}
}
else{
if(dis[1]<=dis[3]){
i=3;
j=2;
k=4;
}
else if(dis[2]<=dis[3]){
i=3;
j=4;
k=2;
}
else{
i=4;
j=3;
k=2;
}
}
p->mainrobot=i;
p->slowrobot=j;
p->cutrobot=k;
record=p->cutrobot;
break;
case 14:
if(!Within(env,record,1))
p->cutrobot=record;
else{
if(p->ballspeed.z<0){
dy=100;
for(i=2;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;
}
else{
dy=0;
for(i=2;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=2;i<5;i++)
if(i!=p->cutrobot&&i!=p->mainrobot)
p->slowrobot=i;
break;
case 15:
if(!Within(env,record,1))
p->cutrobot=record;
else{
if(p->ballspeed.z<0){
dy=100;
for(i=2;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;
}
else{
dy=0;
for(i=2;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=2;i<5;i++)
if(i!=p->cutrobot&&i!=p->mainrobot)
p->slowrobot=i;
break;
case 16:
if(dis[1]<dis[2]){
if(dis[2]<=dis[3]){
i=2;
j=3;
k=4;
}
else if(dis[1]<=dis[3]){
i=2;
j=4;
k=3;
}
else{
i=4;
j=2;
k=3;
}
}
else{
if(dis[1]<=dis[3]){
i=3;
j=2;
k=4;
}
else if(dis[2]<=dis[3]){
i=3;
j=4;
k=2;
}
else{
i=4;
j=3;
k=2;
}
}
p->mainrobot=i;
p->slowrobot=j;
p->cutrobot=k;
record=p->cutrobot;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -