-
Notifications
You must be signed in to change notification settings - Fork 0
/
aiplayer.cpp
78 lines (69 loc) · 1.39 KB
/
aiplayer.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
#include "aiplayer.h"
AIPlayer::AIPlayer():Player()
{
}
bool AIPlayer::makeMove(Unit *u,std::string &gameInfo)
{
if(!moveTaken)
{
closest = NULL;
int dist = 0;
for(int i=0; i < opp->getBattleUnits().size(); i++)
{
Unit *cand = opp->getBattleUnits()[i];
int newdist = map->manhattan(u->getX(), u->getY(),cand->getX(),cand->getY());
if(!closest)
{
if(cand->isAlive())
{
closest = cand;
dist = newdist;
}
}else if(newdist < dist && cand->isAlive())
{
closest = cand;
dist = newdist;
}
}
if(!closest)
{
moveTaken = true;
}else
{
std::vector<Tiles *> visitable = map->unitMoveBFS(u);
dist = 0;
Tiles *closeT = NULL;
for(int i=0; i < visitable.size(); i++)
{
Tiles *candT = visitable[i];
int tmpdist = map->manhattan(closest->getX(), closest->getY(),candT->getX(),candT->getY());
if(!closeT)
{
if(!candT->hasUnit())
{
dist = tmpdist;
closeT = candT;
}
}else if(tmpdist < dist)
{
if(!candT->hasUnit())
{
dist = tmpdist;
closeT = candT;
}
}
}
map->selectTile(closeT->getX(), closeT->getY());
map->moveTile();
moveTaken=true;
}
}else if(u->getAnimState() == Unit::IDLE && !actionTaken)
{
if(closest)
{
gameInfo = map->attackUnit(closest->getX(),closest->getY());
}
actionTaken=true;
}
return moveTaken && actionTaken;
}