updated class connections

This commit is contained in:
Alexander Karpov 2023-12-23 00:32:01 +03:00
parent a906a45583
commit 959ed28059
14 changed files with 312 additions and 95 deletions

View File

@ -45,31 +45,19 @@
## Output ## Output
``` ```
Жители собираются в Домик Знайки чтобы рассказать истории На этом знаменитое путешествие Знайка закончилось.
Все жители, и малыши и малышки, приходили по вечерам к Домик Знайки и слушали рассказы путешественников.
Жизнь в Цветочный город потекла по-старому... хотя нет, нельзя сказать, чтобы совсем по-старому. Жизнь в Цветочный город потекла по-старому... хотя нет, нельзя сказать, чтобы совсем по-старому.
Жители собираются в Домик Знайки чтобы рассказать истории С тех пор как наши отважные путешественники Знайка вернулись домой, в городе только и говорили о них.
Знайка умно рассказывает историю о путешествия Знайки особенно про путешествие в Зеленый город Жители собираются в Дом Знайки чтобы рассказать истории
и думает: Немного я знаю о городах, но история о путешествия Знайки мне очень понравилась Все жители слушают историю о путешествии в путешествие в Зеленый город в Цветочный город
Малыш слушает: Малыш слушает историю о путешествие в Зеленый город и спрашивает вопросы о путешествие в Зеленый город
Малышка слушает: Малышка слушает историю о путешествие в Зеленый город и спрашивает вопросы о путешествие в Зеленый город
Знайка рассказывает: Знайка умно рассказывает историю о путешествие в Зеленый город
и думает: Немного я знаю о городах, но история о путешествие в Зеленый город мне очень понравилась
Малыш слушает историю о путешествия Знайки и спрашивает вопросы о путешествие в Зеленый город Истории захватывали дух, и каждый вечер собирались всё больше жителей, чтобы слушать новые приключения.
и думает: Я никогда не был в городе, но история о путешествия Знайки мне очень понравилась
Малышка слушает историю о путешествия Знайки и спрашивает вопросы о путешествие в Зеленый город
и думает: Я никогда не был в городе, но история о путешествия Знайки мне очень понравилась
Знайка умно рассказывает историю о путешествия Знайки особенно про жизнь в Цветочном городе
и думает: Немного я знаю о городах, но история о путешествия Знайки мне очень понравилась
Малыш слушает историю о путешествия Знайки и спрашивает вопросы о жизнь в Цветочном городе
и думает: Я никогда не был в городе, но история о путешествия Знайки мне очень понравилась
Малышка слушает историю о путешествия Знайки и спрашивает вопросы о жизнь в Цветочном городе
и думает: Я никогда не был в городе, но история о путешествия Знайки мне очень понравилась
Истории захватывали дух, и каждый вечер собирались всё больше жителей, чтобы слышать новые приключения.
``` ```
## UML Diagram ## UML Diagram
![UML Diagram](https://new.akarpov.ru/media/files/sanspie/aDoSa/bebebe.svg "https://new.akarpov.ru/files/nySsGIMRBJaERBoBWFuu") ![UML Diagram](https://new.akarpov.ru/media/files/sanspie/qLhQT/bebra.svg "https://new.akarpov.ru/files/rWZkihSbBcdbqCMhtfGB")

11
itmo-prog-lab-3.iml Normal file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -1,31 +1,52 @@
import characters.Character; import enums.AdventureType;
import enums.LifeType;
import model.*; import model.*;
import characters.*; import characters.*;
import story.StoryContext; import story.Adventure;
import java.util.List;
public class StoryTeller { public class StoryTeller {
// На этом знаменитое путешествие Знайки и его товарищей окончилось.
// Жизнь в Цветочном городе потекла по-старому... хотя нет, нельзя сказать, чтобы совсем по-старому.
// С тех пор как наши отважные путешественники вернулись домой, в городе только и говорили о них.
// Все жители, и малыши и малышки, приходили по вечерам к домику Знайки и слушали рассказы путешественников об их жизни в Зеленом городе.
public static void main(String[] args) { public static void main(String[] args) {
// На этом знаменитое путешествие Знайки и его товарищей окончилось. City city = new City("Цветочный город", LifeType.NOT_AS_USUAL);
// Жизнь в Цветочном городе потекла по-старому... хотя нет, нельзя сказать, чтобы совсем по-старому.
// С тех пор как наши отважные путешественники вернулись домой, в городе только и говорили о них.
// Все жители, и малыши и малышки, приходили по вечерам к домику Знайки и слушали рассказы путешественников об их жизни в Зеленом городе.
// Creating the setting for the story // Create adventurers
City flowerCity = new City("Цветочный город"); Traveler znayka = new Znayka();
House znaykasHouse = new House("Домик Знайки"); znayka.addAdventure("Жизнь в Зеленом городе");
StoryContext context = new StoryContext(flowerCity, znaykasHouse, "путешествия Знайки"); znayka.returnHome();
// Creating the characters city.addTraveler(znayka);
Character znayka = new Znayka();
Character malish = new Child("Малыш");
Character malishka = new Child("Малышка");
// Adding characters to Znayka's house // Create house
znaykasHouse.addResident(znayka); House znaykaHouse = new House("Дом Знайки", znayka, city);
znaykasHouse.addResident(malish);
znaykasHouse.addResident(malishka);
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);
} }
} }

