-
Notifications
You must be signed in to change notification settings - Fork 0
/
Tournament.hh
144 lines (111 loc) · 5.8 KB
/
Tournament.hh
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/** @file Tournament.hh
@brief Especificaciones de Tournament
*/
#ifndef AKIRA_TOUR_HH
#define AKIRA_TOUR_HH
#include "Ranking.hh"
#include "Match.hh"
#include "Categories.hh"
#ifndef NO_DIAGRAM
#include "BinTree.hh"
#include <iostream>
#endif
/** @class Tournament
@brief Representa un torneo de tennis.
Contiente las operaciones básicas para poder llevar a cabo la representación de un torneo de tennis, usando como clases base, player y ranking.
*/
class Tournament
{
private:
/** @brief Nombre del torneo. */
std::string name;
/** @brief Nivel del torneo o tipo de categoría. */
int difficulty;
/** @brief Verdadero si ya se ha jugado antes el torneo y falso si es el primera vez que se juega. */
bool played = false;
/** @brief Ranking interno del torneo. El primer elemento del par contiene el nombre del jugador y el segundo los puntos ganados en ese mismo torneo. */
std::vector<std::pair<std::string, int > > names_with_points;
/** @brief Copia del ranking del torneo. Al jugarse más de una vez un torneo, éste estará lleno con los jugadores y los puntos de la edición anterior. */
std::vector<std::pair<std::string, int > > history;
/** @brief Árbol que representa el cuadro de emparejamientos del torneo. */
BinTree <int> pairing_chart;
/** @brief Árbol de partidos que representa los resultados finales del torneo. */
BinTree <Match> results;
/** @brief Crea el árbol de emparejamientos.
\pre El nivel debe empezar en dos y la raíz en uno. El número de jugadores tiene que ser entre 0 y el número máximo de participantes del circuito.
\post El árbol binario "pairing_chart" está completado con la tabla de emparejamientos.
*/
BinTree <int> create_pairing_chart(int n_players, int level, int root) const;
/** @brief Confiecciona los resultados del torneo.
\pre El árbol debe ser de emparejamientos y el nivel debe empezar en 1.
\post El árbol binario de partidos estará completo con los resultados del torneo y las estadísticas de los jugadores actualizadas.
*/
BinTree<Match> compute_results(const BinTree<int>& pairing, int level,
const Categories& c, Ranking& global_rank);
/** @brief Imprime la tabla de emparejamientos.
\pre El torneo debe haber sido iniciado, y por ende, el árbol de emparejamientos lleno.
\post La tabla de emparejamientos se habrá impreso por pantalla.
*/
void print_pairing_chart(const BinTree<int>& tree) const;
/** @brief Imprime los resultados del torneo.
\pre El torneo debe haber sido finalizado, y por ende, el árbol de partidos lleno.
\post Los resultados de los partidos del torneo se habrán impreso por pantalla.
*/
void print_results(const BinTree<Match>& tree) const;
/** @brief Inicializa el torneo leyendo los jugadores participantes.
\pre <em>cierto<em>
\post El resultado es el vector de todos los jugadores participantes con los ganados puntos a 0.
*/
void init_tour(Ranking& global_rank);
/** @brief Actualiza las estadísticas de cada jugador al finalizarse un partido.
\pre El nivel debe estar comprendido entre 1 y el máximo nivel de la clase categorías.
\post El resultado es la actualización de las estadísticas de ambos jugadores del partido en el ranking global.
*/
void update_stats(const Match& m, int level, const Categories& cat, Ranking& global_rank);
/** @brief Imprime el resultado de un partido.
\pre El partido no debe estar vacío.
\post Se habrá impreso por pantalla el resultado del partido en el formato correspondiente.
*/
void print_match(const Match& m) const;
public:
/** @brief Creadora por defecto.
Se ejecuta automáticamente al declarar un torneo.
\pre Debe ser una categoría válida entre 1 y C.
\post El resultado es un torneo con el nombre y la dificultad asignadas.
*/
Tournament(const std::string& name, int difficulty);
/** @brief Borra los puntos de los anteriores participantes si no es la primera vez que se juega el torneo.
\pre <cierto>
\post El resultado es el ranking global actualizado con los nuevos puntajes.
*/
void remove_points(Ranking& global_rank);
/** @brief Borra un jugador del vector de historial de puntos si este existe en este.
\pre <cierto>
\post El resultado es el vector de historial de puntos con un jugador menos (si este existia anteriormente).
*/
void remove_player(const std::string& name);
/** @brief Empieza un torneo, confecciona la tabla de emparejamientos e imprime por pantalla la tabla.
\pre El número de jugadores inscritos no puede ser superior al número total de jugadores del circuito.
\post El árbol binario "pairing_chart" está completado con la
tabla de emparejamientos y el árbol estará impreso por pantalla.
*/
void start_tour(Ranking& global_rank);
/** @brief Acaba con el torneo, da los resultatos finales y actualiza la ficha de los jugadores.
\pre El torneo debe haber sido empezado y los resultados tienen
que escribirse como un árbol binario de strings en preorden y en el orden del cuadro de emparejamientos.
\post El árbol binario "results" está lleno, los puntos y las estadísticas de los jugadores actualizadas,
y already_played pasa a ser verdadero. Imprime también el ranking local sin reordenar.
*/
void end_tour(const Categories& cat, Ranking& global_rank);
/** @brief Consulta el identificador del torneo.
\pre <em>cierto<em>
\post Retorna el identificador del torneo.
*/
std::string get_name() const;
/** @brief Imprime el nombre y la categoría del torneo.
\pre <em>cierto</em>
\post Se ha imprimido el nombre y la categoría por pantalla.
*/
void print_tournament(const Categories& c) const;
};
#endif