1. 程式人生 > >AI簡單平移追蹤算法

AI簡單平移追蹤算法

技術 路線 post ret spa bsp else if 如圖所示 重新

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 }

AI簡單平移追蹤算法