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:

  • instance třídy Up při jednom volání metody actuate pohne zadaným objektem o jeden pixel nahoru,
  • instance třídy Down pohne zadaným objektem o jeden pixel dolů,
  • instance třídy Left pohne zadaným objektem o jeden pixel doleva,
  • instance třídy Right pohne zadaným objektem o jeden pixel doprava,
  • instance třídy ParallellyComposingActuator sečte pohyby všech aktuátorů zadaných v konstruktoru do jednoho a
  • instance třídy AmplifyingActuator zopakuje pohyb aktuátorem zadaným v konstruktoru factor-krát.

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:

  • Homework5.getFirstActuator vrátí aktuátor, který zadaným objektem pohne o jeden pixel doprava a o jeden pixel nahoru,
  • Homework5.getSecondActuator vrátí aktuátor, který zadaným objektem pohne o jeden pixel doleva, pokud uživatel stiskl klávesu doleva (indikováno metodou Keyboard.leftArrowPressedDown), o jeden pixel doprava, pokud uživatel stiskl klávesu doprava (indikováno metodou Keyboard.rightArrowPressedDown) a nepohne nikam, pokud uživatel nestiskl ani jednu z kláves nebo stiskl obě naráz,
  • Homework5.getThirdActuator(Actuator firstActuator, Actuator secondActuator) vrátí aktuátor, který pro pohyb střídá dva zadané aktuátory - nejprve desetkrát použije firstActuator, potom dvacetkrát secondActuator, pak opět desetkrát firstActuator atd.

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~~

courses/b6b36omo/en/hw/07/start.txt · Last modified: 2018/10/03 11:13 (external edit)