zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Treap 树堆 容易实现的平衡树
    (转)Maven实战(二)构建简单Maven项目
    (转)Maven实战(一)安装与配置
    根据请求头跳转判断Android&iOS
    (转)苹果消息推送服务器 php 证书生成
    (转)How to renew your Apple Push Notification Push SSL Certificate
    (转)How to build an Apple Push Notification provider server (tutorial)
    (转)pem, cer, p12 and the pains of iOS Push Notifications encryption
    (转)Apple Push Notification Services in iOS 6 Tutorial: Part 2/2
    (转)Apple Push Notification Services in iOS 6 Tutorial: Part 1/2
  • 原文地址:https://www.cnblogs.com/VRGamer-006/p/8542773.html
Copyright © 2011-2022 走看看