mvp готово
This commit is contained in:
@@ -24,6 +24,43 @@ void CellularAutomaton::initializeRandom()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CellularAutomaton::getCellState(int x, int y) const
|
||||||
|
{
|
||||||
|
if (x < 0 || x >= m_fieldWidth || y < 0 || y >= m_fieldHeight)
|
||||||
|
{
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return field[y][x];
|
||||||
|
}
|
||||||
|
|
||||||
|
int CellularAutomaton::getNeighborhoodIndex(int x, int y) const
|
||||||
|
{
|
||||||
|
int s0 = getCellState(x, y);
|
||||||
|
int s1 = getCellState(x, y - 1);
|
||||||
|
int s2 = getCellState(x, y + 1);
|
||||||
|
int s3 = getCellState(x - 1, y);
|
||||||
|
int s4 = getCellState(x + 1, y);
|
||||||
|
|
||||||
|
int index = (s0 << 4) | (s1 << 3) | (s2 << 2) | (s3 << 1) | s4;
|
||||||
|
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CellularAutomaton::update()
|
||||||
|
{
|
||||||
|
for (int y = 0; y < m_fieldHeight; ++y)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < m_fieldWidth; ++x)
|
||||||
|
{
|
||||||
|
int neighborhood = getNeighborhoodIndex(x, y);
|
||||||
|
fieldNextState[y][x] = (functionValues >> neighborhood) & 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
field.swap(fieldNextState);
|
||||||
|
}
|
||||||
|
|
||||||
void CellularAutomaton::displayField() const
|
void CellularAutomaton::displayField() const
|
||||||
{
|
{
|
||||||
for (const auto& row : field)
|
for (const auto& row : field)
|
||||||
|
|||||||
@@ -6,14 +6,19 @@
|
|||||||
|
|
||||||
class CellularAutomaton
|
class CellularAutomaton
|
||||||
{
|
{
|
||||||
|
static const unsigned int functionValues = 0b00000110100000000010110010110110;
|
||||||
|
|
||||||
int m_fieldWidth, m_fieldHeight;
|
int m_fieldWidth, m_fieldHeight;
|
||||||
std::vector<std::vector<int>> field;
|
std::vector<std::vector<int>> field;
|
||||||
std::vector<std::vector<int>> fieldNextState;
|
std::vector<std::vector<int>> fieldNextState;
|
||||||
|
|
||||||
void initializeRandom();
|
void initializeRandom();
|
||||||
|
int getCellState(int x, int y) const;
|
||||||
|
int getNeighborhoodIndex(int x, int y) const;
|
||||||
public:
|
public:
|
||||||
CellularAutomaton(int width, int height);
|
CellularAutomaton(int width, int height);
|
||||||
|
|
||||||
|
void update();
|
||||||
void displayField() const;
|
void displayField() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -40,9 +40,17 @@ int main()
|
|||||||
cout << "Укажите количество итераций (min 1): ";
|
cout << "Укажите количество итераций (min 1): ";
|
||||||
int iterationsCount = inputNumber(1);
|
int iterationsCount = inputNumber(1);
|
||||||
|
|
||||||
|
clear();
|
||||||
|
|
||||||
CellularAutomaton ca(fieldWidth, fieldHeight);
|
CellularAutomaton ca(fieldWidth, fieldHeight);
|
||||||
|
|
||||||
ca.displayField();
|
for (int i = 0; i < iterationsCount; ++i)
|
||||||
|
{
|
||||||
|
std::cout << "\nИтерация " << i + 1 << ":\n";
|
||||||
|
ca.update();
|
||||||
|
ca.displayField();
|
||||||
|
}
|
||||||
|
|
||||||
waitForEnter();
|
waitForEnter();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user