-
Notifications
You must be signed in to change notification settings - Fork 1
/
tournament.cc
98 lines (80 loc) · 3.17 KB
/
tournament.cc
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
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <functional>
#include "tournament.h"
#include "match.h"
void Tournament::play()
{
for (size_t p1=0; p1<m_players.size(); ++p1)
{
for (size_t p2=p1+1; p2<m_players.size(); ++p2)
{
Match match(m_players[p1], m_players[p2]);
int res = match.play(m_numGames);
if (m_biggest_competitor.find(m_players[p1]->name()) == m_biggest_competitor.end() || //If player one has not played a game before
m_biggest_competitor[m_players[p1]->name()].second > res) { // If player two was a bigger competitor
m_biggest_competitor[m_players[p1]->name()] = std::pair<std::string, int>(m_players[p2]->name(), res);
}
if (m_biggest_competitor.find(m_players[p2]->name()) == m_biggest_competitor.end() || //If player two has not played a game before
m_biggest_competitor[m_players[p2]->name()].second > -res) { // If player one was a bigger competitor
m_biggest_competitor[m_players[p2]->name()] = std::pair<std::string, int>(m_players[p1]->name(), -res);
}
if (res > 0)
std::cout << "The winner is " << m_players[p1]->name() << " with " << res << " points";
else if (res < 0)
std::cout << "The winner is " << m_players[p2]->name() << " with " << -res << " points";
else
std::cout << "The match ended in a DRAW!";
std::cout << std::endl;
std::cout << std::endl;
m_table[p1][p2] = res / (float) m_numGames;
m_table[p2][p1] = -res / (float) m_numGames;
m_totals[p1] += res;
m_totals[p2] -= res;
}
}
} // end of play
void Tournament::show()
{
// Make a map of player score and player name
std::multimap<int, std::string, std::greater<int> > result;
for (size_t p1=0; p1<m_players.size(); ++p1)
{
result.insert(std::pair<int, std::string>(m_totals[p1], m_players[p1]->name()));
}
for (auto& line : result)
{
std::cout << std::setw(15) << line.second << " : "
<< std::setw(5) << line.first
<< " | Biggest competitor: " << m_biggest_competitor[line.second].first
<< "(" << m_biggest_competitor[line.second].second << ")" << std::endl;
}
std::cout << std::endl;
} // end of show
#define round(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5))
void Tournament::showTable()
{
// Make a map of player score and player number
std::multimap<int, int, std::greater<int> > result;
for (size_t p1=0; p1<m_players.size(); ++p1)
{
result.insert(std::pair<int, int>(m_totals[p1], p1));
}
for (auto& row : result)
{
int playerNumber = row.second;
std::cout << std::setw(15) << m_players[playerNumber]->name() << " : ";
for (auto& col : result)
{
int opponentNumber = col.second;
if (playerNumber != opponentNumber)
std::cout << std::setw(4) << round(m_table[playerNumber][opponentNumber]*100.0) << " ";
else
std::cout << " . ";
}
std::cout << " : " << round(m_totals[playerNumber]*100.0/m_numGames) << std::endl;
}
std::cout << std::endl;
} // end of showTable