-
Notifications
You must be signed in to change notification settings - Fork 0
/
shark.cpp
82 lines (73 loc) · 2.24 KB
/
shark.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
/*
This code is part of QWator.
Copyright (C) 2019 Florian Schmitt
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "shark.h"
#include "ocean.h"
#include "fish.h"
#include <QSvgRenderer>
Shark::Shark(Ocean* ocean, const QPoint & pos): LifeForm(ocean, pos) {
m_repoductionRateAvg = 25;
m_repoductionRateRand = 7;
m_hunger=1;
m_max_hunger=5;
if (renderer==NULL) {
renderer=new QSvgRenderer(QString(":/images/twemoji/1f988.svg"));
}
setSharedRenderer(renderer);
setScale(0.5);
show();
};
void Shark::turn() {
LifeForm::turn();
bool reproduce=(m_age>=(m_repoductionRateAvg +(rand() % m_repoductionRateRand) - (m_repoductionRateRand / 2)));
if (reproduce) {
m_age=0;
}
QVector<QPoint> possibleMoves = findNeighboursWithSymbol(Fish::getClassSymbol());
auto edibleMoves=possibleMoves.size();
if (edibleMoves>0) {
auto choice = rand() % edibleMoves;
auto newpos=possibleMoves[choice];
m_ocean->removeLifeForm(newpos);
if (reproduce) {
m_hunger = 1;
new Shark(m_ocean,newpos);
} else {
m_hunger = 0;
setPosition(newpos);
}
return;
}
m_hunger++;
if (m_hunger > m_max_hunger) {
m_ocean->removeLifeForm(m_position);
return;
}
possibleMoves = findEmptyNeighbours();
auto si=possibleMoves.size();
if (si>0) {
auto choice = rand() % si;
auto newpos=possibleMoves[choice];
if (reproduce) {
new Shark(m_ocean,newpos);
m_hunger++;
} else {
setPosition(newpos);
}
}
};
QString Shark::getSymbol(){
return "\U0001F988";
}
QSvgRenderer* Shark::renderer=NULL;