Done load and save state
This commit is contained in:
parent
031c1276ac
commit
7498b2675d
@ -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);
|
||||||
}
|
}
|
@ -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;
|
||||||
|
|
||||||
|
13
src/App.cpp
13
src/App.cpp
@ -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()
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user