-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathopponent.cpp
98 lines (89 loc) · 3.19 KB
/
opponent.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
#include <opponent.h>
#include <ctime>
#include <cstdlib>
#include <algorithm>
Opponent::Opponent(const WordList &master_record)
{
for (const std::string &i : master_record.get_word_list())
{
_word_set.emplace_back(&i);
}
}
const WordScore Opponent::prune_words(const std::string user_guess)
{
std::map<WordScore, std::vector<const std::string *>> scoring_sheet;
for (auto &word : _word_set)
{
WordScore current_score;
for (size_t user_i = 0; user_i < user_guess.size(); ++user_i)
{
if (current_score.get_score(user_i) != WordScore::Score::Empty)
{
continue;
}
size_t w_count = std::count(word->begin(), word->end(), user_guess[user_i]);
if (w_count == 0)
{
current_score.set_score(user_i, WordScore::Score::Incorrect);
continue;
}
// Dealing with duplicates.
std::vector<size_t> pos_vec = {user_i};
while (pos_vec.back() != std::string::npos)
{
if (user_guess[pos_vec.back()] == (*word)[pos_vec.back()])
{
current_score.set_score(pos_vec.back(), WordScore::Score::Green);
if (pos_vec.size() > w_count)
{
// Get first excess yellow and remove it.
for (auto &pos : pos_vec)
{
if (current_score.get_score(pos) == WordScore::Score::Yellow)
{
current_score.set_score(pos, WordScore::Score::Incorrect);
break;
}
}
}
}
// Only count the first yellows till max, not subsequent
else if (pos_vec.size() > w_count)
{
current_score.set_score(pos_vec.back(), WordScore::Score::Incorrect);
}
else
{
current_score.set_score(pos_vec.back(), WordScore::Score::Yellow);
}
pos_vec.emplace_back(user_guess.find(user_guess[user_i], pos_vec.back() + 1));
}
}
scoring_sheet[current_score].emplace_back(word);
}
auto ptr = std::max_element(scoring_sheet.begin(), scoring_sheet.end(),
[](const std::pair<WordScore, std::vector<const std::string *>> &p1, const std::pair<WordScore, std::vector<const std::string *>> &p2)
{
return p1.second.size() < p2.second.size();
});
_word_set = std::move(ptr->second);
_previous_score = ptr->first;
return _previous_score;
}
void Opponent::print_word_set() const
{
for (const auto &i : _word_set)
{
std::cout << *i << "\n";
}
}
int Opponent::get_previous_num_score() const
{
return _previous_score.get_num_score();
}
std::string Opponent::get_random_word() const
{
srand(time(0));
std::string word = *(_word_set[rand() % _word_set.size()]);
return word;
}