首先要确定什么是有效方向:它是来自固定列表还是自由格式的文本?最简单的解决方案是具有四个基本方向。有人建议将其作为int数组来进行。在C / C ++ /
C#中,这可能是一个有效的解决方案(所有枚举都只是int常量),但是在Java中没有理由这样做。
在Java中,你可以使用(类型安全)枚举这亦可以有状态和行为,和使用
EnumMap,这是
非常
有效的。在内部,它只是一个按枚举序号索引的数组。您可能会争辩说那和int数组有什么区别?答案是,内部的int数组
EnumMap是类型安全随机访问集合的内部实现细节。
如果允许自由格式的文本作为出口方向,则您的结构将如下所示:
Map<String, Direction> exits;
我不建议这样做。我建议列举可能的方向:
public enum Direction { NORTH("north", "n"), NORTHWEST("northwest", "nw"), ... IN("in"), OUT("out"); private final static Map<String, Direction> INSTANCES; static { Map<String, Direction> map = new HashMap<String, Direction>(); for (Direction direction : values()) { for (String exit : direction.exits) { if (map.containsKey(exit)) { throw new IllegalStateException("Exit '" + exit + "' duplicated"); } map.put(exit, direction); } } INSTANCES = Collections.unmodifiableMap(map); } private final List<String> exits; Direction(String... exits) { this.exits = Collections.unmodifiableList(Arrays.asList(exits)); } public List<String> getExits() { return exits; } public String getName() { return exits.get(0); } public static Map<String, Direction> getInstances() { return INSTANCES; } public static Direction getDirection(String exit) { return INSTANCES.get(exit); }}然后将其存储在:
private final Map<Direction, Exit> exits = new EnumMap<Direction, Exit>(Direction.class);
这为您提供了类型安全性,性能和可扩展性。
考虑这一点的第一种方法是使用地图:
Map<String, Room> exits;
其中键是自由方向(北,东,南等)。
下一个问题:什么是出口?在最简单的情况下,退出就是您要进入的房间,然后您开始问各种问题,例如:
- 玩家可以看到出口吗?
- 出口是关闭还是打开?
- 出口可以关闭,打开,锁定,解锁,推开等吗?
- 出口的使用可以编程吗(例如,您必须携带一定的护身符)?
- 您最终可以在程序化的地方进行编程(例如,您可能跌入陷阱并完全落入其他地方)吗?
- 使用出口是否可以触发其他动作(例如,发出警报)?
有必要考虑文本冒险游戏的界面。播放器以以下形式键入命令:
Verb [[preposition1] object1 [[preposition2] object2]]
至少那是一种可能性。示例包括:
- 坐(动词=坐);
- 开门(动词=打开,object1 =门)
- 看书
- 用铁钥匙锁住箱子(动词=锁,对象1 =箱子,介词2 =带有,对象2 =铁钥匙);
- 向兽人投掷火球;
- 等等
因此,以上内容涵盖了相当全面的行为。所有这些的要点是:
- 出口将支持许多动词或命令(例如,您可以打开/关闭门,但不能打开/关闭通道);
- 怪物和物品也将支持命令(可以“挥动”魔杖,可以“击打”兽人);
- 出口,怪物和物品就是所有类型的对象(游戏中可以通过某种方式进行交互的事物)。
所以:
public enum Command { LOOK, HIT, WAVE, OPEN, CLOSE, ... };(毫无疑问将与这些实例相关联的行为)并且:
public class GameObject { boolean isSupported(Command command); boolean trigger(Command command);}public class Exit extends GameObject { ...}游戏对象也可能具有其他状态,例如是否可以看到它们。有趣的是,Direction枚举实例也可以说是Commands,它再次更改了抽象。
因此,希望可以帮助您指出正确的方向。没有抽象的“正确”答案,因为这完全取决于您需要建模和支持的内容。希望这可以给您一个起点。



