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 }

 

posted @ 2018-03-10 23:40  Helix006  阅读(1421)  评论(0编辑  收藏  举报