C# 指示离散AI运动方向
我正在编写一个简单的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
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方法如何将其移动决策传达给参与者,两者都只是编码对象。