View File

@ -41,4 +41,9 @@ public abstract class Character extends StoryElement implements Listenable, Conv
public String toString() { public String toString() {
return name + " (" + type + ")"; return name + " (" + type + ")";
} }
public String getName() {
return name;
}
} }

View File

@ -2,6 +2,8 @@ package characters;
import enums.CharacterType; import enums.CharacterType;
import java.util.List;
public class Child extends Character { public class Child extends Character {
String thoughts = ""; String thoughts = "";
@ -23,17 +25,25 @@ public class Child extends Character {
} }
public String converse(String subject) { public String converse(String subject) {
String response = this.name + " слушает историю о " + context.getStoryContext() + " и спрашивает вопросы о " + subject String response = this.name + " слушает историю о " + context.getStoryContext() + " и спрашивает вопросы о " + subject;
+ "\n" + "и думает: " + this.thoughts;
this.thoughts = ""; this.thoughts = "";
return response; return response;
} }
@Override @Override
public String listen(String subject) { public String listen(String subject) {
String response = this.name + " слушает историю о " + context.getStoryContext() + " и спрашивает вопросы о " + subject String response = this.name + " слушает историю о " + context.getStoryContext() + " и спрашивает вопросы о " + subject;
+ "\n" + "и думает: " + this.thoughts;
this.thoughts = ""; this.thoughts = "";
return response; return response;
} }
public void discussTravelers(List<Traveler> travelers){
System.out.println(this.name + " обсуждает путешественников: ");
for(Traveler t: travelers){
if(t.isHome()){
System.out.println(t.getName());
}
}
}
} }

View File

@ -1,13 +1,19 @@
package characters; package characters;
import enums.AdventureType;
import enums.CharacterType; import enums.CharacterType;
import story.Adventure;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public abstract class Traveler extends Character { public abstract class Traveler extends Character {
private boolean isHome;
private final List<Adventure> adventures;
public Traveler(String name) { public Traveler(String name) {
super(CharacterType.TRAVELER, 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 // 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"; 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<Traveler> travelers) {
travelers.add(this);
Adventure newAdventure = new Adventure(adventureStory, AdventureType.FAMOUS, travelers);
this.adventures.add(newAdventure);
}
public List<Adventure> getAdventures() {
return this.adventures;
}
public void returnHome() {
this.isHome = true;
}
public boolean isHome() {
return isHome;
}
@Override @Override
public String listen(String subject) { public String listen(String subject) {
return this.name + " слушает историю о " + context.getStoryContext() + "\n"; return this.name + " слушает историю о " + context.getStoryContext() + "\n";
} }
public List<String> returnHomeAndTellAStory() {
return List.of("город", "путешествие");
}
} }

View File

@ -9,22 +9,25 @@ public class Znayka extends Traveler {
super("Знайка"); super("Знайка");
} }
@Override public String thinkAbout(String story) {
public void think(String story) {
if (story.contains("город")) { if (story.contains("город")) {
this.thoughts += "Немного я знаю о городах, но история о " + context.getStoryContext() + " мне очень понравилась\n"; return "Немного я знаю о городах, но история о " + context.getStoryContext() + " мне очень понравилась\n";
} else if (story.contains("путешествие")) { } else if (story.contains("путешествие")) {
this.thoughts += "Я люблю путешествовать, история о " + context.getStoryContext() + " мне очень понравилась\n"; return "Я люблю путешествовать, история о " + context.getStoryContext() + " мне очень понравилась\n";
} }
else { else {
this.thoughts += "Интересная получается история о " + context.getStoryContext() + "\n"; return "Интересная получается история о " + context.getStoryContext() + "\n";
} }
} }
public void think(String story) {
this.thoughts += thinkAbout(story);
}
@Override @Override
public String converse(String subject) { public String converse(String subject) {
String response = name + " умно рассказывает историю о " + subject String response = name + " умно рассказывает историю о " + subject
+ "\n" + "и думает: " + this.thoughts; + "\n" + "и думает: " + thinkAbout(subject);
this.thoughts = ""; this.thoughts = "";
return response; return response;
} }
@ -36,9 +39,4 @@ public class Znayka extends Traveler {
this.thoughts = ""; this.thoughts = "";
return response; return response;
} }
@Override
public List<String> returnHomeAndTellAStory() {
return List.of("Путешествие в Зеленый город", "Жизнь в Зеленом городе");
}
} }

