-
Notifications
You must be signed in to change notification settings - Fork 0
/
CompPlayer.cpp
120 lines (106 loc) · 2.88 KB
/
CompPlayer.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
#include "CompPlayer.h"
#include <iostream>
using std::cin; using std::cout; using std::endl;
//std::vector<char> CompPlayer::decision(int nActions)
//{
// std::vector<char> decision;
// for (int n = 0; n < nActions; ++n)
// {
// for (std::string priorityId : priority)
// {
// if (truthTable[priorityId])
// {
// decision.push_back(actionInterface[priorityId]);
// break;
// }
// }
// }
// return decision;
//};
//
//void CompPlayer::generateTruthTable(Actor& self, Actor& target)
//{
// truthTable = {
// {ActionIds::PUNCH_ID, (self.power > target.physique)},
// {ActionIds::BLOCK_ID, (self.physique < self.power)},
// {ActionIds::YELL_ID, (self.power < target.power)},
// };
//}
bool CompPlayer::willAttack() {
return ((truthTable[statTestKey::POWER_VS_PHYSIQUE] &
(truthTable[statTestKey::GREAT_HEALTH] | truthTable[statTestKey::GOOD_HEALTH])
));
}
bool CompPlayer::willDefend() {
return ( ~(truthTable[statTestKey::PHYSIQUE_VS_POWER]) |
(truthTable[statTestKey::BAD_HEALTH] | truthTable[statTestKey::NEAR_DEATH_HEALTH])
);
}
bool CompPlayer::willBuff() {
return (~(truthTable[statTestKey::POWER_VS_PHYSIQUE] | truthTable[statTestKey::PHYSIQUE_VS_POWER]));
}
std::vector<char> CompPlayer::decision(int nActions)
{
std::vector<char> decision;
int n = 0;
while (n < nActions)
{
for(auto behave : priority)
{
switch (behave)
{
case PriorityEnums::priorities::FIGHT:
if (willAttack())
{
decision.push_back(actionInterface[ActionIds::PUNCH_ID]);
break;
}
case PriorityEnums::priorities::DEFEND:
if (willDefend())
{
auto opt = actionInterface.find(ActionIds::BLOCK_ID);
if (opt != actionInterface.end())
{
decision.push_back(opt->second);
break;
}
}
case PriorityEnums::priorities::BUFF:
if (willBuff())
{
decision.push_back(actionInterface[ActionIds::YELL_ID]);
break;
}
default: //unsure at this point for default. Debating either do an auto top priority or leave it as nothing
break;
}
++n;
if (!(n < nActions)) break;
}
}
return decision;
};
void CompPlayer::generateTruthTable(Actor& self, Actor& target)
{
truthTable = {
(self.power > target.physique), //powerToPhys test
(self.physique > self.power), //physiqueToPower test
(self.quick > target.quick), //quickToQuick test
(self.getHealthPercent() > 80), //Great Health
(50 < self.getHealthPercent() && self.getHealthPercent() < 80), // okay Health
(40 < self.getHealthPercent() && self.getHealthPercent() < 50), // bad Health
(self.getHealthPercent() < 40), //near death Health
};
}
void CompPlayer::setPriority(const std::vector<int> newPriority)
{
priority = newPriority;
};
CompPlayer::CompPlayer(std::map<char, ActionType> actions, std::vector <int> initPriority)
{
priority = initPriority;
for (auto& it : actions)
{
actionInterface.emplace(it.second.id, it.first);
}
}