Pátý domácí úkol

Tento a příští domácí úkol spolu budou volně spojeny, jejich společným tématem je herní engine.

Hlavními rozhraními tohoto úkolu jsou rozhraní Movable, resp. Actuator: rozhraní Movable reprezentuje objekty, které se mohou pohybovat, a rozhraní Actuator reprezentuje objekty, které hýbou nějakými jinými objekty.

interface Movable {
    /** Vrati aktualni polohu. */
    Pair<Integer, Integer> getPosition();
 
    /** Pohne timto objektem o dx pixelu doprava a dy dolu. */
    void move(int dx, int dy);
}
 
interface Actuator {
    /** Pohne objektem v parametru. */
    void actuate(Movable movable);
}
 
/** Instance tridy Pair reprezentuji dvojice hodnot. */
class Pair<A, B> {
    final A first;
    final B second;
 
    public Pair(A first, B second) {
        this.first = first;
        this.second = second;
    }
}

Vaším úkolem je dopsat kód tříd Up, Down, Left, Right, ParallellyComposingActuator a AmplifyingActuator podle následující specifikace:

class Up implements Actuator {
 
    @Override
    public void actuate(Movable movable) {
 
    }
}
 
class Down implements Actuator {
 
    @Override
    public void actuate(Movable movable) {
 
    }
}
 
class Left implements Actuator {
 
    @Override
    public void actuate(Movable movable) {
 
    }
}
 
class Right implements Actuator {
 
    @Override
    public void actuate(Movable movable) {
 
    }
}
 
class ParallellyComposingActuator implements Actuator {
 
    public ParallellyComposingActuator(ImmutableList<Actuator> motors) {
 
    }
 
    @Override
    public void actuate(Movable movable) {
 
    }
}
 
class AmplifyingActuator implements Actuator {
 
    public AmplifyingActuator(Actuator motor, int factor) {
 
    }
 
    @Override
    public void actuate(Movable movable) {
 
    }
}

Chování třídy SequentiallyComposingActuator je malinko složitější. Tato třída v konstruktoru dostane (nekonečný) seznam dvojic (predikát, aktuátor). Aktuátor z první dvojice vrácené iterátorem používá pro pohyb zadaného objektu tak dlouho, dokud první predikát na zadaném objektu vrací true. Poté přejde na druhou dvojici, pak na třetí atd.

class SequentiallyComposingActuator implements Actuator {
 
    public SequentiallyComposingActuator(Iterable<Pair<Predicate<Movable>, Actuator>> iterable) {
 
    }
 
    @Override
    public void actuate(Movable movable) {
 
    }
}

Nakonec naimplementujte metody Homework5.getFirstActuator, Homework5.getSecondActuator a Homework5.getThirdActuator:

class Keyboard {
    static boolean leftArrowPressedDown() {
        /* kod */
    }
 
    static boolean rightArrowPressedDown() {
        /* kod */
    }
}
 
class Homework5 {
    static Actuator getFirstActuator() {
 
    }
 
    static Actuator getSecondActuator() {
 
    }
 
    static Actuator getThirdActuator(final Actuator firstActuator, Actuator secondActuator) {
 
    }
}

Odevzdávaný kód (tzn. třídy Up, Down, Left, Right, ParallellyComposingActuator, AmplifyingActuator, SequentiallyComposingActuator a Homework5) uložte do svého repozitáře do adresáře homeworks/Homework5.java. Třídu Keyboard neodevzdávejte, dodá si ji testovací systém. Pro tento úkol potřebujete knihovnu Guava. Dokumentaci k Predicate naleznete zde. Termín odevzdání je 22. 5. 2016 ve 24:00.

~~DISCUSSION:off~~