1
#include "squad/SimplRules.h"
5
//////////////////////////////////////////////////////////
6
// Реализация понятий предметной области
8
SimplRules::SimplRules(Scene & scene, int step_limit)
10
, _step_limit(step_limit)
12
assert(!scene.empty());
13
assert(step_limit > 0);
16
bool SimplRules::isDone()
18
// Бой завершается, когда в живых остаются войны только в одном отряде
19
// или превышено заданный лимит ходов
26
size_t active_squad_count = _scene.size();
28
for(const std::vector<Warrior> & s : _scene) {
29
bool squad_is_active = false;
30
for(const Warrior & w : s)
32
squad_is_active = true;
36
active_squad_count -= 1;
39
return active_squad_count <= 1;
42
StepQueue_SW SimplRules::generateStepQueue()
44
// Возвращается простая последовательность войтов не нулевым здоровьем в отрядах
47
for(size_t squad_index = 0; squad_index < _scene.size(); ++squad_index)
48
for(size_t warrior_index = 0; warrior_index < _scene[squad_index].size(); ++warrior_index)
49
if (_scene[squad_index][warrior_index].health > 0)
50
queue.push_back({squad_index,warrior_index});
55
void SimplRules::produceStep(size_t squad_index, size_t warrior_index)
57
// Удар выполняется по первому живому войну в первом вражеском отряде
59
assert(squad_index < _scene.size());
60
assert(warrior_index < _scene[squad_index].size());
62
Warrior & warrior = _scene[squad_index][warrior_index];
64
if (warrior.health <= 0)
67
for(size_t target_squad_index = 0; target_squad_index < _scene.size(); ++target_squad_index)
68
if (target_squad_index != squad_index)
69
for(size_t target_warrior_index = 0; target_warrior_index < _scene[target_squad_index].size(); ++target_warrior_index) {
70
Warrior & target_warrior = _scene[target_squad_index][target_warrior_index];
71
if (target_warrior.health > 0) {
72
int damage = warrior.strength + warrior.dexterity
73
- target_warrior.defense - target_warrior.dodge;
75
target_warrior.health -= damage;
81
size_t SimplRules::whoIsWin()
83
for(size_t squad_index = 0; squad_index < _scene.size(); ++squad_index)
84
for(const Warrior & w : _scene[squad_index])