diff --git a/README.md b/README.md index 106e629..2d2ef51 100644 --- a/README.md +++ b/README.md @@ -45,31 +45,19 @@ ## Output ``` -Жители собираются в Домик Знайки чтобы рассказать истории -Все жители, и малыши и малышки, приходили по вечерам к Домик Знайки и слушали рассказы путешественников. +На этом знаменитое путешествие Знайка закончилось. Жизнь в Цветочный город потекла по-старому... хотя нет, нельзя сказать, чтобы совсем по-старому. -Жители собираются в Домик Знайки чтобы рассказать истории -Знайка умно рассказывает историю о путешествия Знайки особенно про путешествие в Зеленый город -и думает: Немного я знаю о городах, но история о путешествия Знайки мне очень понравилась +С тех пор как наши отважные путешественники Знайка вернулись домой, в городе только и говорили о них. +Жители собираются в Дом Знайки чтобы рассказать истории +Все жители слушают историю о путешествии в путешествие в Зеленый город в Цветочный город +Малыш слушает: Малыш слушает историю о путешествие в Зеленый город и спрашивает вопросы о путешествие в Зеленый город +Малышка слушает: Малышка слушает историю о путешествие в Зеленый город и спрашивает вопросы о путешествие в Зеленый город +Знайка рассказывает: Знайка умно рассказывает историю о путешествие в Зеленый город +и думает: Немного я знаю о городах, но история о путешествие в Зеленый город мне очень понравилась -Малыш слушает историю о путешествия Знайки и спрашивает вопросы о путешествие в Зеленый город -и думает: Я никогда не был в городе, но история о путешествия Знайки мне очень понравилась - -Малышка слушает историю о путешествия Знайки и спрашивает вопросы о путешествие в Зеленый город -и думает: Я никогда не был в городе, но история о путешествия Знайки мне очень понравилась - -Знайка умно рассказывает историю о путешествия Знайки особенно про жизнь в Цветочном городе -и думает: Немного я знаю о городах, но история о путешествия Знайки мне очень понравилась - -Малыш слушает историю о путешествия Знайки и спрашивает вопросы о жизнь в Цветочном городе -и думает: Я никогда не был в городе, но история о путешествия Знайки мне очень понравилась - -Малышка слушает историю о путешествия Знайки и спрашивает вопросы о жизнь в Цветочном городе -и думает: Я никогда не был в городе, но история о путешествия Знайки мне очень понравилась - -Истории захватывали дух, и каждый вечер собирались всё больше жителей, чтобы слышать новые приключения. +Истории захватывали дух, и каждый вечер собирались всё больше жителей, чтобы слушать новые приключения. ``` ## UML Diagram -![UML Diagram](https://new.akarpov.ru/media/files/sanspie/aDoSa/bebebe.svg "https://new.akarpov.ru/files/nySsGIMRBJaERBoBWFuu") \ No newline at end of file +![UML Diagram](https://new.akarpov.ru/media/files/sanspie/qLhQT/bebra.svg "https://new.akarpov.ru/files/rWZkihSbBcdbqCMhtfGB") \ No newline at end of file diff --git a/itmo-prog-lab-3.iml b/itmo-prog-lab-3.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/itmo-prog-lab-3.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/StoryTeller.java b/src/StoryTeller.java index bd52dae..a323742 100644 --- a/src/StoryTeller.java +++ b/src/StoryTeller.java @@ -1,31 +1,52 @@ -import characters.Character; +import enums.AdventureType; +import enums.LifeType; import model.*; import characters.*; -import story.StoryContext; +import story.Adventure; +import java.util.List; public class StoryTeller { + // На этом знаменитое путешествие Знайки и его товарищей окончилось. + // Жизнь в Цветочном городе потекла по-старому... хотя нет, нельзя сказать, чтобы совсем по-старому. + // С тех пор как наши отважные путешественники вернулись домой, в городе только и говорили о них. + // Все жители, и малыши и малышки, приходили по вечерам к домику Знайки и слушали рассказы путешественников об их жизни в Зеленом городе. public static void main(String[] args) { - // На этом знаменитое путешествие Знайки и его товарищей окончилось. - // Жизнь в Цветочном городе потекла по-старому... хотя нет, нельзя сказать, чтобы совсем по-старому. - // С тех пор как наши отважные путешественники вернулись домой, в городе только и говорили о них. - // Все жители, и малыши и малышки, приходили по вечерам к домику Знайки и слушали рассказы путешественников об их жизни в Зеленом городе. + City city = new City("Цветочный город", LifeType.NOT_AS_USUAL); - // Creating the setting for the story - City flowerCity = new City("Цветочный город"); - House znaykasHouse = new House("Домик Знайки"); - StoryContext context = new StoryContext(flowerCity, znaykasHouse, "путешествия Знайки"); + // Create adventurers + Traveler znayka = new Znayka(); + znayka.addAdventure("Жизнь в Зеленом городе"); + znayka.returnHome(); - // Creating the characters - Character znayka = new Znayka(); - Character malish = new Child("Малыш"); - Character malishka = new Child("Малышка"); + city.addTraveler(znayka); - // Adding characters to Znayka's house - znaykasHouse.addResident(znayka); - znaykasHouse.addResident(malish); - znaykasHouse.addResident(malishka); + // Create house + House znaykaHouse = new House("Дом Знайки", znayka, city); - znaykasHouse.tellEveningStories(context); + // Add house to the city. + city.addHouse(znaykaHouse); + + // Create children + Child child1 = new Child("Малыш"); + Child child2 = new Child("Малышка"); + + // Add children to the city + city.addChild(child1); + city.addChild(child2); + + City flowerCity = new City("Цветочный город", LifeType.NOT_AS_USUAL); + + Adventure adventure = new Adventure("путешествие в Зеленый город", AdventureType.FAMOUS, List.of(znayka)); + adventure.setLocation(flowerCity); + + znayka.addAdventure(adventure); + adventure.end(); + city.returnToDailyLife(); + city.recognizeTravelers(); + znaykaHouse.addResident(child1); + znaykaHouse.addResident(child2); + znaykaHouse.addResident(znayka); + znaykaHouse.tellEveningStories(adventure); } } diff --git a/src/characters/Character.java b/src/characters/Character.java index c395a22..3089944 100644 --- a/src/characters/Character.java +++ b/src/characters/Character.java @@ -41,4 +41,9 @@ public abstract class Character extends StoryElement implements Listenable, Conv public String toString() { return name + " (" + type + ")"; } + + + public String getName() { + return name; + } } diff --git a/src/characters/Child.java b/src/characters/Child.java index 4441ffc..2553d30 100644 --- a/src/characters/Child.java +++ b/src/characters/Child.java @@ -2,6 +2,8 @@ package characters; import enums.CharacterType; +import java.util.List; + public class Child extends Character { String thoughts = ""; @@ -23,17 +25,25 @@ public class Child extends Character { } public String converse(String subject) { - String response = this.name + " слушает историю о " + context.getStoryContext() + " и спрашивает вопросы о " + subject - + "\n" + "и думает: " + this.thoughts; + String response = this.name + " слушает историю о " + context.getStoryContext() + " и спрашивает вопросы о " + subject; this.thoughts = ""; return response; } @Override public String listen(String subject) { - String response = this.name + " слушает историю о " + context.getStoryContext() + " и спрашивает вопросы о " + subject - + "\n" + "и думает: " + this.thoughts; + String response = this.name + " слушает историю о " + context.getStoryContext() + " и спрашивает вопросы о " + subject; this.thoughts = ""; return response; } + + public void discussTravelers(List travelers){ + System.out.println(this.name + " обсуждает путешественников: "); + + for(Traveler t: travelers){ + if(t.isHome()){ + System.out.println(t.getName()); + } + } + } } \ No newline at end of file diff --git a/src/characters/Traveler.java b/src/characters/Traveler.java index 1a82b06..ee8db37 100644 --- a/src/characters/Traveler.java +++ b/src/characters/Traveler.java @@ -1,13 +1,19 @@ package characters; +import enums.AdventureType; import enums.CharacterType; +import story.Adventure; +import java.util.ArrayList; import java.util.List; public abstract class Traveler extends Character { + private boolean isHome; + private final List adventures; public Traveler(String name) { super(CharacterType.TRAVELER, name); + this.adventures = new ArrayList<>(); } // Traveler can tell stories about his adventures and listen to stories about the city, but dont ask questions @@ -17,12 +23,33 @@ public abstract class Traveler extends Character { return this.name + " рассказывает историю о " + context.getStoryContext() + "\n"; } + public void addAdventure(String adventureStory) { + Adventure newAdventure = new Adventure(adventureStory, AdventureType.FAMOUS, List.of(this)); + this.adventures.add(newAdventure); + } + public void addAdventure(Adventure adventureStory) { + this.adventures.add(adventureStory); + } + public void addAdventure(String adventureStory, List travelers) { + travelers.add(this); + Adventure newAdventure = new Adventure(adventureStory, AdventureType.FAMOUS, travelers); + this.adventures.add(newAdventure); + } + + public List getAdventures() { + return this.adventures; + } + + public void returnHome() { + this.isHome = true; + } + + public boolean isHome() { + return isHome; + } + @Override public String listen(String subject) { return this.name + " слушает историю о " + context.getStoryContext() + "\n"; } - - public List returnHomeAndTellAStory() { - return List.of("город", "путешествие"); - } } diff --git a/src/characters/Znayka.java b/src/characters/Znayka.java index 40e0a1f..90f6d91 100644 --- a/src/characters/Znayka.java +++ b/src/characters/Znayka.java @@ -9,22 +9,25 @@ public class Znayka extends Traveler { super("Знайка"); } - @Override - public void think(String story) { + public String thinkAbout(String story) { if (story.contains("город")) { - this.thoughts += "Немного я знаю о городах, но история о " + context.getStoryContext() + " мне очень понравилась\n"; + return "Немного я знаю о городах, но история о " + context.getStoryContext() + " мне очень понравилась\n"; } else if (story.contains("путешествие")) { - this.thoughts += "Я люблю путешествовать, история о " + context.getStoryContext() + " мне очень понравилась\n"; + return "Я люблю путешествовать, история о " + context.getStoryContext() + " мне очень понравилась\n"; } else { - this.thoughts += "Интересная получается история о " + context.getStoryContext() + "\n"; + return "Интересная получается история о " + context.getStoryContext() + "\n"; } } + public void think(String story) { + this.thoughts += thinkAbout(story); + } + @Override public String converse(String subject) { String response = name + " умно рассказывает историю о " + subject - + "\n" + "и думает: " + this.thoughts; + + "\n" + "и думает: " + thinkAbout(subject); this.thoughts = ""; return response; } @@ -36,9 +39,4 @@ public class Znayka extends Traveler { this.thoughts = ""; return response; } - - @Override - public List returnHomeAndTellAStory() { - return List.of("Путешествие в Зеленый город", "Жизнь в Зеленом городе"); - } } diff --git a/src/enums/AdventureType.java b/src/enums/AdventureType.java new file mode 100644 index 0000000..b22317c --- /dev/null +++ b/src/enums/AdventureType.java @@ -0,0 +1,6 @@ +package enums; + +public enum AdventureType { + FAMOUS, // Represents adventures that are famous + UNKNOWN // Represents adventures that are unknown +} diff --git a/src/enums/LifeType.java b/src/enums/LifeType.java new file mode 100644 index 0000000..f4703e7 --- /dev/null +++ b/src/enums/LifeType.java @@ -0,0 +1,7 @@ +package enums; + +public enum LifeType { + NOT_AS_USUAL, // Represents life not as usual + AS_USUAL, // Represents life as usual + +} diff --git a/src/model/City.java b/src/model/City.java index 51457a7..ebdd475 100644 --- a/src/model/City.java +++ b/src/model/City.java @@ -1,21 +1,87 @@ package model; -import story.StoryElement; +import characters.Child; +import characters.Traveler; +import enums.LifeType; +import story.Adventure; -public class City extends StoryElement { +import java.util.ArrayList; +import java.util.List; + +public class City extends Location { private final String name; + private final LifeType lifeType; + private final List travelers; + private final List children; + private final List houses; - public City(String name) { - super(name); // Assuming the super class StoryElement's constructor takes a name or description + + public City(String name, LifeType lifeType) { + super(name); this.name = name; + this.lifeType = lifeType; + travelers = new ArrayList<>(); + children = new ArrayList<>(); + houses = new ArrayList<>(); + } + + public void addTraveler(Traveler traveler) { + travelers.add(traveler); + } + + public void removeTraveler(Traveler traveler) { + travelers.remove(traveler); + } + + public void addChild(Child child) { + children.add(child); + } + + public void addHouse(House house) { + houses.add(house); } public String getName() { return this.name; } - public void returnToDailyLifeWithChanges() { - // Implementation of the method as before - System.out.println("Жизнь в " + this.getName() + " потекла по-старому... хотя нет, нельзя сказать, чтобы совсем по-старому."); + public void returnToDailyLife() { + if (this.lifeType == LifeType.NOT_AS_USUAL) { + System.out.println("Жизнь в " + this.name + " потекла по-старому... хотя нет, нельзя сказать, чтобы совсем по-старому."); + } else { + System.out.println("Жизнь в " + this.name + " потекла по-старому."); + } + } + + public List gatherStories() { + List stories = new ArrayList<>(); + for (Traveler t : travelers) { + if(t.isHome()) { + for (Adventure a : t.getAdventures()) { + String story = t.getName() + " рассказывает историю о " + a.getAdventurePlace(); + System.out.println(story); + stories.add(story); + } + } + } + return stories; + } + + public void listenToStories(String ownerName, List stories) { + for (House house : houses) { + if (house.getOwner().getName().equals(ownerName)) { + house.gatherChildren(children); + for(String story: stories){ + System.out.println("Малышки слушают историю о " + story); + } + break; + } + } + } + + public void recognizeTravelers() { + for (Traveler traveler : travelers) { + System.out.println("С тех пор как наши отважные путешественники " + traveler.getName() + " вернулись домой, в городе только и говорили о них."); + } } } diff --git a/src/model/House.java b/src/model/House.java index 7cec1d7..85f5fdb 100644 --- a/src/model/House.java +++ b/src/model/House.java @@ -2,21 +2,29 @@ package model; import characters.Character; import characters.Traveler; +import story.Adventure; import story.StoryContext; -import story.StoryElement; +import characters.Child; import java.util.ArrayList; import java.util.List; -public class House extends StoryElement { +public class House extends Location { private final String name; private final List residents; + private final Character owner; + private final City city; + public Character getOwner() { + return this.owner; + } - public House(String name) { + public House(String name, Character owner, City city) { super(name); this.name = name; this.residents = new ArrayList<>(); + this.owner = owner; + this.city = city; } public String getName() { return this.name; @@ -46,36 +54,34 @@ public class House extends StoryElement { return travelers; } - public void tellEveningStories(StoryContext context) { - context.gatherResidentsForStories(); - context.getCity().returnToDailyLifeWithChanges(); + public void tellEveningStories(Adventure adventure) { + List travelingResidents = this.getTravelers(); - for (Character resident : this.getResidents()) { - resident.setContext(context); - } + if (!travelingResidents.isEmpty()) { + this.gatherResidents(); - List subjects = new ArrayList<>(); - - this.gatherResidents(); - for (Traveler resident : this.getTravelers()) { - subjects.addAll(resident.returnHomeAndTellAStory()); - } - for (String subject: subjects) { + StoryContext context = adventure.getContext(city, this); + System.out.println("Все жители слушают историю о путешествии в " + adventure.getAdventureName() + " в " + adventure.getAdventurePlace()); for (Character resident : this.getResidents()) { -// if (resident instanceof Traveler) { -// event = resident.converse(context, subject); -// } else { -// event = resident.listen(context); -// } - // now can just converse for everyone - - resident.think(subject); - String response = resident.converse(subject); - System.out.println(response); + resident.setContext(context); + if (resident instanceof Traveler) { + String response = resident.converse(context.getStoryContext()); + System.out.println(resident.getName() + " рассказывает: " + response); + } + else if (resident instanceof Child) { + String response = resident.listen(context.getStoryContext()); + System.out.println(resident.getName() + " слушает: " + response); + } } } + System.out.println("Истории захватывали дух, и каждый вечер собирались всё больше жителей, чтобы слушать новые приключения."); + } - // The method could end with a closing statement or a setup for the next day's stories. - System.out.println("Истории захватывали дух, и каждый вечер собирались всё больше жителей, чтобы слышать новые приключения."); + public void gatherChildren(List children) { + List childrenNames = new ArrayList<>(); + for (Child child : children) { + childrenNames.add(child.getName()); + } + System.out.println(String.join(",", childrenNames) + " собираются в доме " + owner.getName() + " чтобы послушать истории"); } } diff --git a/src/model/Location.java b/src/model/Location.java new file mode 100644 index 0000000..b661f81 --- /dev/null +++ b/src/model/Location.java @@ -0,0 +1,16 @@ +package model; + +import story.StoryElement; + +abstract public class Location extends StoryElement { + private final String name; + + public Location(String name) { + super(name); + this.name = name; + } + + public String getName() { + return this.name; + } +} diff --git a/src/story/Adventure.java b/src/story/Adventure.java new file mode 100644 index 0000000..1c7a283 --- /dev/null +++ b/src/story/Adventure.java @@ -0,0 +1,54 @@ +package story; + +import characters.Traveler; +import enums.AdventureType; +import model.City; +import model.House; +import model.Location; + +import java.util.ArrayList; +import java.util.List; + +public class Adventure { + public String name; + private Location location; + private final AdventureType type; + private List travelers = new ArrayList<>(); + + public Adventure(String name, AdventureType type, List travelers) { + this.name = name; + this.type = type; + this.travelers = travelers; + } + + public void setLocation(Location location) { + this.location = location; + } + + public Location getLocation() { + return this.location; + } + + public void end() { + List travelersNames = new ArrayList<>(); + for (Traveler traveler : this.travelers) { + travelersNames.add(traveler.getName()); + } + + if (this.type == AdventureType.FAMOUS) { + System.out.println("На этом знаменитое путешествие " + String.join(", ", travelersNames) + " закончилось."); + } else { + System.out.println("На этом путешествие " + String.join(", ", travelersNames) + " закончилось."); + } + } + + public String getAdventurePlace() { + return this.location.getName(); + } + public String getAdventureName() { + return this.name; + } + public StoryContext getContext(City city, House house){ + return new StoryContext(city, house, this.getAdventureName()); + } +} diff --git a/src/story/StoryContext.java b/src/story/StoryContext.java index dedb7cf..d21f693 100644 --- a/src/story/StoryContext.java +++ b/src/story/StoryContext.java @@ -3,6 +3,8 @@ package story; import model.City; import model.House; + + public class StoryContext { private final City city; private final House house;