如何将Enum与其相反的值相关联,如在主要方向(南北,东西等)?

我还在为我的迷宫游戏制作我的Cell课程。 在另一个线程的帮助之后,有人建议我使用EnumMap作为我的墙/邻居,这到目前为止工作得很好。

这是我到目前为止:

enum Dir { NORTH, SOUTH, EAST, WEST } class Cell { public Map neighbors = Collections .synchronizedMap(new EnumMap(Dir.class)); public Map walls = Collections .synchronizedMap(new EnumMap(Dir.class)); public boolean Visited; public Cell() { Visited = false; for (Dir direction : Dir.values()) { walls.put(direction, true); } } // Randomly select an unvisited neighbor and tear down the walls // between this cell and that neighbor. public Cell removeRandomWall() { List unvisitedDirections = new ArrayList(); for (Dir direction : neighbors.keySet()) { if (!neighbors.get(direction).Visited) unvisitedDirections.add(direction); } Random randGen = new Random(); Dir randDir = unvisitedDirections.get(randGen .nextInt(unvisitedDirections.size())); Cell randomNeighbor = neighbors.get(randDir); // Tear down wall in this cell walls.put(randDir, false); // Tear down opposite wall in neighbor cell randomNeighbor.walls.put(randDir, false); // <--- instead of randDir, it needs to be it's opposite. return randomNeighbor; } } 

如果你看那里的最后一条评论,我首先拆掉我当前单元格中的北墙。 然后我带我的北邻居,现在我必须拆掉我的南墙,所以两个牢房之间的墙壁已被拆除。

什么是一个简单的方法来扩展我的枚举,所以我可以给它一个方向,它回到我的对面?

我认为最简单的方法就是添加一个方法。 请注意,只有当枚举常量的数量不会随时间变化时,这才有效。

 enum Dir { NORTH, SOUTH, EAST, WEST; public Dir opposite() { switch(this) { case NORTH: return Dir.SOUTH; case SOUTH: return Dir.NORTH; case EAST: return Dir.WEST; case WEST: return Dir.EAST; default: throw new IllegalStateException("This should never happen: " + this + " has no opposite."); } } } 

然后,在您的代码中,您可以这样做:

 randomNeighbor.walls.put(randDir.opposite(), false); 

还有另一种没有开关/盒子的方式,或者必须存储状态:

 public enum Dir { NORTH { @Override public Dir opposite() { return SOUTH; }}, EAST { @Override public Dir opposite() { return WEST; }}, SOUTH { @Override public Dir opposite() { return NORTH; }}, WEST { @Override public Dir opposite() { return EAST; }}, ; abstract public Dir opposite(); } 

你可以尝试这个,关于这一点的“好”的事情是你可以实际上将枚举索引像数组,有点……并且由于我们正在处理对立面,因为总是有对,代码支持它只要您将新值添加到最后,这样您就不会搞砸索引。

 enum Directions { NORTH(1), SOUTH(0), WEST(3), EAST(2); private final int opposite; Directions(int opposite) { this.opposite = opposite; } Directions opposite() { return Directions.values()[this.opposite]; } } 

例如,如果您想添加更多路线,您只需添加以下内容:

 NORTH_WEST(7), NORTH_EAST(6), SOUTH_WEST(5), SOUTH_EAST(4) 

简单。 🙂

 public enum Direction { NORTH,EAST,SOUTH,WEST; public Direction opposite() { return Direction.values()[ (this.ordinal() + 2) & 3 ]; } }