From 2d234620360bcc5715e53ddbeb4259e4745e5b85 Mon Sep 17 00:00:00 2001 From: Lisa Date: Thu, 6 Jun 2019 20:41:07 +0200 Subject: [PATCH] Initial commit 9.3 --- src/main/java/_9/_3/DrunkenPirate.java | 37 ++++++++++++++++++ src/main/java/_9/_3/Observable.java | 40 +++++++++++++++++++ src/main/java/_9/_3/Ship.java | 51 +++++++++++++++++++++++++ src/main/java/_9/_3/ShipEvent.java | 19 +++++++++ src/main/java/_9/_3/ShipLog.java | 32 ++++++++++++++++ src/main/java/provided/_9/Captain.java | 22 +++++++++++ src/main/java/provided/_9/Observer.java | 10 +++++ src/main/java/provided/_9/ShipTest.java | 20 ++++++++++ 8 files changed, 231 insertions(+) create mode 100644 src/main/java/_9/_3/DrunkenPirate.java create mode 100644 src/main/java/_9/_3/Observable.java create mode 100644 src/main/java/_9/_3/Ship.java create mode 100644 src/main/java/_9/_3/ShipEvent.java create mode 100644 src/main/java/_9/_3/ShipLog.java create mode 100644 src/main/java/provided/_9/Captain.java create mode 100644 src/main/java/provided/_9/Observer.java create mode 100644 src/main/java/provided/_9/ShipTest.java diff --git a/src/main/java/_9/_3/DrunkenPirate.java b/src/main/java/_9/_3/DrunkenPirate.java new file mode 100644 index 0000000..759858e --- /dev/null +++ b/src/main/java/_9/_3/DrunkenPirate.java @@ -0,0 +1,37 @@ +package _9._3; + +import provided._9.Captain; + +public class DrunkenPirate extends Captain { + + public DrunkenPirate(Ship ship) { + super(ship); + } + + @Override + public void commandShip() { + ShipEvent event = ShipEvent.getRandomShipEvent(); + System.out.println(event); + + switch (event) { + case SET_SAILS: + this.ship.setSails(); + break; + case STRIKE_SAILS: + this.ship.strikeSails(); + break; + case LOAD_CANNONS: + this.ship.loadCannons(); + break; + case FIRE_CANNONS: + this.ship.fireCannons(); + break; + case TURN_LEFT: + this.ship.turnLeft(); + break; + case TURN_RIGHT: + this.ship.turnRight(); + break; + } + } +} diff --git a/src/main/java/_9/_3/Observable.java b/src/main/java/_9/_3/Observable.java new file mode 100644 index 0000000..dbce718 --- /dev/null +++ b/src/main/java/_9/_3/Observable.java @@ -0,0 +1,40 @@ +package _9._3; + +import provided._9.Observer; + +import java.util.ArrayList; +import java.util.List; + +public abstract class Observable { + private List observers = new ArrayList<>(); + private boolean changed = false; + + public void addObserver(Observer o) { + this.observers.add(o); + } + + public void removeObserver(Observer o) { + this.observers.remove(o); + } + + protected void setChanged() { + changed = true; + } + + private void clearChanged() { + changed = false; + } + + public boolean isChanged() { + return changed; + } + + public void notifyObservers(ShipEvent what) { + if (this.isChanged()) { + for (Observer observer : observers) { + observer.update(this, what); + } + this.clearChanged(); + } + } +} diff --git a/src/main/java/_9/_3/Ship.java b/src/main/java/_9/_3/Ship.java new file mode 100644 index 0000000..ded1cc7 --- /dev/null +++ b/src/main/java/_9/_3/Ship.java @@ -0,0 +1,51 @@ +package _9._3; + +public class Ship extends Observable { + private boolean sailsSet = false; + private boolean cannonsLoaded = false; + private int heading = 0; + + public void setSails() { + if (!sailsSet) { + sailsSet = true; + this.setChanged(); + notifyObservers(ShipEvent.SET_SAILS); + } + } + + public void strikeSails() { + if (sailsSet) { + sailsSet = false; + this.setChanged(); + notifyObservers(ShipEvent.STRIKE_SAILS); + } + } + + public void loadCannons() { + if (!cannonsLoaded) { + cannonsLoaded = true; + this.setChanged(); + notifyObservers(ShipEvent.LOAD_CANNONS); + } + } + + public void fireCannons() { + if (cannonsLoaded) { + cannonsLoaded = false; + this.setChanged(); + notifyObservers(ShipEvent.FIRE_CANNONS); + } + } + + public void turnLeft() { + heading = (heading - 90) % 180; + this.setChanged(); + notifyObservers(ShipEvent.TURN_LEFT); + } + + public void turnRight() { + heading = (heading + 90) % 360; + this.setChanged(); + notifyObservers(ShipEvent.TURN_RIGHT); + } +} diff --git a/src/main/java/_9/_3/ShipEvent.java b/src/main/java/_9/_3/ShipEvent.java new file mode 100644 index 0000000..5d1538a --- /dev/null +++ b/src/main/java/_9/_3/ShipEvent.java @@ -0,0 +1,19 @@ +package _9._3; + +import java.util.Random; + +public enum ShipEvent { + + NO_EVENT, + SET_SAILS, + STRIKE_SAILS, + LOAD_CANNONS, + FIRE_CANNONS, + TURN_LEFT, + TURN_RIGHT; + + public static ShipEvent getRandomShipEvent() { + Random random = new Random(); + return values()[random.nextInt(values().length)]; + } +} diff --git a/src/main/java/_9/_3/ShipLog.java b/src/main/java/_9/_3/ShipLog.java new file mode 100644 index 0000000..0e35c8f --- /dev/null +++ b/src/main/java/_9/_3/ShipLog.java @@ -0,0 +1,32 @@ +package _9._3; + +import provided._9.Observer; + +public class ShipLog implements Observer { + private int heading = 0; + @Override + public void update(Observable who, ShipEvent what) { + switch (what) { + case SET_SAILS: + System.out.println("Sails set."); + break; + case STRIKE_SAILS: + System.out.println("Sails struck."); + break; + case LOAD_CANNONS: + System.out.println("Cannons loaded."); + break; + case FIRE_CANNONS: + System.out.println("Cannons fired."); + break; + case TURN_LEFT: + heading = (heading - 90) % 180; + System.out.println("Turned left. New heading " + heading + " degrees."); + break; + case TURN_RIGHT: + heading = (heading + 90) % 180; + System.out.println("Turned right. New heading " + heading + " degrees."); + break; + } + } +} diff --git a/src/main/java/provided/_9/Captain.java b/src/main/java/provided/_9/Captain.java new file mode 100644 index 0000000..e77f50c --- /dev/null +++ b/src/main/java/provided/_9/Captain.java @@ -0,0 +1,22 @@ +package provided._9; + +import _9._3.Ship; + +public abstract class Captain { + + protected Ship ship; + + public Captain(Ship ship) { + super(); + this.ship = ship; + } + + /** + * Gibt ein Kommando an das Schiff. + * Dieses Kommando wird erst auf der Konsole ausgegeben + * und anschliessend wird die entsprechende Methode des + * Schiffs aufgerufen. + */ + public abstract void commandShip(); + +} diff --git a/src/main/java/provided/_9/Observer.java b/src/main/java/provided/_9/Observer.java new file mode 100644 index 0000000..3b755d0 --- /dev/null +++ b/src/main/java/provided/_9/Observer.java @@ -0,0 +1,10 @@ +package provided._9; + +import _9._3.Observable; +import _9._3.ShipEvent; + +public interface Observer { + + void update(Observable who, ShipEvent what); + +} diff --git a/src/main/java/provided/_9/ShipTest.java b/src/main/java/provided/_9/ShipTest.java new file mode 100644 index 0000000..edfa105 --- /dev/null +++ b/src/main/java/provided/_9/ShipTest.java @@ -0,0 +1,20 @@ +package provided._9; + +import _9._3.DrunkenPirate; +import _9._3.Ship; +import _9._3.ShipLog; + +public class ShipTest { + + private static final int MAX_COMMANDS = 50; + + public static void main(String[] args) { + Ship blackPearl = new Ship(); + blackPearl.addObserver(new ShipLog()); + Captain sparrow = new DrunkenPirate(blackPearl); + for (int i = 0; i < MAX_COMMANDS; i++) { + sparrow.commandShip(); + } + } + +}