forked from psarsky/oop-evolution-simulation-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathClassDiagram.puml
More file actions
356 lines (296 loc) · 8.5 KB
/
ClassDiagram.puml
File metadata and controls
356 lines (296 loc) · 8.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
@startuml
'elements
+enum ElementType {
..Values..
+ ANIMAL
+ PLANT
+ WATER
}
+interface WorldElement {
+ {abstract} Vector2d getPos()
+ {abstract} ElementType getElementType()
}
abstract class InanimateElement {
..Attributes..
- Vector2d position
..Constructor..
+ InanimateElement(Vector2d position)
..Getters..
+ Vector2d getPos() <<override>>
}
InanimateElement ..> WorldElement : <<implements>>
+class Animal {
..Attributes..
- MovementVariant movementVariant
- MutationVariant mutationVariant
- List<Animal> children
- int energyToReproduce
- int energyToPassToChild
- int energyCostToMove
- int birthDate
- PositionDirectionTuple positionDirection
- int geneIndex
- int energy
- int age
- int deathDate
- int plantsEaten
- int childrenMade
- int[] genotype
..Constructor..
+ Animal(Vector2d position, Genotype genotype, SimulationProperties simulationProperties)
..Simulation methods..
+ void move(MoveValidator validator)
+ void eatPlant(int plantEnergy)
+ Animal reproduce(Animal mate, SimulationProperties simulationProperties)
+ void addChildToList(Animal child)
..Utilities..
+ String toString() <<override>>
..Getters..
+ Vector2d getPos() <<override>>
+ getEnergy()
+ int[] getGenotype()
+ ElementType getElementType() <<override>>
+ int getBirthDate()
+ int getDeathDate()
+ int getChildrenMade()
+ int getPlantsEaten()
+ int getAge()
+ MovementVariant getMovementVariant()
..Setters..
+ void setEnergy(int energy)
+ void setGenotype(int[] genotype)
+ void setDeathDate(int date)
}
Animal ..> WorldElement : <<implements>>
+class Plant {
..Constructor..
+ Plant(Vector2d position)
..Utilities..
+ String toString() <<override>>
..Getters..
+ ElementType getElementType() <<override>>
}
Plant --> InanimateElement : <<extends>>
+class Water {
..Constructor..
+ Water(Vector2d position)
..Utilities..
+ String toString() <<override>>
..Getters..
+ ElementType getElementType() <<override>>
}
Water --> InanimateElement : <<extends>>
'genotype
+enum MutationVariant {
..Values..
+ RANDOM
}
+interface Mutation {
+ {abstract} void applyMutation(int[] genes, SimulationProperties simulationProperties);
}
+class RandomMutation {
..Methods..
+ void applyMutation(int[] Genotype, SimulationProperties simulationProperties) <<override>>
}
RandomMutation ..> Mutation : <<implements>>
+class Genotype {
..Attributes..
- int[] genes
- SimulationProperties simulationProperties
..Constructors..
+ Genotype(SimulationProperties simulationProperties)
+ Genotype(Animal parent1, Animal parent2, SimulationProperties simulationProperties)
..Simulation methods..
+ void initializeRandomGenes()
+ void generateChildGenes(Animal parent1, Animal parent2)
+ void performMutation(int[] genes, SimulationProperties simulationProperties)
..Utilities..
+ String toString() <<override>>
+ int hashCode() <<override>>
..Getters..
+ int[] getGenes()
}
'maps
+enum MapVariant {
..Values..
+ GLOBE
+ WATER_WORLD
}
+interface MoveValidator {
+ {abstract} PositionDirectionTuple correctPosition(Vector2d oldPosition, Vector2d newPosition, MapDirection direction)
}
abstract class AbstractWorldMap {
..Attributes..
# List<MapChangeListener> observers
# MapVisualizer mapVisualizer
# UUID id
# HashMap<Vector2d, List<Animal>> animals
# HashMap<Vector2d, Plant> plants
# List<Vector2d> freePlantPositions
# int width
# int height
..Constructor..
+ AbstractWorldMap(SimulationProperties simulationProperties)
..Simulation methods..
+ void placeAnimal(Vector2d position, Animal animal)
+ void removeAnimal(Animal animal)
+ void placePlant(Vector2d position, Plant plant)
+ void move(Animal animal)
..Utilities..
+ WorldElement objectAt(Vector2d position)
+ void addObserver(MapChangeListener observer)
+ void notifyObservers(String message)
+ PositionDirectionTuple correctPosition(Vector2d oldPosition, Vector2d newPosition, MapDirection direction) <<override>>
+ String toString() <<override>>
..Getters..
+ HashMap<Vector2d, List<Animal>> getAnimals()
+ HashMap<Vector2d, Plant> getPlants()
+ List<Vector2d> getFreePlantPositions()
+ UUID getID()
+ Boundary getCurrentBounds()
}
AbstractWorldMap ..> MoveValidator : <<implements>>
+class Globe {
..Constructor..
+ Globe(SimulationProperties simulationProperties)
}
Globe --> AbstractWorldMap : <<extends>>
class WaterWorld {
..Attributes..
- HashMap<Vector2d, Water> waterFields
..Constructor..
+ WaterWorld(SimulationProperties simulationProperties)
..Simulation methods..
+ void waterFlow(boolean highTide, int waterViolence)
+ List<Vector2d> getSelectedWaterFields()
+ void generateFreePlantPositions()
..Utilities..
+ PositionDirectionTuple correctPosition(Vector2d oldPosition, Vector2d newPosition, MapDirection direction) <<override>>
+ WorldElement objectAt(Vector2d position) <<override>>
}
WaterWorld --> AbstractWorldMap : <<extends>>
'movement
+enum MovementVariant {
..Values..
+ PREDESTINED
+ OLD_AGE_AINT_NO_PICNIC
}
'vegetation
+enum VegetationVariant {
..Values..
+ FORESTED_EQUATOR
}
+interface Vegetation {
+ {abstract} boolean validatePlantPosition(Vector2d position)
+ {abstract} boolean preferred(Vector2d position)
+ {abstract} String getFieldType(Vector2d position)
}
abstract class AbstractVegetationVariant {
..Methods..
+ boolean validatePlantPosition(Vector2d position) <<override>>
}
AbstractVegetationVariant ..> Vegetation : <<implements>>
+class ForestedEquator {
..Attributes..
- Vector2d equatorLowerLeft
- Vector2d equatorUpperRight
..Constructor..
+ ForestedEquator(int equatorHeight, int mapWidth, int mapHeight)
..Methods..
+ boolean preferred(Vector2d position) <<override>>
+ String getFieldType(Vector2d position) <<override>>
}
ForestedEquator --> AbstractVegetationVariant : <<extends>>
'presenter
+interface MapChangeListener{
+ {abstract} void mapChanged(AbstractWorldMap worldMap, String message)
}
+class ConsoleMapDisplay {
..Attributes..
- int count
..Methods..
+ void mapChanged(AbstractWorldMap worldMap, String message) <<override>>
}
ConsoleMapDisplay ..> MapChangeListener : <<implements>>
'simulation
class SimulationParameters {
- int genotypeSize
- MovementVariant movementVariant
- MutationVariant mutationVariant
- MapVariant mapVariant
- VegetationVariant vegetationVariant
- int width
- int height
- int equatorHeight
- int animalCount
- int plantCount
- int plantsPerDay
- int startEnergy
- int plantEnergy
- int energyNeededToReproduce
- int energyToPassToChild
- int energyCostToMove
- int simulationStep
- int minimumNumberOfMutations
- int maximumNumberOfMutations
- int waterViolence
- int daysElapsed
}
'util
class Boundary {
+ Vector2d lowerLeft
+ Vector2d upperRight
}
enum MapDirection {
..Values..
+ NORTH
+ NORTHEAST
+ EAST
+ SOUTHEAST
+ SOUTH
+ SOUTHWEST
+ WEST
+ NORTHWEST
..Methods..
+ MapDirection next()
+ MapDirection opposite()
+ Vector2d toUnitVector()
+ MapDirection getRandomDirection()
+ MapDirection rotate(int angle)
+ String toString()
}
class PositionDirectionTuple <<record>> {
+ Vector2d position
+ MapDirection direction)
}
class RandomPositionGenerator {
- List<Vector2d> positions
+ RandomPositionGenerator(int maxWidth, int maxHeight, int count)
+ Iterator<Vector2d> iterator()
+ Vector2d getHead()
+ Vector2d getTail()
+ int getIndex(Vector2d pos)
+ Vector2d getPos(int index)
}
class RandomPositionIterator {
- RandomPositionGenerator generator
- Vector2d current
+ RandomPositionIterator(RandomPositionGenerator generator)
+ boolean hasNext()
+ Vector2d next()
+ void remove()
}
RandomPositionGenerator --* RandomPositionIterator : <<contains>>
class Vector2d <<record>> {
- int x
- int y
+ boolean precedes(Vector2d other)
+ boolean follows(Vector2d other)
+ Vector2d add(Vector2d other)
+ Vector2d subtract(Vector2d other)
+ Vector2d upperRight(Vector2d other)
+ Vector2d lowerLeft(Vector2d other)
+ Vector2d opposite()
+ String toString()
}
@enduml