Files
cs3460-cpp/Hw6/LifeSimulator.cpp
2019-11-06 14:10:01 -07:00

85 lines
2.3 KiB
C++

#include "LifeSimulator.hpp"
LifeSimulator::LifeSimulator(std::uint8_t sizeX, std::uint8_t sizeY) :
sizeX(sizeX), sizeY(sizeY)
{
for (std::uint8_t i = 0; i < sizeY + 2; i++)
{
currentScreen.emplace_back();
nextScreen.emplace_back();
for (std::uint8_t j = 0; j < sizeX + 2; j++)
{
currentScreen[i].push_back(false);
nextScreen[i].push_back(false);
}
}
}
void LifeSimulator::insertPattern(const Pattern& pattern, std::uint8_t startX, std::uint8_t startY)
{
startX += 1;
startY += 1;
// std::cout << pattern.getCell(0, 0) << std::endl;
if ((std::uint8_t(currentScreen.size() - 1) >= std::uint8_t(pattern.getSizeY() + startY)) &&
std::uint8_t(pattern.getSizeX() + startX) <= std::uint8_t(currentScreen[0].size() - 1))
{
for (std::uint8_t y = 0; y < pattern.getSizeY(); y++)
{
for (std::uint8_t x = 0; x < pattern.getSizeX(); x++)
{
if (pattern.getCell(x, y))
{
currentScreen[y + startY][x + startX] = true;
}
}
}
}
else
{
std::cout << "Screen size is not big enough." << std::endl;
}
}
void LifeSimulator::update()
{
for (std::uint8_t i = 0; i < unsigned(sizeY) + 2; i++)
{
for (std::uint8_t j = 0; j < unsigned(sizeX) + 2; j++)
{
nextScreen[i][j] = false;
}
}
for (int i = 1; i < std::uint8_t(currentScreen.size() - 1); i++)
{
for (int j = 1; j < std::uint8_t(currentScreen[0].size() - 1); j++)
{
int liveCount = 0;
for (int y = -1; y < 2; y++)
{
for (int x = -1; x < 2; x++)
{
if (!(y == 0 && x == 0))
if (currentScreen[i + y][j + x])
liveCount++;
}
}
if (liveCount > 1 && liveCount < 4)
{
if (currentScreen[i][j])
{
nextScreen[i][j] = true;
}
else
{
if (liveCount == 3)
{
nextScreen[i][j] = true;
}
}
}
}
}
currentScreen = nextScreen;
}