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

📄 gfc.cpp

📁 机器人足球的一个自学的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                        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 + -