-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCautatorTip3.cpp
196 lines (171 loc) · 5.61 KB
/
CautatorTip3.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
188
189
190
191
192
193
194
195
196
#include "CautatorTip3.h"
CautatorTip3::CautatorTip3(Harta& h) {
this->ID += "BB";
this->nume = "Bilbo Baggins";
this->poz = new Pozitie(h.nrLin - 1, 0);
arieVizibilitate = 2;
h.M[h.nrLin - 1][0] = 'B';
}
void CautatorTip3::mutare(Harta& h) {
//se duce cat mai departe posibil de restul cautatorilor
//si evita sa se intersecteze cu acestia
int lin = this->poz->getLinie(), col = this->poz->getColoana();
//verific daca se afla pe pozitia initiala
if(lin == h.nrLin - 1 && col == 0) {
//se alege random prima mutare a jucatorului
int i = rand() % 3;
switch (i) {
case 0: //sus
this->poz->setPozitie(lin - 1, col);
break;
case 1: //diagonala in sus si la dreapta
this->poz->setPozitie(lin - 1, col + 1);
break;
case 2: //dreapta
this->poz->setPozitie(lin, col + 1);
break;
}
}
else {
Pozitie pozCaut = Pozitie(0, 0);
//verific daca in aria sa vizuala se afla vreun cautator
for (int i = lin - 1; i <= lin + 1; i++) {
for (int j = col - 1; j <= col + 1; j++) {
//daca pozitia exista si pe aceasta
//se afla un cautator
if (h.apartine(i, j)) {
if (h.M[i][j] != '-' || h.M[i][j] != '|' || h.M[i][j] != 'X' || h.M[i][j] != 'B') {
pozCaut = Pozitie(i, j);
break;
}
}
}
}
if (pozCaut != Pozitie(0, 0)) {
//vector in care retin pozitia/pozitiile
//cele mai indepartate de cautator
vector<Pozitie> pozOpt;
//distanta pozitiei/pozitiilor cele mai
//indepartate fata de cautator
double dist;
//calculez distanta dintre pozitia cautatorului
//si pozitiile posibile pe care se poate deplasa
//si retin pozitia/pozitiile ce au distanta maxima
//fata de pozitia cautatorului de pe harta
for (int i = lin - 1; i <= lin + 1; i++) {
for (int j = col - 1; j <= col + 1; j++) {
//verific daca pozitia exista in matrice
//si este accesibila cautatorului curent
if (h.apartine(i, j) && (h.M[i][j] == '-' || h.M[i][j] == 'X')) {
double d = sqrt(pow((pozCaut.getLinie() - i), 2) + pow((pozCaut.getColoana() - j), 2));
//daca vectorul este gol adaug pozitia
if (pozOpt.size() == 0) {
pozOpt.push_back(Pozitie(i, j));
dist = d;
}
//verific daca distanta pozitiei actuale este
//mai mare decat distanta pozitiei/pozitiilor
//din vector caz in care golesc vectorul
//si adaug noua pozitie
else if (d > dist) {
pozOpt.clear();
pozOpt.push_back(Pozitie(i, j));
dist = d;
}
//verific daca distanta pozitiei actuale este
//egala cu distanta pozitiei/pozitiilor din vector
//caz in care adaug pozitia actuala in vector
else if (d == dist)
pozOpt.push_back(Pozitie(i, j));
}
}
}
//daca exist mai multe pozitii ce se afla
//la distante maxime egale fata de cautator
//se alege random una dintre ele
if (pozOpt.size() > 1) {
delete this->poz;
srand(time(NULL));
this->poz = new Pozitie(pozOpt[rand() % pozOpt.size()]);
}
//daca am o singura pozitie in vector,
//pe aceasta se va duce cautatorul
else if (pozOpt.size() == 1) {
delete this->poz;
this->poz = new Pozitie(pozOpt[0]);
}
}
//daca nu se afla langa un cautator determin
//pozitia optima pe care se poate deplasa
//(pozitia cu cele mai multe posibilitati de continuare
//si care nu se afla langa un alt cautator)
else {
//vector ce retine pozitia/pozitiile optime
//pe care se poate deplasa cautatorul
vector<Pozitie> pozOpt;
//numarul de pozitii accesibile pentru
//pozitia/pozitiile din vector
int pozPos = 0;
//pentru fiecare pozitie accesibila cautatorului
//numar la cate pozitii are acces si daca se afla
//sau nu langa un alt cautator
for (int i = lin - 1; i <= lin + 1; i++) {
for (int j = col - 1; j <= col + 1; j++) {
int nrPos = 0;
//daca pozitia exista si este accesibila
//ma uit la veciniii ei
if (h.apartine(i, j) && (h.M[i][j] != '-' || h.M[i][j] != 'X')) {
for (int i1 = i - 1; i1 <= i + 1; i1++) {
for (int j1 = j - 1; j1 <= j + 1; j1++) {
//daca pozitia exista
if (h.apartine(i1, j1)) {
//verific daca este accesibila
if (h.M[i1][j1] == '-' || h.M[i1][j1] == 'X')
nrPos++;
//verific daca pe pozitie se afla un cautator
else if (h.M[i1][j1] != '|' && h.M[i1][j1] != 'B') {
nrPos = 0;
break;
}
}
}
}
//daca vectorul este vid adaug pozitia in vector
if (pozOpt.size() == 0) {
pozOpt.push_back(Pozitie(i, j));
pozPos = nrPos;
}
//daca numarul de pozitii accesibile din pozitia curenta
//este mai mare decat cele accesibile din pozitia/pozitiile
//din vector, golesc vctorul si adaug pozitia
else if (nrPos > pozPos) {
pozOpt.clear();
pozOpt.push_back(Pozitie(i, j));
pozPos = nrPos;
}
//daca numarul de pozitii accesibile din pozitia
//curenta este egal cu numarul de pozitii accesibile
//din vector, adaug pozitia curenta la vector
else if (nrPos == pozPos)
pozOpt.push_back(Pozitie(i, j));
}
}
}
//daca exist mai multe pozitii optime
//se alege random una dintre ele
if (pozOpt.size() > 1) {
delete this->poz;
srand(time(NULL));
this->poz = new Pozitie(pozOpt[rand() % pozOpt.size() - 1]);
}
//daca am o singura pozitie in vector,
//pe acesta se va duce cautatorul
else if (pozOpt.size() == 1) {
delete this->poz;
this->poz = new Pozitie(pozOpt[0]);
}
}
}
//marchez pozitia pe care ajung
h.M[this->poz->getLinie()][this->poz->getColoana()] = 'B';
}