Cpp/JuegoSudoku_FernandoMéndez/ListaJugadores.cpp

176 lines
4.7 KiB
C++

//Sudoku - Fernando Méndez Torrubiano
#include "ListaJugadores.h"
using namespace std;
//Funciones auxiliares:
bool busquedaRecursiva(const tListaJugadores& lista, const tRegJugador& jugador, int& pos, int& ini, int& fin); //Función auxiliar para realizar la búsqueda recursiva binaria.
void iniciar(tListaJugadores& lista) {
lista.capacidad = 3;
lista.contador = 0;
lista.jugadores = new tRegJugador*[lista.capacidad];
}
bool cargar(tListaJugadores& lista) {
bool carga = false;
ifstream archivo;
string id = "";
int puntos = 0;
iniciar(lista);
archivo.open("registroJugadores.txt");
if (!archivo.is_open()) {
cout << "Error al cargar la lista de jugadores." << endl;
}
else {
carga = true;
archivo >> id;
archivo >> puntos;
while (!archivo.fail()) {
if (lista.contador == lista.capacidad) {
ampliar(lista, lista.capacidad);
}
lista.jugadores[lista.contador] = new tRegJugador;
iniciar(*lista.jugadores[lista.contador], id, puntos);
lista.contador++;
archivo >> id;
archivo >> puntos;
}
archivo.close();
}
return carga;
}
void mostrar(const tListaJugadores& lista) {
cout << right << setw(8) << "POSICIÓN" << setw(12) << "JUGADOR" << setw(12) << "PUNTOS" << endl;
cout << setfill(char('-')) << setw(35) << "\n" << setfill(char(0));
for (int i = 0; i < lista.contador; i++){
cout << setw(3) << i + 1 << "." << setw(7);
mostrar(*lista.jugadores[i]);
}
cout << setfill(char('-')) << setw(35) << "\n" << setfill(char(0));
}
bool guardar(const tListaJugadores& lista) {
bool guardado = false;
ofstream archivo;
archivo.open("registroJugadores.txt");
if (!archivo.is_open()) {
cout << "Error al guardar el registro de jugadores." << endl;
}
else {
for (int i = 0; i < lista.contador; i++){
archivo << lista.jugadores[i]->id << " ";
archivo << lista.jugadores[i]->puntos << endl;
}
guardado = true;
archivo.close();
}
return guardado;
}
bool buscar(const tListaJugadores& lista, const tRegJugador& jugador, int& pos) {
bool encontrado = false;
int ini = 0, fin = lista.contador - 1;
encontrado = busquedaRecursiva(lista, jugador, pos, ini, fin);
return encontrado;
}
bool busquedaRecursiva(const tListaJugadores& lista, const tRegJugador& jugador, int& pos, int& ini, int& fin) {
bool encontrado = false;
if (ini <= fin) {
pos = (ini + fin) / 2;
if (jugador < *lista.jugadores[pos]) { //operator<(jugador, *lista.jugadores[pos])
fin = pos - 1;
encontrado = busquedaRecursiva(lista, jugador, pos, ini, fin);
pos = fin;
}
else if (*lista.jugadores[pos] < jugador) { //operator<(*lista.jugadores[pos], jugador)
ini = pos + 1;
encontrado = busquedaRecursiva(lista, jugador, pos, ini, fin);
}
else {
encontrado = true;
}
}
return encontrado;
}
bool actualizar(tListaJugadores& lista, const tRegJugador& jugador) {
bool actualizado = false;
int pos = 0;
if (buscar(lista, jugador, pos)) {
actualizar(*lista.jugadores[pos], jugador.puntos);
actualizado = true;
}
else {
if (lista.contador == lista.capacidad) {
ampliar(lista, lista.capacidad);
}
pos++;
for (int i = lista.contador; i > pos; i--) {
lista.jugadores[i] = lista.jugadores[i - 1];
}
lista.jugadores[pos] = new tRegJugador;
iniciar(*lista.jugadores[pos], jugador.id, jugador.puntos);
lista.contador++;
}
return actualizado;
}
void mostrarXRanking(const tListaJugadores& lista) {
tListaJugadores listaXRanking;
int cont;
//iniciar(listaXRanking);
listaXRanking.capacidad = lista.contador + 1;
listaXRanking.contador = lista.contador;
listaXRanking.jugadores = new tRegJugador*[listaXRanking.capacidad];
for (int i = 0; i < lista.contador; i++) {
cont = i;
listaXRanking.jugadores[i] = lista.jugadores[i];
while ((cont > 0) && ((menorXRanking(*listaXRanking.jugadores[cont - 1], *listaXRanking.jugadores[cont])))) {
listaXRanking.jugadores[listaXRanking.contador] = listaXRanking.jugadores[cont];
listaXRanking.jugadores[cont] = listaXRanking.jugadores[cont - 1];
listaXRanking.jugadores[cont - 1] = listaXRanking.jugadores[listaXRanking.contador];
cont--;
}
}
mostrar(listaXRanking);
delete[] listaXRanking.jugadores;
}
/*//*/
void ampliar(tListaJugadores& lista, int num) {
lista.capacidad += num;
tRegJugador** aux = new tRegJugador*[lista.capacidad];
for (int i = 0; i < lista.contador; i++) {
aux[i] = lista.jugadores[i];
}
delete[] lista.jugadores;
lista.jugadores = aux;
}
void liberar(tListaJugadores& lista) {
for (int i = 0; i < lista.contador; i++){
delete lista.jugadores[i];
}
delete[] lista.jugadores;
}