-
Notifications
You must be signed in to change notification settings - Fork 0
/
LifeManager.cpp
105 lines (94 loc) · 2.38 KB
/
LifeManager.cpp
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
#include "LifeManager.h"
#include <iostream>
#include "Aquarium.h"
#include "Display.h"
LifeManager::LifeManager(Aquarium * aquarium, std::list<Creature*>& creatures)
: aquarium(aquarium), day(1), creatures(creatures), deadOfAge(0), deadOfHunger(0), newborns(0), eaten(0)
{
}
LifeManager::~LifeManager()
{
}
void LifeManager::makeTurn()
{
onThinking(); // each fish think about plans on the future
onEating(); // each fish eat, if can
onReproducing(); //each fish reproducing if can
onMoving(); // each fish moving if can
dayPassed(); // reduce life and increase hunger
onKilling(); // kill fishes, which died of old age or hunger
printState(); // print state of the day
}
void LifeManager::onThinking() const
{
for (auto creature : creatures)
{
creature->thinkAboutIt(creatures, aquarium->getBorders());
}
}
void LifeManager::onEating()
{
for (auto creature : creatures)
{
if (creature->eat(creatures))
{
aquarium->removeCreature(creature->getPreyId());
getManagerEvent();
eaten++;
}
}
}
void LifeManager::onReproducing()
{
for (auto creature : creatures)
{
if (creature->reproduce(creatures))
{
aquarium->addCreature(creature->getType(), Gene(creature->getType()), creature->getPosition());
newborns++;
std::shared_ptr<LifeEvent> evM = getManagerEvent();
}
}
}
void LifeManager::onMoving() const
{
for (auto creature : creatures)
{
creature->move();
}
}
void LifeManager::dayPassed()
{
for (auto creature : creatures)
{
creature->dayPassed();
}
day++;
}
void LifeManager::onKilling()
{
auto i = creatures.begin();
while (i != creatures.end())
{
(*i)->isShouldDead();
std::shared_ptr<LifeEvent> evM = getManagerEvent();
if (evM != nullptr)
{
aquarium->removeCreature(i++);
deadOfAge++;
}
else i++;
}
}
void LifeManager::printState()
{
system("CLS");
std::cout << "Day: " << day << std::endl
<< "Planktons: " << aquarium->getNumberOfP() << std::endl
<< "Herbivore Fish: " << aquarium->getNumberOfHF() << std::endl
<< "Carnivore Fish: " << aquarium->getNumberOfCF() << std::endl;
deadOfAge = 0;
deadOfHunger = 0;
newborns = 0;
eaten = 0;
}