-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAnt.cpp
189 lines (145 loc) · 5.58 KB
/
Ant.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
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
/****************************************************************************************************
* * Program name: CS162 Group Project
* * Group number: # 29
* * Group member: Taekyoung Kim, Zuhair Ahmed
* * Date: 02/10/2019
* * Description: This is Ant.cpp file for CS162 GroupProject
* * This project demonstrates a 2D simulation of Predator-Prey Game.
* * The board is a 2D array and each cell points to a Critter.
******************************************************************************************************/
#include "Ant.h"
#include <iostream>
#include <random>
//constructor
Ant::Ant()
:Critter(-1, -1, ANT)
{}
//destructor
Ant::~Ant() = default;
/**********************************************************************************************************
* * This move() function decides where an ant goes to. To do this, it first check edge of the board then
* * if there is empty cell near that ant. Next, count the number of empty cell assigning a number.
* * After that, it picks one number using a random number generator. Then, that ant moves to the new cell.
* * @param board
************************************************************************************************************/
void Ant::move(Critter*** board) {
int findSpace [4];
int count = 0;
if(getX() > 0 && board[getX()-1][getY()] == nullptr) {
findSpace[count] = 1;
count ++;
}
if(getX() < 19 && board[getX()+1][getY()] == nullptr) {
findSpace[count] = 2;
count++;
}
if(getY() > 0 && board[getX()][getY()-1] == nullptr) {
findSpace[count] = 3;
count++;
}
if(getY() < 19 && board[getX()][getY()+1] == nullptr) {
findSpace[count] = 4;
count++;
}
int dir;
int output;
if(count >0) {
std::random_device ran;
std::mt19937 mt(ran());
std::uniform_int_distribution<int> dist5(0, count-1);
output = dist5(mt);
dir = findSpace[output];
switch (dir) {
case 1: //Up
board[getX() - 1][getY()] = this;
board[getX()][getY()] = nullptr;
setX(getX() - 1);
break;
case 2: //Down
board[getX() + 1][getY()] = this;
board[getX()][getY()] = nullptr;
setX(getX() + 1);
break;
case 3: //left
board[getX()][getY() - 1] = this;
board[getX()][getY()] = nullptr;
setY(getY() - 1);
break;
case 4: //right
board[getX()][getY() + 1] = this;
board[getX()][getY()] = nullptr;
setY(getY() + 1);
break;
default:
break;
}
}
}
/*************************************************************************************************************
* * This breed() function decides how and when an ant breeds. First, it check if an ant lives 3 or more than
* * 3 days(turns). Next, it also checks the edge of the board then if there is an empty cell near the ant.
* * If so, it breeds. If not, it waits for the next turn.
* * @param board
**************************************************************************************************************/
void Ant::breed(Critter*** board) {
breedTime++;
if(breedTime >= 3) {
int findSpace [4];
int count =0;
if(getX() > 0 && board[getX()-1][getY()] == nullptr) {
findSpace[count] = 1;
count ++;
}
if(getX() < 19 && board[getX()+1][getY()] == nullptr) {
findSpace[count] = 2;
count++;
}
if(getY() > 0 && board[getX()][getY()-1] == nullptr) {
findSpace[count] = 3;
count++;
}
if(getY() < 19 && board[getX()][getY()+1] == nullptr) {
findSpace[count] = 4;
count++;
}
if(count > 0) {
//make breedTime = 0, so count starts again from the next turn.
breedTime = 0;
int chooseSpace;
int output;
std::random_device ran;
std::mt19937 mt(ran());
std::uniform_int_distribution<int> dist5(0, count-1);
output = dist5(mt);
chooseSpace = findSpace[output];
switch (chooseSpace) {
case 1: //up
board[getX() - 1][getY()] = new Ant();
board[getX() - 1][getY()]->setType(ANT);
board[getX() - 1][getY()]->setX(getX()-1);
board[getX() - 1][getY()]->setY(getY());
break;
case 2: //down
board[getX() + 1][getY()] = new Ant();
board[getX() + 1][getY()]->setType(ANT);
board[getX() + 1][getY()]->setX(getX()+1);
board[getX() + 1][getY()]->setY(getY());
break;
case 3: //left
board[getX()][getY()-1] = new Ant();
board[getX()][getY()-1]->setType(ANT);
board[getX()][getY()-1]->setX(getX());
board[getX()][getY()-1]->setY(getY()-1);
break;
case 4: //right
board[getX()][getY()+1] = new Ant();
board[getX()][getY()+1]->setType(ANT);
board[getX()][getY()+1]->setX(getX());
board[getX()][getY()+1]->setY(getY()+1);
break;
default:
break;
}
}
}
}