From 5af554fecdfad6cb14ac185a93f6301f0db4df7c Mon Sep 17 00:00:00 2001 From: Sergio Valor Martinez Date: Thu, 17 Nov 2022 09:30:56 +0100 Subject: [PATCH] =?UTF-8?q?A=C3=B1adido=20soporte=20preliminar=20para=20es?= =?UTF-8?q?tadisticas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + source/director.cpp | 1 + source/game.cpp | 11 +++- source/game.h | 2 + source/stats.cpp | 149 ++++++++++++++++++++++++++++++++++++++++++++ source/stats.h | 47 ++++++++++++++ source/test.cpp | 74 ---------------------- source/test.h | 46 -------------- 8 files changed, 210 insertions(+), 121 deletions(-) create mode 100644 source/stats.cpp create mode 100644 source/stats.h delete mode 100644 source/test.cpp delete mode 100644 source/test.h diff --git a/.gitignore b/.gitignore index 4a635c3..55e763b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .vscode *config.txt +*stats.txt *.DS_Store thumbs.db *.exe diff --git a/source/director.cpp b/source/director.cpp index bdd106f..2c98f55 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -1039,6 +1039,7 @@ bool Director::setFileList() // Configuración asset->add(prefix + "/data/input/gamecontrollerdb.txt", t_data); asset->add(prefix + "/data/config/config.txt", t_data, false); + asset->add(prefix + "/data/config/stats.txt", t_data, false); // Habitaciones asset->add(prefix + "/data/room/01.room", t_room); diff --git a/source/game.cpp b/source/game.cpp index eeb93f4..32214c7 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -40,6 +40,8 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *as text = new Text(resource->getOffset("smb2.txt"), resource->getTexture("smb2.png"), renderer); music = JA_LoadMusic(asset->get("game.ogg").c_str()); deathSound = JA_LoadSound(asset->get("death.wav").c_str()); + stats = new Stats(asset->get("stats.txt")); + stats->addVisit(room->getName()); // Inicializa el resto de variables ticks = 0; @@ -70,6 +72,7 @@ Game::~Game() delete player; delete eventHandler; delete text; + delete stats; JA_DeleteMusic(music); JA_DeleteSound(deathSound); @@ -210,7 +213,7 @@ void Game::update() #ifdef DEBUG debug->clear(); #endif - + // Actualiza los objetos room->update(); player->update(); @@ -336,6 +339,9 @@ bool Game::changeRoom(std::string file) // Pasa la nueva habitación al jugador player->setRoom(room); + // Actualiza las estadisticas + stats->addVisit(room->getName()); + return true; } @@ -406,6 +412,9 @@ void Game::killPlayer() board.lives--; } + // Actualiza las estadisticas + stats->addDeath(room->getName()); + // Destruye la habitacion y el jugador delete room; delete this->player; diff --git a/source/game.h b/source/game.h index 85c3670..77b3a00 100644 --- a/source/game.h +++ b/source/game.h @@ -17,6 +17,7 @@ #include "room_tracker.h" #include "room.h" #include "scoreboard.h" +#include "stats.h" #ifndef GAME_H #define GAME_H @@ -39,6 +40,7 @@ private: Resource *resource; // Objeto con los recursos Debug *debug; // Objeto para gestionar la información de debug options_t *options; // Puntero a las opciones del juego + Stats *stats; // Objeto encargado de gestionar las estadísticas // Variables JA_Music music; // Musica que suena durante el juego diff --git a/source/stats.cpp b/source/stats.cpp new file mode 100644 index 0000000..cb8925f --- /dev/null +++ b/source/stats.cpp @@ -0,0 +1,149 @@ +#include "stats.h" +#include +#include +#include + +// Constructor +Stats::Stats(std::string file) +{ + filePath = file; + list.clear(); + loadFromFile(); +} + +// Destructor +Stats::~Stats() +{ + saveToFile(); + list.clear(); +} + +// Añade una muerte a las estadisticas +void Stats::addDeath(std::string name) +{ + // Primero busca si ya hay una entrada con ese nombre + const int index = findByName(name); + if (index != -1) + { + list.at(index).died++; + } + + // En caso contrario crea la entrada + else + { + stats_t item; + item.name = name; + item.visited = 0; + item.died = 1; + list.push_back(item); + } +} + +// Añade una visita a las estadisticas +void Stats::addVisit(std::string name) +{ + // Primero busca si ya hay una entrada con ese nombre + const int index = findByName(name); + if (index != -1) + { + list.at(index).visited++; + } + + // En caso contrario crea la entrada + else + { + stats_t item; + item.name = name; + item.visited = 1; + item.died = 0; + list.push_back(item); + } +} + +// Busca una entrada en la lista por nombre +int Stats::findByName(std::string name) +{ + int i = 0; + + for (auto l : list) + { + if (l.name == name) + { + return i; + } + i++; + } + + return -1; +} + +// Carga las estadisticas desde un fichero +bool Stats::loadFromFile() +{ + // Indicador de éxito en la carga + bool success = true; + + // Variables para manejar el fichero + std::string line; + std::ifstream file(filePath); + + // Si el fichero se puede abrir + if (file.good()) + { + // Procesa el fichero linea a linea + while (std::getline(file, line)) + { + // Comprueba que la linea no sea un comentario + if (line.substr(0, 1) != "#") + { + stats_t stat; + std::stringstream ss(line); + std::string tmp; + + // Obtiene el nombre + getline(ss, tmp, ';'); + stat.name = tmp; + + // Obtiene las visitas + getline(ss, tmp, ';'); + stat.visited = std::stoi(tmp); + + // Obtiene las muertes + getline(ss, tmp, ';'); + stat.died = std::stoi(tmp); + + list.push_back(stat); + } + } + + // Cierra el fichero + file.close(); + } + + // El fichero no existe + else + { // Crea el fichero con los valores por defecto + saveToFile(); + } + + return success; +} + +// Guarda las estadisticas en un fichero +void Stats::saveToFile() +{ + bool success = true; + + // Crea y abre el fichero de texto + std::ofstream file(filePath); + + // Escribe en el fichero + file << "# NOMBRE DE LA HABITACION;VISITAS;MUERTES" << std::endl; + for (auto item : list) + { + file << item.name << ";" << item.visited << ";" << item.died << std::endl; + } + + // Cierra el fichero + file.close(); +} \ No newline at end of file diff --git a/source/stats.h b/source/stats.h new file mode 100644 index 0000000..54ea3cf --- /dev/null +++ b/source/stats.h @@ -0,0 +1,47 @@ +#pragma once +#include +#include "common/utils.h" +#include +#include + +#ifndef STATS_H +#define STATS_H + +struct stats_t +{ + std::string name; // Nombre de la habitación donde se encuentra el objeto + int visited; // Cuenta las veces que se ha visitado una habitación + int died; // Cuenta las veces que se ha muerto en una habitación +}; + +class Stats +{ +private: + // Variables + std::vector list; // Lista con las estadisticas por habitación + std::string filePath; // Fichero con las estadísticas + + // Busca una entrada en la lista por nombre + int findByName(std::string name); + + // Carga las estadisticas desde un fichero + bool loadFromFile(); + + // Guarda las estadisticas en un fichero + void saveToFile(); + +public: + // Constructor + Stats(std::string file); + + // Destructor + ~Stats(); + + // Añade una muerte a las estadisticas + void addDeath(std::string name); + + // Añade una visita a las estadisticas + void addVisit(std::string name); +}; + +#endif diff --git a/source/test.cpp b/source/test.cpp deleted file mode 100644 index a815b9c..0000000 --- a/source/test.cpp +++ /dev/null @@ -1,74 +0,0 @@ -#include "test.h" - -// Constructor -Test::Test(SDL_Renderer *renderer, Screen *screen, Asset *asset, Debug *debug) -{ - // Copia la dirección de los objetos - this->renderer = renderer; - this->screen = screen; - this->asset = asset; - this->debug = debug; - - // Inicializa variables - for (int i = 0; i < 4; ++i) - { - point_t p; - p.x = rand() % 256; - p.y = rand() % 192; - p.vx = (float)((rand() % 10) + 1) / 10.0f; - p.vy = (float)((rand() % 10) + 1) / 10.0f; - rand() % 2 == 0 ? p.dx = -1 : p.dx = 1; - rand() % 2 == 0 ? p.dy = -1 : p.dy = 1; - p.vx *= p.dx; - p.vy *= p.dy; - points.push_back(p); - } -} - -// Actualiza las variables -void Test::update() -{ - for (int i = 0; i < (int)points.size(); ++i) - { - points[i].x += points[i].vx; - points[i].y += points[i].vy; - - if (points[i].x > 255) - { - points[i].x = 255; - points[i].vx = -(float)((rand() % 10) + 1) / 10.0f; - } - else if (points[i].x < 0) - { - points[i].x = 0; - points[i].vx = (float)((rand() % 10) + 1) / 10.0f; - } - - if (points[i].y > 191) - { - points[i].y = 191; - points[i].vy = -(float)((rand() % 10) + 1) / 10.0f; - } - else if (points[i].y < 0) - { - points[i].y = 0; - points[i].vy = (float)((rand() % 10) + 1) / 10.0f; - } - std::string text = "P" + std::to_string(i) + ": x=" + std::to_string(points[i].x).substr(0,3) + " y=" + std::to_string(points[i].y).substr(0,3) + " vx=" + std::to_string(points[i].vx).substr(0,3) + " vy=" + std::to_string(points[i].vy).substr(0,3); - debug->add(text); - } -} - -// Dibuja en pantalla -void Test::render() -{ - SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); - line_t l1 = {(int)points[0].x, (int)points[0].y, (int)points[1].x, (int)points[1].y}; - line_t l2 = {(int)points[2].x, (int)points[2].y, (int)points[3].x, (int)points[3].y}; - SDL_RenderDrawLine(renderer, l1.x1, l1.y1, l1.x2, l1.y2); - SDL_RenderDrawLine(renderer, l2.x1, l2.y1, l2.x2, l2.y2); - - SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255); - SDL_Point p = checkCollision(l1, l2); - SDL_RenderDrawPoint(renderer, p.x, p.y); -} \ No newline at end of file diff --git a/source/test.h b/source/test.h deleted file mode 100644 index 661a8c1..0000000 --- a/source/test.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -#include -#include "common/asset.h" -#include "common/debug.h" -#include "common/screen.h" -#include "common/text.h" -#include "common/utils.h" -#include "const.h" -#include -#include - -#ifndef TEST_H -#define TEST_H - -struct point_t -{ - float x, y; - float vx, vy; - int dx, dy; -}; - -class Test -{ -private: - // Objetos y punteros - SDL_Renderer *renderer; // El renderizador de la ventana - Screen *screen; // Objeto encargado de dibujar en pantalla - Asset *asset; // Objeto con los ficheros de recursos - Debug *debug; - - // Variables - std::vector points; - -public: - // Constructor - Test(SDL_Renderer *renderer, Screen *screen, Asset *asset, Debug *debug); - - // Actualiza las variables - void update(); - - // Dibuja en pantalla - void render(); -}; - -#endif