• AI简单平移追踪算法


    1.比较坐标追踪法

    追踪者会不停地比较自身和目标的x坐标和y坐标,每x和y上一个单位的移动为一个周期,该算法虽然简单好用,但实用性差且不智能化,如果追踪者数量增加,路线会显得单调,由于都是先走个对角线再一路直行,很可能造成多个追踪者拥堵在一起。

    代码:

     1 while(!(rigesha.x==killer.x&&rigesha.y==killer.y)){
     2 
     3    if(rigesha.x>killer.x){
     4    killer.goRight();
     5    }else if(rigesha.x<killer.x){
     6    killer.goLeft();
     7    }
     8 
     9    if(rigesha.y>killer.y){
    10    killer.goDown();
    11    }else if(rigesha.y<killer.y){
    12    killer.goUp();
    13    }
    14 
    15 }

    2.射线动态追踪法

    先在追踪者和目标之间建立一条直线,如图所示,然后再通过三角形面积公式法,模拟上行或左行一个单位后,距离该直线的距离,比较这两个距离,执行最短距离所对应的操作。

    这样一来,追踪路线会尽可能接近直线,AI效果会更逼真。

    在追踪过程中,如果监测到目标改变位置(此例假设目标每一帧都逃跑),那么追踪者就会重新建立两者之间的直线,然后沿着该直线继续追踪(如图所示)。

    代码:

     1 rigeshaX = rigesha.x;
     2 rigeshaY = rigesha.y;
     3 killerX = killer.x;
     4 killerY = killer.y; 
     7 while(!(rigesha.x==killer.x&&rigesha.y==killer.y)){
     8 
     9    if(Random(0,1)>0.5){
    10    if(rigesha.x>killer.x){rigesha.goRight();}else{rigesha.goLeft();}
    11    }else{
    12    if(rigesha.y>killer.y){rigesha.goDown();}else{rigesha.goUp();}
    13    }
    14    rigesha.move = true;
    15    }
    16 
    17    if(rigesha.move){
    18    caculaterLine();
    19    }
    20 
    21    float rightDistanse = xORy(++killer.x,killer.y);
    22    float leftDistance = xORy(--(--killer.x),killer.y);
    23    float upDistance = xORy(++killer.x),--killer.y);
    24    float downDistance = xORy(killer.x,++(++killer.y));
    25    killer.y--;
    26 
    27    if(rigesha.x<=killer.x&&rigesha.y<=killer.y){
    28    if(leftDistance<=upDistance){
    29    killer.goLeft();
    30    }else{
    31    killer.goUp();
    32    }
    33    rigesha.move = false;
    34    continue;
    35    }
    36 
    37    if(rigesha.x>=killer.x&&rigesha.y<=killer.y){
    38    if(rightDistance<=upDistance){
    39    killer.goRight();
    40    }else{
    41    killer.goUp();
    42    }
    43    rigesha.move = false;
    44    continue;
    45    }
    46 
    47    if(rigesha.x>=killer.x&&rigesha.y>=killer.y){
    48    if(rightDistance<=downDistance){
    49    killer.goRight();
    50    }else{
    51    killer.goDown();
    52    }
    53    rigesha.move = false;
    54    continue;
    55    }
    56 
    57    if(rigesha.x<=killer.x&&rigesha.y>=killer.y){
    58    if(leftDistance<=downDistance){
    59    killer.goLeft();
    60    }else{
    61    killer.goDown();
    62    }
    63    rigesha.move = false;
    64    continue;
    65    }
    66 
    67 }
    68 
    69 void caculaterLine(){
    70    rigeshaX = rigesha.x;
    71    rigeshaY = rigesha.y;
    72    killerX = killer.x;
    73    killerY = killer.y;
    74 }
    75 
    76 float xORy(x,y){
    77    float S = x*killerY + killerX*rigeshaY + rigeshaX*y - x*rigeshaY - killerX*y - rigeshaX*killerY;
    78    if(S<0){S = -S;}
    79    float lengthDI = sqrt((killerX-rigashaX)*(killerX-rigashaX)+(killerY-rigashaY)*(killerY-rigashaY))
    80    distance = S/lengthDI;
    81    return distance;
    82 }
  • 相关阅读:
    本学期课程总结
    “进度条”博客——第十六周
    “进度条”博客——第十五周
    《梦断代码》阅读笔记03
    第二期冲刺站立会议个人博客16(2016/6/09)
    第二期冲刺站立会议个人博客15(2016/6/08)
    第二期冲刺站立会议个人博客14(2016/6/07)
    第二期冲刺站立会议个人博客13(2016/6/06)
    第二期冲刺站立会议个人博客12(2016/6/05)
    “进度条”博客——第十四周
  • 原文地址:https://www.cnblogs.com/VRGamer-006/p/8542773.html
Copyright © 2020-2023  润新知