From 7498b2675d6e4ff72f678c6cc016639cd9f5b7f1 Mon Sep 17 00:00:00 2001 From: Nikola Petrov Date: Sat, 4 Jan 2025 23:08:12 +0100 Subject: [PATCH] Done load and save state --- inc/sys.hpp | 4 +- inc/values/DnaManager.hpp | 6 ++- src/App.cpp | 13 +++++-- src/sys.cpp | 4 +- src/values/DnaManager.cpp | 80 ++++++++++++++++++++++++++++++--------- 5 files changed, 80 insertions(+), 27 deletions(-) diff --git a/inc/sys.hpp b/inc/sys.hpp index 3b92217..5317ee5 100644 --- a/inc/sys.hpp +++ b/inc/sys.hpp @@ -3,7 +3,7 @@ namespace sys { const char *transformFilePath(const char *filename); - size_t saveDataToFile(const char *filename, const char *data, size_t size); - size_t loadDataFromFile(const char *filename, char *data, size_t size); + size_t saveDataToFile(const char *filename, void *data, size_t size); + size_t loadDataFromFile(const char *filename, void *data, size_t size); bool fileExists(const char *filename); } \ No newline at end of file diff --git a/inc/values/DnaManager.hpp b/inc/values/DnaManager.hpp index 230720c..c6a1c16 100644 --- a/inc/values/DnaManager.hpp +++ b/inc/values/DnaManager.hpp @@ -16,6 +16,7 @@ struct Unit { Dna *dna; Liked liked; + int index; }; class DnaManager @@ -25,13 +26,14 @@ public: void deinit(); Unit next(); void like(Unit unit); + int generation; private: uint128 randSeed; uint128 id; + int queued; + int showed; std::vector vector; - std::list queued; - std::list showed; std::vector liked; std::vector disliked; diff --git a/src/App.cpp b/src/App.cpp index 6437890..1f160e5 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -15,8 +15,7 @@ void App::init(int screenWidth, int screenHeight) canvasTexure = LoadRenderTexture(screenWidth, screenWidth); manager.init(); - unit = manager.next(); - canvas.newGen(canvasTexure, unit.dna); + upTex(Liked::tbd); float posY = (screenHeight - screenWidth) / 2.0f; float recPosX = screenWidth * 0.2f; dest = {0, posY, (float)screenWidth, (float)screenWidth}; @@ -26,8 +25,11 @@ void App::init(int screenWidth, int screenHeight) void App::upTex(Liked liked) { - unit.liked = liked; - manager.like(unit); + if (liked != Liked::tbd) + { + unit.liked = liked; + manager.like(unit); + } unit = manager.next(); if (unit.dna != nullptr) { @@ -65,6 +67,9 @@ void App::draw() Rectangle source = {0, 0, (float)canvasTexure.texture.width, (float)-canvasTexure.texture.height}; Vector2 origin = {0.0f, 0.0f}; DrawTexturePro(canvasTexure.texture, source, dest, origin, 0.0f, WHITE); + + const char *text = TextFormat("GEN %d: %d / %d", manager.generation, unit.index + 1, NUM_PER_GEN); + DrawText(text, dest.x + 10, dest.y - 30, 20, BLACK); } void App::deinit() diff --git a/src/sys.cpp b/src/sys.cpp index e7d7764..c64c61f 100644 --- a/src/sys.cpp +++ b/src/sys.cpp @@ -20,7 +20,7 @@ namespace sys #endif } - size_t saveDataToFile(const char *filename, const char *data, size_t size) + size_t saveDataToFile(const char *filename, void *data, size_t size) { const char *saveFilePath = transformFilePath(filename); @@ -34,7 +34,7 @@ namespace sys return ret; } - size_t loadDataFromFile(const char *filename, char *data, size_t size) + size_t loadDataFromFile(const char *filename, void *data, size_t size) { const char *saveFilePath = transformFilePath(filename); diff --git a/src/values/DnaManager.cpp b/src/values/DnaManager.cpp index d2e9370..5c149d6 100644 --- a/src/values/DnaManager.cpp +++ b/src/values/DnaManager.cpp @@ -11,12 +11,12 @@ void DnaManager::init() { if (sys::fileExists("id")) { - sys::loadDataFromFile("id", (char *)&id, sizeof(uint128)); + sys::loadDataFromFile("id", &id, sizeof(uint128)); } else { id = mrand::getState(time(nullptr)); - sys::saveDataToFile("id", (const char *)&id, sizeof(uint128)); + sys::saveDataToFile("id", &id, sizeof(uint128)); } if (sys::fileExists("data")) @@ -28,17 +28,45 @@ void DnaManager::init() return; fread(&randSeed, 1, sizeof(uint128), file); + fread(&generation, 1, sizeof(int), file); + fread(&showed, 1, sizeof(showed), file); + queued = showed; + int size, tmp; + + fread(&size, sizeof(size), 1, file); + for (int i = 0; i < size; i++) + { + fread(&tmp, sizeof(tmp), 1, file); + liked.push_back(tmp); + } + + fread(&size, sizeof(size), 1, file); + for (int i = 0; i < size; i++) + { + fread(&tmp, sizeof(tmp), 1, file); + disliked.push_back(tmp); + } fclose(file); } else { randSeed = id; + queued = 0; + showed = 0; + generation = 0; } + vector.resize(NUM_PER_GEN); - for (std::size_t i = 0; i < NUM_PER_GEN; i++) + if (sys::fileExists("array")) { - DNA::newDna(&vector[i], &randSeed); - queued.push_back(i); + sys::loadDataFromFile("array", vector.data(), sizeof(Dna) * NUM_PER_GEN); + } + else + { + for (std::size_t i = 0; i < NUM_PER_GEN; i++) + { + DNA::newDna(&vector[i], &randSeed); + } } } @@ -50,25 +78,42 @@ void DnaManager::deinit() if (file == NULL) return; fwrite(&randSeed, 1, sizeof(uint128), file); + fwrite(&generation, 1, sizeof(int), file); + fwrite(&showed, 1, sizeof(showed), file); + + int tmp; + tmp = liked.size(); + fwrite(&tmp, sizeof(tmp), 1, file); + fwrite(liked.data(), sizeof(int) * tmp, 1, file); + + tmp = disliked.size(); + + fwrite(&tmp, sizeof(tmp), 1, file); + fwrite(disliked.data(), sizeof(tmp) * tmp, 1, file); + + fclose(file); + + filename = sys::transformFilePath("array"); + file = fopen(filename, "wb"); + if (file == NULL) + return; + fwrite(vector.data(), sizeof(Dna) * NUM_PER_GEN, 1, file); fclose(file); } Unit DnaManager::next() { - int index = queued.front(); - queued.pop_front(); - showed.push_back(index); - Dna *ret = &vector[index]; - return {ret, Liked::tbd}; + Dna *ret = &vector[queued]; + int index = queued++; + return {ret, Liked::tbd, index}; } void DnaManager::like(Unit unit) { int found = -1; - for (auto &&i : showed) + if (unit.index == showed) { - if (&vector[i] == unit.dna) - found = i; + found = showed; } if (found == -1) @@ -90,11 +135,14 @@ void DnaManager::like(Unit unit) return; } - showed.remove(found); + showed++; - if (showed.size() == 0 && queued.size() == 0) + if (showed == NUM_PER_GEN && queued == NUM_PER_GEN) { newGen(); + queued = 0; + showed = 0; + generation += 1; } } @@ -105,7 +153,6 @@ void DnaManager::newGen() for (std::size_t i = 0; i < NUM_PER_GEN; i++) { DNA::newDna(&vector[i], &randSeed); - queued.push_back(i); } disliked.clear(); return; @@ -148,6 +195,5 @@ void DnaManager::newGen() for (size_t i = 0; i < NUM_PER_GEN; i++) { DNA::mutate(&vector[i], NUM_OF_MUT, &randSeed); - queued.push_back(i); } } \ No newline at end of file