C# 指示离散AI运动方向

C# 指示离散AI运动方向,c#,enums,C#,Enums,我正在编写一个简单的AI函数,它将返回移动方向(上、下、左、右、静止),我的第一反应是使用一个简单的枚举: public enum Direction { None, Up, Down, Left, Right } 但我也希望有对角线方向,这意味着要进行更详细的枚举: public enum Direction { None, Up, UpLeft, Left, DownLeft, Down, Do

我正在编写一个简单的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;
}
然而,我觉得必须有一种更优雅的方式来做到这一点。我曾想过为垂直和水平移动(基本上是两个
bool
s)分别执行
[Flags]enum
,但是我不能包含
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)
它会变成现实。。。我不确定你是不是想要。。。但你可以。这样做可能最简单:

    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;

这没有多大意义。。。因此,也许你只想使用不带标志的选项。

嗯,我不确定你会怎么做,但是,我看到人们在人脸周围制作了一个跟踪红框图标,我想如果你可以在相机中居中放置红框,那么你可以让相机本身移动,使其始终居中,无论你在哪里。。。但这只是一个理论。这可能就是你可以使用的算法

北,东北,东,东南,南,西南,西,西北垂直=1/0/-1,水平=1/0/-1。它使用1或2行来确定目标单元格。使用标志,您可以使用none大小写,只需将其定义为
=0
,其他的定义为因子2。如果不添加任何标志(使用按位操作),则它将等于无。我认为这是最优雅的方式。谢谢你详细的回答。我还没有真正充实出返回方向的AI函数,所以我可能会等到逻辑得到解决,看看哪种方法最适合我的情况。什么?我看不出这对我的问题有什么影响。你不需要对着你的相机说话,你可以让它像kinect一样跟随你的动作,但如果这不是你想要的,你可以用C#做一个case方法,这样你就可以说case“right”(然后使用下面的命令)case“right”_u___________;AI.说话(“向右移动摄影机”)_________________。或者照相机。我只是想问一个AI方法如何将其移动决策传达给参与者,两者都只是编码对象。