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;