Java – 创建方法数组

我正在为学校的进步设计一个基于文本的冒险游戏。 我将每个“级别”设置为一个类,并将每个可探测区域(节点)设置为相应类中的方法。

让我感到困惑的是从一个节点移动到另一个节点的代码。 因为每个节点最多连接四个其他节点,所以我必须在每个方法中重复一个非常相似的代码块。

我更喜欢做的是在每个节点的开头包含一组方法,如下所示:

public static void zero() { ... adjacentNodes[] = {one(), two(), three(), four()}; } 

然后将该数组发送到通用方法,并让它将播放器发送到正确的节点:

 public static void move(...[] adjacentNodes, int index) { adjacentNodes[index]; } 

我简化了我的代码,但这是一般的想法。 这可能吗?

无论何时考虑指向函数的指针,都可以使用适配器模式(或变体)转换为Java。 它会是这样的:

 public class Node { ... public void goNorth() { ... } public void goSouth() { ... } public void goEast() { ... } public void goWest() { ... } interface MoveAction { void move(); } private MoveAction[] moveActions = new MoveAction[] { new MoveAction() { public void move() { goNorth(); } }, new MoveAction() { public void move() { goSouth(); } }, new MoveAction() { public void move() { goEast(); } }, new MoveAction() { public void move() { goWest(); } }, }; public void move(int index) { moveActions[index].move(); } } 

只需让你的节点成为所有符合相同界面的对象,然后你就可以可靠地调用它们的方法。

由于Java没有将方法的概念作为第一类实体,因此只能使用reflection,这很痛苦且容易出错。

最好的近似可能是将级别设置为具有方法的每个实例实现的枚举:

 public enum Level1 implements Explorable{ ROOM1 { public void explore() { // fight monster } }, ROOM2 { public void explore() { // solve riddle } }, ROOM3 { public void explore() { // rescue maiden } }; } public interface Explorable{ public abstract void explore(); } public static void move(Explorable[] adjacentNodes, int index) { adjacentNodes[index].explore(); } 

然而,这有点滥用枚举概念。 我不会将它用于一个严肃的项目。

您的设计存在根本缺陷。 正常的OO设计会使每个“级别”成为一个对象(类’级别’或类似的东西)。 每个’可探索区域’也将是一个对象,包含在关卡对象中 – 可能是ExplorableArea类。 “可探索区域”可以是不同类型,在这种情况下,您可以使它们成为ExplorableArea的不同子类。

尝试思考没有反思的解决方案。 例如,它可以是枚举 。

您可以使用Reflection类创建方法数组。 http://java.sun.com/developer/technicalArticles/ALT/Reflection/