我正在从Java转向C#,想知道是否可以实现这一点?我的意思是创建一个二维数组,其类型为
Enum {north, south, east, west}
。这样我就可以调用map[1,2].north
来查看地图上该单元格是否有北墙。抱歉代码比较简陋,我目前无法使用电脑,所以有点抽象。关于枚举:
enum Dirs { North, South, East, West }
只需声明一个数组即可:
Dirs[,] dirs = new Dirs[10, 10];
如果您需要每个单元格能够拥有多面墙壁,请使用[Flags]
属性标记枚举,并将值设为2的幂次方:
[Flags]
enum Dirs { North = 1 << 0, South = 1 << 1, East = 1 << 2, West = 1 << 3 }
dirs[1, 2] = Dirs.North | Dirs.East;
正如@Scott Chamberlain在他的评论中提到的那样,要检查一个方向,您可以这样做:
bool hasNorthWall = dirs[1, 2].HasFlag(Dirs.North);
Flags
属性不会更改枚举成员的值。如果您使用它,您需要明确设置值为 2 的幂,否则您将得到一些不良行为。 - Kylevar hasNorthWall = dirs[1,2].HasFlag(Dirs.North);
- Scott Chamberlain[Flags] enum Dirs { North = 1<<0, South = 1<<1, East = 1<<2, West = 1<<3 }
。当您开始进入使用许多可能的标志值的枚举时,这使得阅读变得更加容易,例如 SomeFlag = 1048576
vs SomeFlag = 1<<20
。 - Scott Chamberlainprivate EnumName[,] arrayName;
这是使用 enum
声明和测试墙的方式。
namespace ConsoleApplication1
{
[Flags]
enum Wall
{
North = 1,
South = 2,
East = 4,
West = 8
}
static class Program
{
static void Main(string[] args)
{
int grid = 10;
var map=new Wall[grid, grid];
// fill in values here ...
if(map[1, 2].HasFlag(Wall.North))
{
// cell (2, 3) has a wall in the north direction
}
}
}
}