feature: complete story

This commit is contained in:
Ivan Zinchenko 2023-12-30 03:00:21 +05:00
parent d8ff6d9f5b
commit 6e6393d738
Signed by: zinch
GPG Key ID: 6D45AA2C8FD6A37E
10 changed files with 139 additions and 48 deletions

View File

@ -3,7 +3,7 @@
**ИСУ:** 408657
**Вариант:** 528475.3
**Вариант:** ~528475.3
_Так как на se.ifmo сбросились варианты я взял текст напрямую из сказки._
@ -15,6 +15,23 @@ _Так как на se.ifmo сбросились варианты я взял т
> распахнулась и ворвался Карлсон, тоже злой как чёрт. Он подлетел к Фрекен Бок и топнул ногой об пол.
## Вывод программы
```
Кралсон дрогнул губой
Кралсон надулся
Он сделал шаг к плита
Предмет тефтелька принадлежит Фрекен Бок, а не Кралсон
Вот этого ему не следовало делать
Фрекен Бок взревела от бешенства
Она кинулась к Кралсон
Она схватила Кралсон за шиворот
Она вытолкнула Кралсон за Дверь
Малыш был просто в отчаянии
Он ничего не сказал
Дверь распахнулась
Он сделал шаг к Дверь
Кралсон злой как чёрт
Он подлетел к Фрекен Бок
Кралсон топнул ногой
```
## Структура проекта

View File

@ -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;

View File

@ -1,11 +1,12 @@
package Characters;
public enum Feels {
ANGRY("злиться"),
ANGRY("злой как чёрт"),
SCARY("дрогнул губой"),
SAD("надулся"),
RAGE("взревела от бешенства"),
NORMAL("нормально");
NORMAL("нормально"),
DEAD_INSIDE("был просто в отчаянии");
private final String feel;

View File

@ -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) {

View File

@ -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;
}
}

View File

@ -0,0 +1,7 @@
package Characters;
import Entity.*;
public interface IFlyable {
void flyTo(Entity obj);
}

View File

@ -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()));
}
}

View File

@ -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()));
}
}
}

18
src/Items/Door.java Normal file
View File

@ -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("Дверь распахнулась");
}
}

View File

@ -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());
}
}
}