View File

@ -0,0 +1,6 @@
package enums;
public enum AdventureType {
FAMOUS, // Represents adventures that are famous
UNKNOWN // Represents adventures that are unknown
}

7
src/enums/LifeType.java Normal file
View File

@ -0,0 +1,7 @@
package enums;
public enum LifeType {
NOT_AS_USUAL, // Represents life not as usual
AS_USUAL, // Represents life as usual
}

View File

@ -1,21 +1,87 @@
package model; 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 String name;
private final LifeType lifeType;
private final List<Traveler> travelers;
private final List<Child> children;
private final List<House> 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.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() { public String getName() {
return this.name; return this.name;
} }
public void returnToDailyLifeWithChanges() { public void returnToDailyLife() {
// Implementation of the method as before if (this.lifeType == LifeType.NOT_AS_USUAL) {
System.out.println("Жизнь в " + this.getName() + " потекла по-старому... хотя нет, нельзя сказать, чтобы совсем по-старому."); System.out.println("Жизнь в " + this.name + " потекла по-старому... хотя нет, нельзя сказать, чтобы совсем по-старому.");
} else {
System.out.println("Жизнь в " + this.name + " потекла по-старому.");
}
}
public List<String> gatherStories() {
List<String> 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<String> 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() + " вернулись домой, в городе только и говорили о них.");
}
} }
} }

View File

@ -2,21 +2,29 @@ package model;
import characters.Character; import characters.Character;
import characters.Traveler; import characters.Traveler;
import story.Adventure;
import story.StoryContext; import story.StoryContext;
import story.StoryElement; import characters.Child;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class House extends StoryElement { public class House extends Location {
private final String name; private final String name;
private final List<Character> residents; private final List<Character> 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); super(name);
this.name = name; this.name = name;
this.residents = new ArrayList<>(); this.residents = new ArrayList<>();
this.owner = owner;
this.city = city;
} }
public String getName() { public String getName() {
return this.name; return this.name;
@ -46,36 +54,34 @@ public class House extends StoryElement {
return travelers; return travelers;
} }
public void tellEveningStories(StoryContext context) { public void tellEveningStories(Adventure adventure) {
context.gatherResidentsForStories(); List<Traveler> travelingResidents = this.getTravelers();
context.getCity().returnToDailyLifeWithChanges();
for (Character resident : this.getResidents()) { if (!travelingResidents.isEmpty()) {
resident.setContext(context); this.gatherResidents();
}
List<String> subjects = new ArrayList<>(); StoryContext context = adventure.getContext(city, this);
System.out.println("Все жители слушают историю о путешествии в " + adventure.getAdventureName() + " в " + adventure.getAdventurePlace());
this.gatherResidents();
for (Traveler resident : this.getTravelers()) {
subjects.addAll(resident.returnHomeAndTellAStory());
}
for (String subject: subjects) {
for (Character resident : this.getResidents()) { for (Character resident : this.getResidents()) {
// if (resident instanceof Traveler) { resident.setContext(context);
// event = resident.converse(context, subject); if (resident instanceof Traveler) {
// } else { String response = resident.converse(context.getStoryContext());
// event = resident.listen(context); System.out.println(resident.getName() + " рассказывает: " + response);
// } }
// now can just converse for everyone else if (resident instanceof Child) {
String response = resident.listen(context.getStoryContext());
resident.think(subject); System.out.println(resident.getName() + " слушает: " + response);
String response = resident.converse(subject); }
System.out.println(response);
} }
} }
System.out.println("Истории захватывали дух, и каждый вечер собирались всё больше жителей, чтобы слушать новые приключения.");
}
// The method could end with a closing statement or a setup for the next day's stories. public void gatherChildren(List<Child> children) {
System.out.println("Истории захватывали дух, и каждый вечер собирались всё больше жителей, чтобы слышать новые приключения."); List<String> childrenNames = new ArrayList<>();
for (Child child : children) {
childrenNames.add(child.getName());
}
System.out.println(String.join(",", childrenNames) + " собираются в доме " + owner.getName() + " чтобы послушать истории");
} }
} }

16
src/model/Location.java Normal file
View File

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

54
src/story/Adventure.java Normal file
View File

@ -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<Traveler> travelers = new ArrayList<>();
public Adventure(String name, AdventureType type, List<Traveler> 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<String> 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());
}
}

View File

@ -3,6 +3,8 @@ package story;
import model.City; import model.City;
import model.House; import model.House;
public class StoryContext { public class StoryContext {
private final City city; private final City city;
private final House house; private final House house;