Я смотрел на это некоторое время и переписывал код три раза, это то, что у меня есть, и то, что я не понимаю.
У меня есть метод, который проверяет соседство, через различные строки печати и мой пробег по нему, это работает.
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
поэлементно. Что мне не хватает в этом? Где-то условие не читается мной правильно и я его не вижу.
Хочу поблагодарить вас всех за помощь, которую вы мне оказали! Как многие из вас упоминали, я упустил из виду маленькую деталь, что каждая ячейка во вселенной должна обновляться одновременно! Как я уже упоминал, я копирую текущее состояние вселенной в двумерный массив в структуре и сохраняю его в массиве для последующего использования, используя текущий снимок вселенной для подсчета количества ячеек, а затем редактируя вселенную, все работает отлично! Большое спасибо!
getLiveCellCount
вы не защищаете от превышения верхней границы. - person ooga   schedule 18.06.2015getLiveCellCount
всегда вызывается только из моих циклов for, они должны охватывать верхние границы, верно? - person Michael Miner   schedule 18.06.2015