Done load and save state

This commit is contained in:
Nikola Petrov 2025-01-04 23:08:12 +01:00
parent 031c1276ac
commit 7498b2675d
5 changed files with 80 additions and 27 deletions

View File

@ -3,7 +3,7 @@
namespace sys namespace sys
{ {
const char *transformFilePath(const char *filename); const char *transformFilePath(const char *filename);
size_t saveDataToFile(const char *filename, const char *data, size_t size); size_t saveDataToFile(const char *filename, void *data, size_t size);
size_t loadDataFromFile(const char *filename, char *data, size_t size); size_t loadDataFromFile(const char *filename, void *data, size_t size);
bool fileExists(const char *filename); bool fileExists(const char *filename);
} }

View File

@ -16,6 +16,7 @@ struct Unit
{ {
Dna *dna; Dna *dna;
Liked liked; Liked liked;
int index;
}; };
class DnaManager class DnaManager
@ -25,13 +26,14 @@ public:
void deinit(); void deinit();
Unit next(); Unit next();
void like(Unit unit); void like(Unit unit);
int generation;
private: private:
uint128 randSeed; uint128 randSeed;
uint128 id; uint128 id;
int queued;
int showed;
std::vector<Dna> vector; std::vector<Dna> vector;
std::list<int> queued;
std::list<int> showed;
std::vector<int> liked; std::vector<int> liked;
std::vector<int> disliked; std::vector<int> disliked;

View File

@ -15,8 +15,7 @@ void App::init(int screenWidth, int screenHeight)
canvasTexure = LoadRenderTexture(screenWidth, screenWidth); canvasTexure = LoadRenderTexture(screenWidth, screenWidth);
manager.init(); manager.init();
unit = manager.next(); upTex(Liked::tbd);
canvas.newGen(canvasTexure, unit.dna);
float posY = (screenHeight - screenWidth) / 2.0f; float posY = (screenHeight - screenWidth) / 2.0f;
float recPosX = screenWidth * 0.2f; float recPosX = screenWidth * 0.2f;
dest = {0, posY, (float)screenWidth, (float)screenWidth}; dest = {0, posY, (float)screenWidth, (float)screenWidth};
@ -26,8 +25,11 @@ void App::init(int screenWidth, int screenHeight)
void App::upTex(Liked liked) void App::upTex(Liked liked)
{ {
unit.liked = liked; if (liked != Liked::tbd)
manager.like(unit); {
unit.liked = liked;
manager.like(unit);
}
unit = manager.next(); unit = manager.next();
if (unit.dna != nullptr) if (unit.dna != nullptr)
{ {
@ -65,6 +67,9 @@ void App::draw()
Rectangle source = {0, 0, (float)canvasTexure.texture.width, (float)-canvasTexure.texture.height}; Rectangle source = {0, 0, (float)canvasTexure.texture.width, (float)-canvasTexure.texture.height};
Vector2 origin = {0.0f, 0.0f}; Vector2 origin = {0.0f, 0.0f};
DrawTexturePro(canvasTexure.texture, source, dest, origin, 0.0f, WHITE); 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() void App::deinit()

View File

@ -20,7 +20,7 @@ namespace sys
#endif #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); const char *saveFilePath = transformFilePath(filename);
@ -34,7 +34,7 @@ namespace sys
return ret; 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); const char *saveFilePath = transformFilePath(filename);

View File

@ -11,12 +11,12 @@ void DnaManager::init()
{ {
if (sys::fileExists("id")) if (sys::fileExists("id"))
{ {
sys::loadDataFromFile("id", (char *)&id, sizeof(uint128)); sys::loadDataFromFile("id", &id, sizeof(uint128));
} }
else else
{ {
id = mrand::getState(time(nullptr)); id = mrand::getState(time(nullptr));
sys::saveDataToFile("id", (const char *)&id, sizeof(uint128)); sys::saveDataToFile("id", &id, sizeof(uint128));
} }
if (sys::fileExists("data")) if (sys::fileExists("data"))
@ -28,17 +28,45 @@ void DnaManager::init()
return; return;
fread(&randSeed, 1, sizeof(uint128), file); 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); fclose(file);
} }
else else
{ {
randSeed = id; randSeed = id;
queued = 0;
showed = 0;
generation = 0;
} }
vector.resize(NUM_PER_GEN); 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); sys::loadDataFromFile("array", vector.data(), sizeof(Dna) * NUM_PER_GEN);
queued.push_back(i); }
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) if (file == NULL)
return; return;
fwrite(&randSeed, 1, sizeof(uint128), file); 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); fclose(file);
} }
Unit DnaManager::next() Unit DnaManager::next()
{ {
int index = queued.front(); Dna *ret = &vector[queued];
queued.pop_front(); int index = queued++;
showed.push_back(index); return {ret, Liked::tbd, index};
Dna *ret = &vector[index];
return {ret, Liked::tbd};
} }
void DnaManager::like(Unit unit) void DnaManager::like(Unit unit)
{ {
int found = -1; int found = -1;
for (auto &&i : showed) if (unit.index == showed)
{ {
if (&vector[i] == unit.dna) found = showed;
found = i;
} }
if (found == -1) if (found == -1)
@ -90,11 +135,14 @@ void DnaManager::like(Unit unit)
return; return;
} }
showed.remove(found); showed++;
if (showed.size() == 0 && queued.size() == 0) if (showed == NUM_PER_GEN && queued == NUM_PER_GEN)
{ {
newGen(); 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++) for (std::size_t i = 0; i < NUM_PER_GEN; i++)
{ {
DNA::newDna(&vector[i], &randSeed); DNA::newDna(&vector[i], &randSeed);
queued.push_back(i);
} }
disliked.clear(); disliked.clear();
return; return;
@ -148,6 +195,5 @@ void DnaManager::newGen()
for (size_t i = 0; i < NUM_PER_GEN; i++) for (size_t i = 0; i < NUM_PER_GEN; i++)
{ {
DNA::mutate(&vector[i], NUM_OF_MUT, &randSeed); DNA::mutate(&vector[i], NUM_OF_MUT, &randSeed);
queued.push_back(i);
} }
} }