Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java - Creating an array of methods

I'm designing a text-based adventure game for a school progress. I have each "level" set up as a class, and each explorable area (node) as a method within the appropriate class.

What's messing with me is the code to move from one node to another. Because each node is connected to up to four other nodes, I have to repeat an extremely similar block of code in each method.

What I'd prefer to do is include an array of methods at the beginning of each node, like this:

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

And then send that array to a generic method, and have it send the player to the right node:

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

I simplified my code, but that's the general idea. Is this possible?

like image 496
Jason Baker Avatar asked Nov 25 '10 20:11

Jason Baker


3 Answers

Whenever you think of pointer-to-function, you translate to Java by using the Adapter pattern (or a variation). It would be something like this:

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();
    }
}
like image 86
gpeche Avatar answered Nov 12 '22 11:11

gpeche


Just have your nodes be objects that all adhere to the same interface, then you'll be able to call their methods reliably.

like image 25
Fredrick Pennachi Avatar answered Nov 12 '22 11:11

Fredrick Pennachi


Since Java does not have the concept of methods as first-class entities, this is only possible using reflection, which is painful and error-prone.

The best approximation would probably be to have the levels as enums with a per-instance implementation of a method:

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

However, this is a bit of an abuse of the enum concept. I wouldn't use it for a serious project.

like image 5
Michael Borgwardt Avatar answered Nov 12 '22 11:11

Michael Borgwardt