diff --git a/README.md b/README.md index bb810ae..89a3f1c 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ **ИСУ:** 408657 -**Вариант:** 528475.3 +**Вариант:** ~528475.3 _Так как на se.ifmo сбросились варианты я взял текст напрямую из сказки._ @@ -15,6 +15,23 @@ _Так как на se.ifmo сбросились варианты я взял т > распахнулась и ворвался Карлсон, тоже злой как чёрт. Он подлетел к Фрекен Бок и топнул ногой об пол. ## Вывод программы - +``` +Кралсон дрогнул губой +Кралсон надулся +Он сделал шаг к плита +Предмет тефтелька принадлежит Фрекен Бок, а не Кралсон +Вот этого ему не следовало делать +Фрекен Бок взревела от бешенства +Она кинулась к Кралсон +Она схватила Кралсон за шиворот +Она вытолкнула Кралсон за Дверь +Малыш был просто в отчаянии +Он ничего не сказал +Дверь распахнулась +Он сделал шаг к Дверь +Кралсон злой как чёрт +Он подлетел к Фрекен Бок +Кралсон топнул ногой +``` ## Структура проекта diff --git a/src/Characters/Character.java b/src/Characters/Character.java index e057508..6ebba26 100644 --- a/src/Characters/Character.java +++ b/src/Characters/Character.java @@ -6,6 +6,23 @@ import Items.Item; import java.util.Objects; public abstract class Character extends Entity implements IMovable, IFeelable, ICanTake { + + public enum Gender { + MAN("Он"), + WOMAN("Она"); + + private final String gender; + + Gender(String gender) { + this.gender = gender; + } + + @Override + public String toString() { + return gender; + } + } + private final Gender gender; private Entity position; private String currentState = ""; @@ -26,29 +43,32 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I return this.gender.toString(); } - public abstract void setFeel(Feels feel); + public final void setFeel(Feels feel) { + this.feel = feel; + this.setState(String.format("%s %s", this.getName(), feel)); + } public abstract void moveTo(Entity obj); public abstract void grab(Item obj) throws OwnershipException; - public Item getItemInHand() { + public final Item getItemInHand() { return this.itemInHand; } - public Entity getPosition() { + public final Entity getPosition() { return this.position; } - protected void setPosition(Entity obj) { + protected final void setPosition(Entity obj) { this.position = obj; } - public String getState() { + public final String getState() { return this.currentState; } - protected void setState(String state) { + protected final void setState(String state) { this.currentState = state; } @@ -57,7 +77,6 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I return this.getName(); } - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/Characters/Feels.java b/src/Characters/Feels.java index f624050..4a0d236 100644 --- a/src/Characters/Feels.java +++ b/src/Characters/Feels.java @@ -1,11 +1,12 @@ package Characters; public enum Feels { - ANGRY("злиться"), + ANGRY("злой как чёрт"), SCARY("дрогнул губой"), SAD("надулся"), RAGE("взревела от бешенства"), - NORMAL("нормально"); + NORMAL("нормально"), + DEAD_INSIDE("был просто в отчаянии"); private final String feel; diff --git a/src/Characters/FrenBok.java b/src/Characters/FrenBok.java index 349ec87..fb35296 100644 --- a/src/Characters/FrenBok.java +++ b/src/Characters/FrenBok.java @@ -10,12 +10,6 @@ public class FrenBok extends Character { super("Фрекен Бок", Gender.WOMAN); } - @Override - public void setFeel(Feels feel) { - this.feel = feel; - this.setState(String.format("%s %s", this.getName(), feel)); - } - @Override public void moveTo(Entity obj) { this.setPosition(obj); @@ -23,9 +17,12 @@ public class FrenBok extends Character { } @Override - public void grab(Item obj) { + public void grab(Item obj) throws OwnershipException { this.itemInHand = obj; - this.setState(String.format("%s взяла %s", this.getGender(), obj.getName())); + this.setState(String.format("%s взяла %s", this.getGender(), obj)); + if (obj.getOwner() != this && obj.getOwner() != null) { + throw new OwnershipException(String.format("Предмет %s принадлежит %s, а не %s", obj.getName(), obj.getOwner().getName(), this.getName())); + } } public void grabCharacter(IGrabbable character) { diff --git a/src/Characters/Gender.java b/src/Characters/Gender.java deleted file mode 100644 index ecae76d..0000000 --- a/src/Characters/Gender.java +++ /dev/null @@ -1,17 +0,0 @@ -package Characters; - -public enum Gender { - MAN("Он"), - WOMAN("Она"); - - private final String gender; - - Gender(String gender) { - this.gender = gender; - } - - @Override - public String toString() { - return gender; - } -} diff --git a/src/Characters/IFlyable.java b/src/Characters/IFlyable.java new file mode 100644 index 0000000..2467ed0 --- /dev/null +++ b/src/Characters/IFlyable.java @@ -0,0 +1,7 @@ +package Characters; + +import Entity.*; + +public interface IFlyable { + void flyTo(Entity obj); +} diff --git a/src/Characters/Karlson.java b/src/Characters/Karlson.java index ba5ec5d..ab852b1 100644 --- a/src/Characters/Karlson.java +++ b/src/Characters/Karlson.java @@ -4,7 +4,7 @@ import Entity.Entity; import Items.Container; import Items.Item; -public class Karlson extends Character implements IGrabbable { +public class Karlson extends Character implements IGrabbable, IFlyable { public Karlson() { super("Кралсон", Gender.MAN); } @@ -14,18 +14,17 @@ public class Karlson extends Character implements IGrabbable { this.feel = feel; } - @Override - public void setFeel(Feels feel) { - this.feel = feel; - this.setState(String.format("%s %s", this.getName(), feel)); - } - @Override public void moveTo(Entity obj) { this.setPosition(obj); this.setState(String.format("%s сделал шаг к %s", this.getGender(), obj)); } + public void flyTo(Entity obj) { + this.moveTo(obj); + this.setState(String.format("%s подлетел к %s", this.getGender(), obj)); + } + @Override public void grab(Item obj) throws OwnershipException { this.itemInHand = obj; @@ -44,4 +43,8 @@ public class Karlson extends Character implements IGrabbable { public String getGrabbablePart() { return "шиворот"; } + + public void stomp() { + this.setState(String.format("%s топнул ногой", this.getName())); + } } diff --git a/src/Characters/Malysh.java b/src/Characters/Malysh.java new file mode 100644 index 0000000..00cd6f2 --- /dev/null +++ b/src/Characters/Malysh.java @@ -0,0 +1,33 @@ +package Characters; + +import Entity.Entity; +import Items.Item; + +public class Malysh extends Character { + public Malysh() { + super("Малыш", Gender.MAN ,Feels.NORMAL); + } + + public void speak(String speech) { + if (speech == null) { + this.setState(String.format("%s ничего не сказал", this.getGender())); + return; + } + this.setState(String.format("%s сказал: \"%s\"", this.getName(), speech)); + } + + @Override + public void moveTo(Entity obj) { + this.setPosition(obj); + this.setState(String.format("%s подошёл к %s", this.getGender(), obj)); + } + + @Override + public void grab(Item obj) throws OwnershipException { + this.itemInHand = obj; + this.setState(String.format("%s присвоил себе %s", this.getGender(), obj)); + if (obj.getOwner() != this && obj.getOwner() != null) { + throw new OwnershipException(String.format("Предмет %s принадлежит %s, а не %s", obj.getName(), obj.getOwner().getName(), this.getName())); + } + } +} diff --git a/src/Items/Door.java b/src/Items/Door.java new file mode 100644 index 0000000..977d7ac --- /dev/null +++ b/src/Items/Door.java @@ -0,0 +1,18 @@ +package Items; + +public class Door extends Item { + private boolean isOpen = false; + + public Door() { + super("Дверь"); + } + + public void openDoor() { + this.isOpen = true; + System.out.println("Дверь закрылась"); + } + public void closeDoor() { + this.isOpen = false; + System.out.println("Дверь распахнулась"); + } +} diff --git a/src/StoryTeller/StoryTeller.java b/src/StoryTeller/StoryTeller.java index 548181f..a3cbe91 100644 --- a/src/StoryTeller/StoryTeller.java +++ b/src/StoryTeller/StoryTeller.java @@ -1,22 +1,22 @@ package StoryTeller; -import Characters.Feels; -import Characters.FrenBok; -import Characters.Karlson; -import Characters.OwnershipException; +import Characters.*; +import Characters.Character; import Items.Container; +import Items.Door; import Items.Item; public class StoryTeller { // Персонажи private final Karlson karlson = new Karlson(); private final FrenBok frenBok = new FrenBok(); + private final Malysh malysh = new Malysh(); // Предметы private final Item kitchenHob = new Item("плита"); private final Item meatball = new Item("тефтелька"); private final Container fryingPan = new Container("сковородка", meatball, frenBok); - private final Item door = new Item("дверь"); + private final Door door = new Door(); public void play() { karlson.setFeel(Feels.SCARY); @@ -41,6 +41,19 @@ public class StoryTeller { System.out.println(frenBok.getState()); frenBok.pushCharacterBehindItem(door); System.out.println(frenBok.getState()); + malysh.setFeel(Feels.DEAD_INSIDE); + System.out.println(malysh.getState()); + malysh.speak(null); + System.out.println(malysh.getState()); + door.closeDoor(); + karlson.moveTo(door); + System.out.println(karlson.getState()); + karlson.setFeel(Feels.ANGRY); + System.out.println(karlson.getState()); + karlson.flyTo(frenBok); + System.out.println(karlson.getState()); + karlson.stomp(); + System.out.println(karlson.getState()); } } }