📄 gfc.cpp
字号:
if(ORDER[ll] == lt)
RORDER[lt] = ll;
}
}
//DEBUGFILE = fopen("debug.txt", "a");
//fprintf(DEBUGFILE, "%f %f %f %f %f\n",len[0],len[1],len[2],len[3],len[4]);
//fprintf(DEBUGFILE, "%d %d %d %d %d\n",ORDER[0],ORDER[1],ORDER[2],ORDER[3],ORDER[4]);
//fclose(DEBUGFILE);
}
bool hasEnemyNear(double x, double y){
//
int lt = 0;
double rx,ry,len;
for(lt = 0; lt < 5; lt++){
rx = ENV->opponent[lt].pos.x;
ry = ENV->opponent[lt].pos.y;
len = l(x,y,rx,ry);
if(len < sqrt(2)*ROBOTWIDTH/2)
return true;
}
return false;
}
bool hasEnemyBetween(double x1,double y1,double x2,double y2){
//
double space; //步长
double k; //斜率
double cx,cy; //current x,y
cx = x1;
cy = y1;
space = ROBOTWIDTH/2; //??
k = (y2 - y1)/(x2 - x1); //?? x2 == x1
if(x2 < x1){
space *= -1;
while(cx > x2){
if(hasEnemyNear(cx,cy))
return true;
cx += space;
cy = cy + space*k;
}
return false;
}
else if(x2 > x1){
while(cx < x2){
if(hasEnemyNear(cx,cy))
return true;
cx += space;
cy = cy + space*k;
}
return false;
}
return false;
}
bool hasEnemyIn(double x1,double y1,double x2,double y2){
//
double rx,ry;
int lt = 0;
for(lt = 0; lt < 5; lt++){
rx = ENV->opponent[lt].pos.x;
ry = ENV->opponent[lt].pos.y;
if((rx > x1 && rx <x2) || (rx > x2 && rx <x1)){ //== ??
if((ry > y1 && ry <y2) || (ry > y2 && ry <y1))
return true;
}
}
return false;
}
void turnKick(Robot *robot,int rID,int where){
//
double rx,ry,bx,by;
double dx,dy;
rx = robot->pos.x;
ry = robot->pos.y;
bx = ENV->currentBall.pos.x;
by = ENV->currentBall.pos.y;
dx = rx - bx;
dy = ry - by;
if(dy < 0 && dy > -1*(BALLD/2 + sqrt(2)*ROBOTWIDTH/2) && fabs(dx) < ROBOTWIDTH/2){
if(where == 1)
turn(robot,rID,1);
else if(where == 2)
turn(robot,rID,-1);
} //右
else if(dy > 0 && dy < (BALLD/2 + sqrt(2)*ROBOTWIDTH/2) && fabs(dx) < ROBOTWIDTH/2){
if(where == 3)
turn(robot,rID,1);
else if(where == 4)
turn(robot,rID,-1);
} //下
if(dx > 0 && dx < (BALLD/2 + sqrt(2)*ROBOTWIDTH/2) && fabs(dy) < ROBOTWIDTH/2){
if(where == 2)
turn(robot,rID,1);
else if(where == 3)
turn(robot,rID,1);
} //左
else if(dx < 0 && dx > -1*(BALLD/2 + sqrt(2)*ROBOTWIDTH/2) && fabs(dy) < ROBOTWIDTH/2){
if(where == 1)
turn(robot,rID,-1);
else if(where == 4)
turn(robot,rID,1);
} //右
}
void keeper(Robot *robot, int rID,double x,double y,double angel){
//
double rx,ry,length; //robot x,y
rx = robot->pos.x;
ry = robot->pos.y;
length = l(x,y,rx,ry);
if(length > 0.3)
sTo(robot,rID,x,y);
else{
if(HOMEEV[rID] < 1)
sRotate(robot,rID,angel);
if(HOMEEV[rID] >= 1)
run(robot,rID,0,0);
}
//DEBUGFILE = fopen("debug.txt", "a");
//fprintf(DEBUGFILE, "%f %d\n", length,HOMEEV[rID]);
//fclose(DEBUGFILE);
}
void pushHelper(Robot *robot,int rID){
//
double bx,by,rx,ry; //ball robot x,y
double x1,x2; //边界,x2 > x1
double dx,dy;
x1 = FLEFTX + ROBOTWIDTH;
x2 = FRIGHTX - ROBOTWIDTH;
rx = robot->pos.x;
ry = robot->pos.y;
bx = ENV->currentBall.pos.x;
by = ENV->currentBall.pos.y;
dx = rx - bx;
dy = ry - by;
bx = ENV->currentBall.pos.x;
by = ENV->currentBall.pos.y;
if(WHO ==1){ //blue
if(bx < x1){
if(by < GBOTY){
if(dy <= -3/2*ROBOTWIDTH && fabs(dx) < ROBOTWIDTH*2/3)
sGo(robot,rID,bx,by);
else if(dy < -2*ROBOTWIDTH)
sGo(robot,rID,bx,by);
else
sGo(robot,rID,bx + BALLD/2,by - 2*ROBOTWIDTH);
}
else if(by > GTOPY){
if(dy >= 3/2*ROBOTWIDTH && fabs(dx) < ROBOTWIDTH*2/3)
sGo(robot,rID,bx,by);
else if(dy < 2*ROBOTWIDTH)
sGo(robot,rID,bx,by);
else
sGo(robot,rID,bx,by + 2*ROBOTWIDTH);
}
}
}
else{
if(bx > x2){
if(by < GBOTY){
if(dy <= -3/2*ROBOTWIDTH && fabs(dx) < ROBOTWIDTH*2/3)
sGo(robot,rID,bx,by);
else if(dy < -2*ROBOTWIDTH)
sGo(robot,rID,bx,by);
else
sGo(robot,rID,bx + BALLD/2,by - 2*ROBOTWIDTH);
}
else if(by > GTOPY){
if(dy >= 3/2*ROBOTWIDTH && fabs(dx) < ROBOTWIDTH*2/3)
sGo(robot,rID,bx,by);
else if(dy < 2*ROBOTWIDTH)
sGo(robot,rID,bx,by);
else
sGo(robot,rID,bx,by + 2*ROBOTWIDTH);
}
}
}
}
void goalie(Robot *robot,int rID){
//
double X;
double bx,by,rx,ry;
double desX,desY; //守门员应该在的地方
double mx,my; //球场中点 x,y
double k; //斜率
mx = (FLEFTX + FRIGHTX)/2;
my = (FBOT + FTOP)/2;
bx = ENV->currentBall.pos.x;
by = ENV->currentBall.pos.y;
rx = robot->pos.x;
ry = robot->pos.y;
if(WHO ==1){ //for blue
X = 93.0 - ROBOTWIDTH/2;
if(bx < 70.12){
k = (my - by)/(GRIGHT - bx);
desY = f(k,bx,by,X);
desX = X;
keeper(robot,rID,desX,desY,270.0);
}
else if(bx >= 70.12 && bx < 93.0 - ROBOTWIDTH){
if(BALLVDIRECTION[0] > 91.0 && BALLVDIRECTION[0] < 269.0){
k = (my - by)/(GRIGHT - bx);
desY = f(k,bx,by,X);
if(desY > GTOPY+2)
desY = GTOPY + 2;
else if(desY < GBOTY- 2)
desY = GBOTY- 2;
desX = X;
keeper(robot,rID,desX,desY,270.0);
}
else if(fabs(BALLVDIRECTION[0] - 90.0)<1 || fabs(BALLVDIRECTION[0] - 270.0)<1){
desY = by;
if(desY > GTOPY+2)
desY = GTOPY + 2;
else if(desY < GBOTY- 2)
desY = GBOTY- 2;
desX = X;
keeper(robot,rID,desX,desY,270.0);
}
else {
k = tanf(BALLVDIRECTION[0]/180.0*PI);
desX = X;
desY = f(k,bx,by,X);
if(desY > GTOPY+2)
desY = GTOPY + 2;
else if(desY < GBOTY- 2)
desY = GBOTY- 2;
keeper(robot,rID,desX,desY,270.0);
}
if(BALLEV[0] == 0){
desY = by;
if(desY > GTOPY+2)
desY = GTOPY + 2;
else if(desY < GBOTY- 2)
desY = GBOTY- 2;
keeper(robot,rID,X,desY,270.0);
}
}
else if(bx >= 93.0 - ROBOTWIDTH){
desX = X;
if(by > 58.56 + BALLD/2)
keeper(robot,rID,desX,GTOPY + 2,270.0);
else if(by < 27.89 - BALLD/2)
keeper(robot,rID,desX,GBOTY- 2,270.0);
else if(by >= 52.92 && by <= 58.56 + BALLD/2){
if(hasEnemyNear(X,51.30) && by - ry > ROBOTWIDTH)
keeper(robot,rID,desX,GTOPY + 2,270.0);
else
sGo(robot,rID,X,FTOP);
}
else if(by <= 33.71 && by >= 27.89 - BALLD/2){
if(hasEnemyNear(X,30.80)&& ry - by > ROBOTWIDTH)
keeper(robot,rID,desX,GBOTY- 2,270.0);
else
sGo(robot,rID,X,FBOT);
}
else if(by >33.71 && by < 52.92){
if(by > ry)
sGo(robot,rID,X,FTOP);
else if(by < ry)
sGo(robot,rID,X,FBOT);
}
} //卡住归位
if(rx > 93.0 - ROBOTWIDTH/2 + 0.8 && (49.68 - ry < 5.0 || ry - 33.93 < 5.0)){
if(ry < my)
sTo(robot,rID,93.0 - ROBOTWIDTH,GBOTY + ROBOTWIDTH*3/2);
else if(ry > my)
sTo(robot,rID,93.0 - ROBOTWIDTH,GTOPY - ROBOTWIDTH*3/2);
}
if(!hasEnemyIn(80.43,27.89,FRIGHTX,58.56)){
if(bx > 80.43 && by > 27.98 && by < 58.56){
if(rx > bx)
sGo(robot,rID,bx+ 0.5,by);
}
}
} //for yellow
else{
X = 7.23 + ROBOTWIDTH/2;
if(bx > 27.81){
k = (my - by)/(GLEFT - bx);
desY = f(k,bx,by,X);
desX = X;
keeper(robot,rID,desX,desY,270.0);
}
else if(bx >= 7.23 + ROBOTWIDTH && bx <= 27.81){
if(BALLVDIRECTION[0] < 89.0 || BALLVDIRECTION[0] > 271.0){
k = (my - by)/(GLEFT - bx);
desY = f(k,bx,by,X);
if(desY > GTOPY+2)
desY = GTOPY + 2;
else if(desY < GBOTY- 2)
desY = GBOTY- 2;
desX = X;
keeper(robot,rID,desX,desY,270.0);
}
else if(fabs(BALLVDIRECTION[0] - 90.0)<1 || fabs(BALLVDIRECTION[0] - 270.0)<1){
desY = by;
if(desY > GTOPY+2)
desY = GTOPY + 2;
else if(desY < GBOTY- 2)
desY = GBOTY- 2;
desX = X;
keeper(robot,rID,desX,desY,270.0);
}
else{
k = tanf(BALLVDIRECTION[0]/180.0*PI);
desX = X;
desY = f(k,bx,by,X);
if(desY > GTOPY+2)
desY = GTOPY + 2;
else if(desY < GBOTY- 2)
desY = GBOTY- 2;
keeper(robot,rID,desX,desY,270.0);
}
if(BALLEV[0] == 0){
desY = by;
if(desY > GTOPY+2)
desY = GTOPY + 2;
else if(desY < GBOTY- 2)
desY = GBOTY- 2;
keeper(robot,rID,X,desY,270.0);
}
}
else if(bx <= 7.23 + ROBOTWIDTH){
desX = X;
if(by > 58.56 + BALLD/2)
keeper(robot,rID,desX,GTOPY + 2,270.0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -