diff --git a/README.md b/README.md index 5ef5c79..bb810ae 100644 --- a/README.md +++ b/README.md @@ -3,154 +3,18 @@ **ИСУ:** 408657 -**Вариант:** 528475 +**Вариант:** 528475.3 + +_Так как на se.ifmo сбросились варианты я взял текст напрямую из сказки._ ## Задание -> У Карлсона дрогнули губы, и он надулся. Он сделал шаг к плите и взял со сковородки одну тефтельку. Вот этого ему не следовало делать. Фрекен Бок взревела от бешенства и кинулась на Карлсона, схватила его за шиворот и вытолкнула за дверь. +> У Карлсона дрогнули губы, и он надулся. Он сделал шаг к плите и взял со сковородки одну тефтельку. +> Вот этого ему не следовало делать. Фрекен Бок взревела от бешенства и кинулась на Карлсона, схватила его за шиворот +> и вытолкнула за дверь. Малыш был просто в отчаянии. Больше он ничего не успел сказать, потому что дверь кухни +> распахнулась и ворвался Карлсон, тоже злой как чёрт. Он подлетел к Фрекен Бок и топнул ногой об пол. ## Вывод программы -``` -Кралсон дрогнул губой -Кралсон надулся -Он сделал шаг к плита -Кралсон взял одну тефтелька из сковородка -Вот этого ему не следовало делать -Фрекен Бок взревела от бешенства -Она кинулась к Кралсон -Она схватила Кралсон за шиворот -Она вытолкнула Кралсон за дверь -``` ## Структура проекта -```mermaid -graph TD; - Entity-->Character; - Character-->FenBok; - Character-->Karlson; - Entity-->Item; - Item-->Container; -``` -Главный абстрактный класс - Entity, который имеет только имя. От него наследуются предметы и персонажи. Персонажи могут чувствовать *(IFeelabe)*, двигаться *(IMovable)* и брать вещи *(ITakeable)*. Также персонажи имеют гендер *(enum Feels)*. - -За историю отвечает класс *StoryTeller*. Он меняет состояние персонажей и отображает их состояние. - -## UML Диаграмма -```mermaid -classDiagram -class Entity { - # String name - + getName() String -} -class Character { - # Item itemInHand - # Feels feel - - String currentState - - Gender gender - - Entity position - + setFeel(Feels)* void - + moveTo(Entity)* void - + grab(Item)* void - + getItemInHand() Item - + getPosition() Entity - + getGender() String - + getState() String - # setState(String) void - # setPosition(Entity) void -} -class FrenBok { - - IGrabbable characterInHand - + grabCharacter(IGrabbable) void - + setFeel(Feels) void - + moveTo(Entity) void - + grab(Item) void - + pushCharacterBehindItem(Item) void -} -class Karlson { - + grab(Item) void - + setFeel(Feels) void - + moveTo(Entity) void - + grabFrom(Container) void - + getGrabbablePart() String -} - -class Item { - - Character owner - + getOwner() Character - + setOwner(Character) void -} -class Container { - - Item innerItem - + getInnerItem() Item -} - -class Feels { -<> - + SAD - + ANGRY - + SCARY - + RAGE - + NORMAL - - String feel - + values() Feels[] - + toString() String - + valueOf(String) Feels -} - -class Gender { -<> - - String gender - + MAN - + WOMAN - + valueOf(String) Gender - + toString() String - + values() Gender[] -} - -class StoryTeller { - - Item door - - Item meatball - - Container fryingPan - - FrenBok frenBok - - Karlson karlson - - Item kitchenHob - + play() void -} - -class ICanTake { - <> - + grab(Item) void -} - -class IMovable { - <> - + moveTo(Entity) void -} - -class IFeelable { - <> - + setFeel(Feels) void -} - -class IGrabbable { - <> - + getGrabbablePart() String -} - -IGrabbable --|> IMovable - -Character --|> Entity -Container --|> Item -FrenBok --|> Character -Item --|> Entity -Karlson --|> Character - -Character ..|> IFeelable -Character ..|> IMovable -Character ..|> ICanTake -Karlson ..|> IGrabbable - -Character --> Feels -Character --> Gender -``` \ No newline at end of file diff --git a/src/Characters/Character.java b/src/Characters/Character.java index 2ce18e5..e057508 100644 --- a/src/Characters/Character.java +++ b/src/Characters/Character.java @@ -30,7 +30,7 @@ public abstract class Character extends Entity implements IMovable, IFeelable, I public abstract void moveTo(Entity obj); - public abstract void grab(Item obj); + public abstract void grab(Item obj) throws OwnershipException; public Item getItemInHand() { return this.itemInHand; diff --git a/src/Characters/Feels.java b/src/Characters/Feels.java index 1fc9b8d..f624050 100644 --- a/src/Characters/Feels.java +++ b/src/Characters/Feels.java @@ -5,7 +5,7 @@ public enum Feels { SCARY("дрогнул губой"), SAD("надулся"), RAGE("взревела от бешенства"), - NORMAL("Нормально"); + NORMAL("нормально"); private final String feel; diff --git a/src/Characters/ICanTake.java b/src/Characters/ICanTake.java index b98ba29..207cbd7 100644 --- a/src/Characters/ICanTake.java +++ b/src/Characters/ICanTake.java @@ -3,5 +3,5 @@ package Characters; import Items.Item; interface ICanTake { - void grab(Item obj); + void grab(Item obj) throws OwnershipException; } diff --git a/src/Characters/Karlson.java b/src/Characters/Karlson.java index 965c3cc..ba5ec5d 100644 --- a/src/Characters/Karlson.java +++ b/src/Characters/Karlson.java @@ -27,12 +27,15 @@ public class Karlson extends Character implements IGrabbable { } @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)); + if (obj.getOwner() != this && obj.getOwner() != null) { + throw new OwnershipException(String.format("Предмет %s принадлежит %s, а не %s", obj.getName(), obj.getOwner().getName(), this.getName())); + } } - public void grabFrom(Container container) { + public void grabFrom(Container container) throws OwnershipException { this.grab(container.getInnerItem()); this.setState(String.format("%s взял одну %s из %s", this.getName(), container.getInnerItem(), container)); } diff --git a/src/Characters/OwnershipException.java b/src/Characters/OwnershipException.java new file mode 100644 index 0000000..f8cc1ed --- /dev/null +++ b/src/Characters/OwnershipException.java @@ -0,0 +1,7 @@ +package Characters; + +public class OwnershipException extends Exception { + public OwnershipException(String message) { + super(message); + } +} diff --git a/src/StoryTeller/StoryTeller.java b/src/StoryTeller/StoryTeller.java index a47f25f..548181f 100644 --- a/src/StoryTeller/StoryTeller.java +++ b/src/StoryTeller/StoryTeller.java @@ -3,6 +3,7 @@ package StoryTeller; import Characters.Feels; import Characters.FrenBok; import Characters.Karlson; +import Characters.OwnershipException; import Items.Container; import Items.Item; @@ -24,9 +25,13 @@ public class StoryTeller { System.out.println(karlson.getState()); karlson.moveTo(kitchenHob); System.out.println(karlson.getState()); - karlson.grabFrom(fryingPan); - System.out.println(karlson.getState()); - if (fryingPan.getOwner() == frenBok) { + try { + karlson.grabFrom(fryingPan); + System.out.println(karlson.getState()); + frenBok.setFeel(Feels.NORMAL); + System.out.println(frenBok.getState()); + } catch (OwnershipException e) { + System.out.println(e.getMessage()); System.out.println("Вот этого ему не следовало делать"); frenBok.setFeel(Feels.RAGE); System.out.println(frenBok.getState()); @@ -36,9 +41,6 @@ public class StoryTeller { System.out.println(frenBok.getState()); frenBok.pushCharacterBehindItem(door); System.out.println(frenBok.getState()); - } else { - frenBok.setFeel(Feels.NORMAL); - System.out.println(frenBok); } } }