Я смотрел на это некоторое время и переписал код три раза до сих пор, это то, что у меня есть и чего я не понимаю.Игра жизни, C проверка жизненных условий
У меня есть метод, который проверяет окрестности, через различные линии печати и мой пробег через нее, это работает.
int getLiveCellCount(Generation *currentGeneration, int i, int j)
{
int liveCellCount = 0;
// check top row
if(i > 0)
{
if(j > 0 && currentGeneration->generation[i-1][j-1] == 'X')
{
liveCellCount++;
}
if(currentGeneration->generation[i-1][j] == 'X')
{
liveCellCount++;
}
if(j < currentCols && currentGeneration->generation[i-1][j+1] == 'X')
{
liveCellCount++;
}
}
// check mid row
if(j > 0 && currentGeneration->generation[i][j-1] == 'X')
{
liveCellCount++;
}
if(j < currentCols && currentGeneration->generation[i][j+1] == 'X')
{
liveCellCount++;
}
// check bottom row
if(i < currentRows)
{
if(j > 0 && universe[i+1][j-1] == 'X')
{
liveCellCount++;
}
if(currentGeneration->generation[i+1][j] == 'X')
{
liveCellCount++;
}
if(j < currentCols && currentGeneration->generation[i+1][j+1] == 'X')
{
liveCellCount++;
}
}
return liveCellCount;
}
У меня есть конкретные условия, в которых клетка живет или умирает, живые клетки содержат X и мертвые клетки являются пробелом.
If the cell is alive:
it dies if it has 0, 1, 4 or more living neighbours (starvation), or
it lives if it has 2 or 3 living neighbours (balance).
If the cell is dead:
it springs to life if it has exactly 3 neighbours (procreation).
я реализую код следующим образом:
for(i=0; i<currentRows; i++)
{
for(j=0; j<currentCols; j++)
{
int livingCells = 0;
livingCells = getLiveCellCount(currentGeneration, i,j);
if(universe[i][j] == 'X')
{
if(livingCells == 2 || livingCells == 3)
{
universe[i][j] = 'X';
}
else
{
universe[i][j] = ' ';
}
}
else
{
if(livingCells == 3)
{
universe[i][j] = 'X';
}
}
}
}
Знайте, что universe[][]
переменная сферу файла, моя идея с этим кодом считывается в исходном состоянии в universe
, это работает. Я копирую этот массив в массив структур (хранилище для последующего и в настоящее время закомментировано). Я сканирую universe
и проверяю каждую ячейку для живых клеток в ее окрестности, основываясь на этом, следуя приведенным выше правилам и редактируя universe
на основе элементов по элементам. Что мне не хватает в этом? Где-то состояние не читается правильно, и я не вижу его.
Я хочу поблагодарить всех вас за помощь, которую вы мне дали! Как многие из вас упоминали, я уже рассмотрел небольшую деталь, что каждая ячейка во Вселенной должна обновляться одновременно! Как я уже упоминал, я копирую текущее состояние вселенной в массив 2d в структуре и сохраняю его в массиве для последующего использования, используя текущий снимок юниверса для подсчета количества клеток, а затем редактирование юниверса отлично работает! Спасибо огромное!
Вы должны включить небольшой пример, демонстрирующий проблему, которую вы видите. Вы должны учитывать, что способ сканирования таблицы влияет на состояние вашей игры. Вы одновременно убиваете и оживляете ячейки, поэтому клетка может умереть в позиции x, y, и это повлияет на то, будет ли или нет x + 1, j + 1 жить или умирать, потому что к тому времени, как вы попадете в эту вторую ячейку, вы уже обновил x, y. Это своего рода эффект каскада с одним поворотом. Возможно, это то, чего вы хотите. –
В 'getLiveCellCount' вы не защищаетесь от перехвата верхней границы. – ooga
'getLiveCellCount' только когда-либо вызывается изнутри моих циклов, они должны покрывать верхние границы справа? –