2

我正在编写一个简单的 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)做一个 each,但是我不能包括这个None案例。

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

4

2 回答 2

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)

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

    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;

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

于 2013-07-02T21:44:18.517 回答
0

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

于 2013-07-17T16:00:23.247 回答