Игра Жизни, Рассчитайте соседи Ява
Для домашней работы мы должны запрограммировать игру жизни Конвея на Java. Но у меня есть проблема, чтобы правильно рассчитать количество соседей.
Мы должны использовать класс Cell, который представляет ячейки в нашем 2-мерном поле. Все живые клетки должны быть сохранены в LinkedHashSet.
Проблема, которая возникает, состоит в том, что слишком много возможных живых клеток сохранено, и что у меня есть дубликаты клеток в моем наборе населения.
Мой код для расчета соседей и следующего поколения:
public void next() {
generations++;
// used to save possible alive cells
Set<Cell> nextGen = new LinkedHashSet<Cell>();
int col;
int row;
int count;
for( int i = 0; i < grid.length; i++ ) {
for( int j = 0; j < grid[ 0 ].length; j++ ) {
grid[ i ][ j ].setNeighbours( 0 );
}
}
for( Cell e : population ) { // calculate number of neighbors
col = e.getCol();
row = e.getRow();
count = 0;
for( int i = row - 1;
i >= 0 && i < ( row + 2 ) && i < grid.length;
i++ ) {
for( int j = col - 1;
j >= 0 && j < ( col + 2 ) && j < grid[ 0 ].length;
j++ ) {
count = grid[ i ][ j ].getNeighbours() + 1;
if( i == row && j == col )
{
count--;
}
grid[ i ][ j ].setNeighbours( count );
nextGen.add( grid[ i ][ j ] );
}
}
}
for( Cell e : population )
{ // check if all alive cells stay alive
switch( e.getNeighbours() )
{
case 3:
break;
case 2:
break;
default:
e.setAlive( false );
population.remove( e );
break;
}
}
// check which cells get alive
for( Cell e : nextGen ) {
if( e.getNeighbours() == 3 ) {
e.setAlive( true );
population.add( e );
}
else if( e.getNeighbours() == 2 ) {
/* */
}
else
{
e.setAlive( false );
}
}
}
1 ответ
Решение
Эта строка не кажется правильной:
count = grid[i][j].getNeighbours() + 1;
Разве ты не считаешь живых соседей? Как это:
if (grid[i][j].isAlive()) count++;
Вы должны считать соседей Cell e. Так что уберите эту строку
grid[i][j].setNeighbours(count);
и добавьте эту строку после циклов i, j:
e.setNeighbours(count);