2010-11-25 14 views
14

Estoy diseñando un juego de aventuras basado en texto para el progreso de la escuela. Tengo cada "nivel" configurado como una clase, y cada área explorable (nodo) como un método dentro de la clase apropiada.Java - Crear una matriz de métodos

Lo que me molesta es el código para pasar de un nodo a otro. Como cada nodo está conectado a otros cuatro nodos, tengo que repetir un bloque de código extremadamente similar en cada método.

Lo que yo prefiero que hacer es incluir una serie de métodos al comienzo de cada nodo, así:

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

Y luego enviar esa matriz a un método genérico, y tienen que enviar al jugador al nodo derecho:

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

He simplificado mi código, pero esa es la idea general. es posible?

+4

le recomiendo que reconsidere su diseño. Usar la reflexión sin necesidades reales no es un buen hábito. – khachik

+0

¿Cuáles son las firmas de método de 'one()', 'two()' etc.? – missingfaktor

Respuesta

41

Siempre que piense en el puntero a la función, traduzca a Java utilizando el patrón del Adaptador (o una variación). Sería algo así:

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(); 
    } 
} 
+0

Bien, voy a intentar esto. ¡Gracias por la sugerencia! –

+0

funcionó perfectamente; ¡Muchas gracias por tu ayuda! –

+0

Tenga en cuenta que este ejemplo crea 4 'MoveActions' por instancia' Node'. Al replantear un poco esta implementación, podría hacer que los objetos 'MoveAction' sean compartibles para todas las instancias.En este caso, implicaría cambiar 'move()' a 'move (Node)', implementar los 4 'MoveAction' como clases estáticas, y pasar' this' en la llamada a 'move()'. – gpeche

6

Simplemente haga que sus nodos sean objetos que se adhieran a la misma interfaz, entonces podrá llamar a sus métodos de manera confiable.

0

Intente pensar en soluciones sin reflexión. Puede ser enums, por ejemplo.

2

Su diseño tiene defectos fundamentales. El diseño OO normal tendría cada "nivel" como un objeto (de clase 'nivel' o algo así). cada "área explorable" también sería un objeto, contenido dentro del objeto de nivel, tal vez de la clase ExplorableArea. Las "áreas explorables" pueden ser de diferentes tipos, en cuyo caso las haces diferentes subclases de ExplorableArea.

+0

Tienes razón; no es la mejor estructura que podría haber surgido. Estoy en medio de un rediseño, pero quería resolver este problema primero –

4

Dado que Java no tiene el concepto de métodos como entidades de primera clase, esto solo es posible mediante la reflexión, que es dolorosa y propensa a errores.

La mejor aproximación sería probablemente para tener los niveles como enumeraciones con una implementación por instancia de un método:

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(); 
} 

Sin embargo, esto es un poco de un abuso del concepto de enumeración. No lo usaría para un proyecto serio.

+0

Aún así, lo intentaré. ¡Gracias por el consejo! –

+0

Lo tengo trabajando; muchas gracias –

Cuestiones relacionadas