追逐玩家时,AI敌人会聚在一起

时间:2012-01-10 09:26:05

标签: c# xna artificial-intelligence xna-4.0 path-finding

我创造了在游戏中追逐玩家的敌人,但是有一个问题。当敌人靠近玩家时,敌人太完美并且很快就会聚集在一起。这是因为他们只是在每次游戏更新时向玩家的方向移动。

我想向敌人介绍一些随机性,可能是运动角度。这是我到目前为止(我还没有优化它,因为它还没有完成,所以我知道很高的开销):

Angle = (float)Math.Atan2((HeroPosition - Position).Y, (HeroPosition - Position).X)// Positions are Vector2s
GlobalForce Propellant = new GlobalForce((float)Math.Cos(Angle) / 2, (float)Math.Sin(Angle) / 2);
ApplyForce(Propellant);

如果我尝试在角度中添加一个随机数,则存在一些问题:

  1. 他们都在彼此之后如此迅速地更新,所有人的种子时间都相同

  2. 随机数在每次更新时都是如此不同,以致敌人的角度不规则地跳跃。

  3. 所以我想知道的是:大多数游戏如何解决这个问题?我该如何让敌人采取不同的路径(无法访问其他敌人的名单)?

    编辑:

    这是我在以下建议之后使用的代码:

    Angle = (float)Math.Atan2((HeroPosition - Position).Y, (HeroPosition - Position).X);
    GlobalForce Propellant = new GlobalForce((float)Math.Cos(Angle) / 2, (float)Math.Sin(Angle) / 2);
    ApplyForce(Propellant);
    
    foreach (Enemy e in OtherEnemies)
    {
        if (e != this)
        {
            if ((e.Position - Position).Length() < 64)
            {
                float angleBetween = MathHelper.TwoPi-(float)Math.Atan2((e.Position-Position).Y, (e.Position-Position).X);
                GlobalForce avoidance = new GlobalForce((float)Math.Cos(angleBetween)*2, (float)Math.Sin(angleBetween)*2);
                ApplyForce(avoidance);
            }
        }
    }
    

4 个答案:

答案 0 :(得分:4)

人工智能战术(以及人类战术BTW)的很大一部分不仅是了解敌人的位置并采取行动,而且还了解和行动你的盟友。如果没有这一点,大多数最简单和最有名的演习都是不可能的(思考包围圈)。

这很大程度上归结为“如果你能避免它,就不要太靠近盟友”。

所以基本上你需要做的是以一种方式管理你的力量,它不仅被敌人吸引,而且还被一个盟友拒绝(不那么)。将它与两级导航仪相结合,你就完成了。

答案 1 :(得分:2)

大多数游戏通过让敌人相互阻挡来解决这个问题,这样他们就不会移动到同一个空间。

这可以实现为硬约束(例如,每个方格中只允许一个敌人,没有其他敌人可以进入已占用的方格)或软约束(一些隐藏的“力量”,如果他们将敌人推开彼此太靠近了。)

答案 2 :(得分:1)

中间解决方案是针对不同的AI采用不同的策略。例如一个AI住在玩家现在所在的地方,另一个住在玩家所在地的人工智能,另一个人习惯性地试图在游戏者的南边停留几个单位,除非玩家直接移动它,。 ...

这不如制定一个策略,让你的AI考虑到他们的朋友所处的位置,但是(如果写得正确),它们会有不同的行为。

答案 3 :(得分:0)

去年我不得不为我参加过的其中一门课程编写PACMAN游戏代码

我使用A-Star search algorithm作为敌人

直接运行此算法将产生完美的敌人

诀窍是为算法的结果添加一些随机性 - 让敌人犯错误#39;随着难度水平的下降(即,与算法产生的方向不同,随着难度水平降低,能量会产生更多的错误&#39;)