-
Notifications
You must be signed in to change notification settings - Fork 0
/
Jugador.cc
323 lines (267 loc) · 10.1 KB
/
Jugador.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
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
#include "Jugador.h"
#include "Menu.h"
/*
* Pre: ---
* Post: Ha creado un jugador cuyo nombre es igual a <<nombre>> y cuyos puntos es igual a puntos
*/
void crearJugador(char nombre[], int puntuacion, Jugador& j){
strcpy(j.nombre, nombre);
j.puntuacion = puntuacion;
}
/*
* Pre: ---
* Post : Devuelve el nombre del jugador
*/
void nombre(Jugador j, char nombreJugador[]){
strcpy(nombreJugador, j.nombre);
}
/*
* Pre: ---
* Post : Devuelve los puntos del jugador
*/
int puntuacion(Jugador j){
return j.puntuacion;
}
/*
* Pre: <<ichero>> es un fichero de texto que almacena a razon de una por linea
* los jugadores que han sido registrados en el Ahorcado y sus correspondientes puntuaciones,
* separadas por un espacio en blanco
* Post: Si en el fichero de jugadores <<fichero>> no hay ningun jugador cuyo nombre sea igual a <<nombre>>
* ha creado una nueva entrada para ese jugador con los puntos almacenados en <<puntosJugador>>.
* En caso contrario ha aumentado los puntos que ya tenia el jugador cuyo nombre es igual a <<nombre>> un
* total de <<puntosJugador>> puntos
*/
void anyadirJugador(const char fichero[], Jugador& jugador){
// Comprobar que el jugador se encuentra en el fichero
int enQueLinea = buscarLineaJugador(fichero, jugador);
Jugador jug;
char nombreJug[MAX_LONG_NOMBRE];
nombre(jugador, nombreJug);
// Flujo de lectura asociado al fichero
fstream f;
// Comprobar el resultado
if (enQueLinea == -1){
// El jugador no estaba y se guarda en la ultima linea
f.open(fichero, ios::binary | ios::app);
// Re-escribir el Jugador con los nuevos puntos
f.write(reinterpret_cast<char*>(&jugador), sizeof(Jugador));
}
else {
// Modificar el jugador guardado en la linea <<enQueLinea
f.open(fichero, ios::binary |ios :: in | ios::out);
// Calculo de la posicion en bytes del jugador a modificar
int direccion = sizeof(Jugador) * (enQueLinea - 1);
// Posicionamiento del cursor para poder leer
f.seekg(direccion);
// Lectura del jugador que ha jugado
f.read(reinterpret_cast<char*>(&jug), sizeof(Jugador));
// Puntuacion de las partidas anteriores
int puntosViejos = puntuacion(jug);
// Nuevo jugador con los datos actualizados
crearJugador(nombreJug, puntosViejos + puntuacion(jugador), jugador);
// Posicionamiento del cursor para poder escribir
f.seekp(direccion);
// Re-escribir el Jugador con los nuevos puntos
f.write(reinterpret_cast<char*>(&jugador), sizeof(Jugador));
}
// Cierre del flujo de escritura asociado al ficheroç
f.close();
}
/*
* Pre: <<fichero>> es un fichero binario que almacena todos los jugadores del ahorcado registrados
* y <<j>> es un jugador que puede estar o no almacenado en el fichero de jugadores <<fichero>>
* Post: Si el jugador <<j>> se encuentra almacenado en el fichero de jugadores <<fichero>> devuelve la linea
* en la que se encuentra. En caso contrario devuelve un valor negativo.
*/
int buscarLineaJugador(const char fichero[], Jugador& j){
// Flujo de lectura asociado al fichero
ifstream f;
f.open(fichero, ios::binary);
if (f.is_open()){
// Si el fichero se ha abierto correctamente
// numero de lineas procesadas
int numLineas = 0;
// Control de jugador hallado
bool encontrado = false;
char nombreJugador[MAX_LONG_NOMBRE], nombreJugadorActual[MAX_LONG_NOMBRE];
// Lectura del nombre del jugador
Jugador jugadorActual;
f.read(reinterpret_cast<char*>(&jugadorActual), sizeof(Jugador));
nombre(j, nombreJugador);
// Bucle de lectura del fichero
while (!encontrado && !f.eof()){
// Quedan lineas pendientes de leer
nombre (jugadorActual, nombreJugadorActual);
if (strcmp(nombreJugador, nombreJugadorActual) == 0){
// jugador encontrado
encontrado = true;
}
// Incremento de las lineas leidas
numLineas++;
// Leer un nuevo jugador
f.read(reinterpret_cast<char*>(&jugadorActual), sizeof(Jugador));
}
// Cierre del flujo de lectura
f.close();
// Comprobar que el jugador existe
if (encontrado){
// Si el jugador existia
return numLineas;
}
else {
// No existia y se devuelve valor negativo
return -1;
}
}
else {
// Error al abrir el fichero
cerr << " El fichero de jugadores " << fichero << " es innacesible " << endl;
return -1;
}
}
/*
* Pre: <<jug>> es un puntero a un vector de jugadores, <<inicio>> y <<fin>> son los
* intervalos de busqueda, inicio >= 0, fin >= 0 y inicio <= fin
* Post: Ha establecido los jugadores que debe reordenar por orden decreciente de puntuacion
*/
int dividir(Jugador *jug, int inicio, int fin)
{
int izq;
int der;
int pibote;
Jugador temp;
pibote = puntuacion(jug[inicio]);
izq = inicio;
der = fin;
//Mientras no se cruzen los índices
while (izq < der){
while (puntuacion(jug[der]) < pibote){
der--;
}
while ((izq < der) && (puntuacion(jug[izq]) >= pibote)){
izq++;
}
// Si todavia no se cruzan los indices seguimos intercambiando
if(izq < der){
temp = jug[izq];
jug[izq] = jug[der];
jug[der] = temp;
}
}
//Los indices ya se han cruzado, ponemos el pivote en el lugar que le corresponde
temp = jug[der];
jug[der] = jug[inicio];
jug[inicio] = temp;
//La nueva posición del pivote
return der;
}
/*
* Pre: <<jug>> es un puntero a un vector de jugadores regitrados en
* el juego del Ahorcado, <<inicio>> y <<fin>> son los indices de los extremos
* de la busqueda, inicio >= 0, fin >= 0 y inicio <= fin
* Post: Ha devuelto el vector de jugadores <<jug>> ordenado por orden decreciente de puntuacion
* usando el metodo quicksort
*/
void ordenarJugadores(Jugador *jug, int inicio, int fin)
{
int pivote;
if(inicio < fin)
{
pivote = dividir(jug, inicio, fin);
// Ordeno todos los jugadores menores
ordenarJugadores(jug, inicio, pivote - 1);
// Ordeno todos los jugadores mayores
ordenarJugadores(jug, pivote + 1, fin);
}
}
/*
* Pre: <<fichero>> representa el nombre de un fichero de texto existente
* que almacena información sobre todos los jugadores; la tabla <<jugadores>>
* tiene capacidad suficiente como para almacenar todos las jugadores que estan
* contenidas en el fichero de nombre <<fichero>>.
* Post: Si se ha podido abrir sin problemas el fichero cuyo nombre es
* <<fichero>>, ha copiado la información sobre los jugadores
* contenida en el fichero en las primeras <<numJugadores componentes de
* la tabla <<jugador>>. En caso contrario, ha escrito un mensaje de error
* informando del problema encontrado
*/
void leerJugadores(const char fichero[], Jugador jugadores[], int& numJugadores){
// Flujo de lectura del fichero de jugadires
ifstream f;
// Apertura del fichero
f.open(fichero, ios::binary);
// Comprobar que el fichero de jugadores se ha abierto bien
if (f.is_open()){
numJugadores = 0;
Jugador jugadorLeido;
// Lectura del jugador
f.read(reinterpret_cast<char*>(&jugadorLeido), sizeof(Jugador));
// Mientras queden jugadores pendientes de leer
while (!f.eof()){
// Guardo el jugador leido
jugadores[numJugadores] = jugadorLeido;
numJugadores++;
// Lectura de un nuevo jugador
f.read(reinterpret_cast<char*>(&jugadorLeido), sizeof(Jugador));
}
// Cierre del flujo de lectura del fichero
f.close();
}
else {
cerr << " El fichero de jugadores "<< fichero << " es innacesible " << endl;
}
}
/*
* Pre: <<fichero>> es un fichero binario que almacena todos los jugadores registrados hasta el momento.
* Post: Ha mostrado por pantalla una clasificacion de todos los jugadores registrados. La clasificacion
* presenta el siguiente formqto:
*
* Ejemplo:
*
* JUGADOR PUNTUACION
* ========= ============
* Europe 230
* ZgzInfinty 40
*
* . . . . . . . . .
*
* Pitazzo 870
* Aeri 90
*/
void mostrarClasificacion(const Jugador jugadores[], const int numJugadores, string nombreJugador){
cout << endl << endl;
gotoxy(53, 5);
cout << " RANKING DE LOS JUGADORES" << endl << endl;
// Escritura de la cabecera de la clasificacion
gotoxy(53, 7);
cout << setfill(' ') << setw(17) << "JUGADOR" << setfill(' ') << setw(14) << "PUNTUACION" << endl;
gotoxy(52, 8);
cout << setfill('=') << setw(18) << "=" << " " << setfill('=') << setw(12) << "=" << endl;
// Almacenado del ultimo jugador leido
char nombreJug[MAX_LONG_NOMBRE];
for (int i = 0; i < numJugadores; i++){
// Detener sonido ring
detenerSonidoRing();
// Reproducir sonido del reing
sonidoRing();
gotoxy(50, 9 + i);
nombre(jugadores[i], nombreJug);
// Si el jugador esta
if (nombreJug == nombreJugador){
textcolor(COLOR_VERDE);
// Mostrar los datos del jugador de la partida marcado en verde para diferenciar
cout << setfill(' ') << setw(3) << i + 1 << " - "
<< setfill(' ') << setw(14) << nombreJug
<< setfill(' ') << setw(14) << puntuacion(jugadores[i]) << endl;
textcolor(COLOR_AMARILLO);
}
else {
// Mostrar los datos del jugador en cuestion
cout << setfill(' ') << setw(3) << i + 1 << " - "
<< setfill(' ') << setw(14) << nombreJug
<< setfill(' ') << setw(14) << puntuacion(jugadores[i]) << endl;
}
// Detener ejecucion 500 milisegundos
Sleep(1000);
}
}