【问题标题】:Indicating discrete AI movement direction指示离散 AI 运动方向
【发布时间】:2013-07-18 03:13:15
【问题描述】:

我正在编写一个简单的 AI 函数,它将返回移动方向(上、下、左、右、保持静止),我的第一反应是使用简单的枚举:

public enum Direction
{
    None,
    Up,
    Down,
    Left,
    Right
}

但我也想有对角线方向,这意味着做一个更详细的枚举:

public enum Direction
{
    None,
    Up,
    UpLeft,
    Left,
    DownLeft,
    Down,
    DownRight,
    Right,
    UpRight
}

我的功能类似于:

public Direction Move()
{
    Direction moveDirection;

    // Calculate direction to move

    return moveDirection;
}

但是,我觉得必须有一种更优雅的方式来做到这一点。我想过为垂直和水平移动分别做一个[Flags] enum(基本上是两个bools),但是我不能包括None 的情况。

我的问题是:有没有更好(更简洁、更简洁、更易于修改/维护)的方式来指示我希望实体向哪个方向移动?约束是它应该是离散的(所以没有速度向量)。

【问题讨论】:

  • 北、东北、东、东南、南、西南、西、西北
  • 垂直 = 1/0/-1,水平 = 1/0/-1。它使 1 或 2 行来确定目标细胞。
  • 使用Flags你可以有none case,只要定义为= 0,其他的为2。如果你不添加任何flags(按位运算),它将是等于无。在我看来,这将是最优雅的方式。

标签: c# enums


【解决方案1】:

枚举标志可能有“无”但仍然有标志组合。实际上,通常使用标志时,您必须使用 None 来表示没有标志。

例如,

    [Flags]
    enum Direction
    {
        None = 0x0,
        East = 0x1,
        North = 0x2,
        West = 0x4,
        South = 0x8
    }

但是...无论如何,您可能只想添加 diaganol 方向...它可以让生活更轻松...

    [Flags]
    enum Direction
    {
        None = 0x0,
        East = 0x1,
        North= 0x2,
        West = 0x4,
        South = 0x8,
        NorthEast = Direction.North | Direction.East,
        NorthWest = Direction.North | Direction.West,
        SouthEast = Direction.South | Direction.East,
        SouthWest = Direction.South | Direction.West
    }

    private bool TestDirection(Direction input, Direction test)
    {
        return ((input & test) == test);        
    }

    private void SomeFunction(Direction d)
    {
        if(TestDirection(d, Direction.North) && TestDirection(d, Direction.West)) // NW
            // do something;
        if(TestDirection(d, Direction.NorthWest)) // NW
            // do something;
    }

我会说这里的第二个 if 案例更容易输入。这种方式的一件事是,如果你这样做

TestDirection(Direction.North, Direction.NorthWest)

它将返回 true...我不确定您是否想要...但您可能会。这样做可能是最简单的:

    enum Direction
    {
        None ,
        East ,
        North,
        West ,
        South,
        NorthEast, 
        NorthWest,
        SouthEast, 
        SouthWest
    }

    private void SomeFunction(Direction d)
    {
        if(d == Direction.NorthWest)
                // do something
    }

您可能会发现这比使用标志更容易。总的来说..我会说根据您的应用程序使用您认为最方便的任何一个。标志的另一个有效点是:

Direction d = Direction.North | Direction.West | Direction.East | Direction.South;

这没有多大意义......所以也许你只想使用不带标志的选项。

【讨论】:

  • 感谢您的详细解答。我还没有真正充实返回方向的 AI 函数,所以我可能会等到这个逻辑被制定出来,看看哪种方法最适合我的情况。
【解决方案2】:

嗯,我不确定你会怎么做,但是,我看到人们在人脸周围制作了一个跟踪红色框图标,我想如果你可以将红色框放在相机的中心,那么你就可以拥有相机它本身会移动,因此无论您身在何处,它始终处于中心位置……但这只是一个理论。这可能是您可以使用的算法!

【讨论】:

  • 什么?我不明白这如何适用于我的问题。
  • 而不是对着你的相机说话,你可以让它像 kinect 一样跟随你的运动,但如果那不是你想要的,你可以在 C# 中做一个 case 方法,这样你就可以只说大小写“正确”(然后有以下命令)
  • case "right" ___________AI.Speak("moving camera right") ___________Camera.move.right //我想这就是你的意思
  • 与 Kinect 无关。或者相机。我只是在询问单个 AI 方法如何将其运动决策传达给演员,两者都只是代码对象。
猜你喜欢
  • 2016-02-07
  • 1970-01-01
  • 2022-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 2017-11-14
相关资源
最近更新 更多