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
|
||||
{
|
||||
for (const auto& row : field)
|
||||
|
||||
@@ -6,14 +6,19 @@
|
||||
|
||||
class CellularAutomaton
|
||||
{
|
||||
static const unsigned int functionValues = 0b00000110100000000010110010110110;
|
||||
|
||||
int m_fieldWidth, m_fieldHeight;
|
||||
std::vector<std::vector<int>> field;
|
||||
std::vector<std::vector<int>> fieldNextState;
|
||||
|
||||
void initializeRandom();
|
||||
int getCellState(int x, int y) const;
|
||||
int getNeighborhoodIndex(int x, int y) const;
|
||||
public:
|
||||
CellularAutomaton(int width, int height);
|
||||
|
||||
|
||||
void update();
|
||||
void displayField() const;
|
||||
};
|
||||
|
||||
|
||||
@@ -40,9 +40,17 @@ int main()
|
||||
cout << "Укажите количество итераций (min 1): ";
|
||||
int iterationsCount = inputNumber(1);
|
||||
|
||||
clear();
|
||||
|
||||
CellularAutomaton ca(fieldWidth, fieldHeight);
|
||||
|
||||
ca.displayField();
|
||||
for (int i = 0; i < iterationsCount; ++i)
|
||||
{
|
||||
std::cout << "\nИтерация " << i + 1 << ":\n";
|
||||
ca.update();
|
||||
ca.displayField();
|
||||
}
|
||||
|
||||
waitForEnter();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user