2016-11-03 3 views
0

У меня довольно простая проблема, но я не могу ее понять. Я считаю, что это логическая ошибка, связанная с проверкой соседей в клеточных автоматах. Вот мой код, который работает один раз в секунду для выращивания и проверки соседей:Сотовые автоматы, проверяющие соседи

public void grow(){ 
    Cell[][] next = new Cell[100][100]; 
    for(int row = 0; row < (SIZE_X/SIZE); row++){ 
     for(int col = 0; col < (SIZE_Y/SIZE); col++){ 
      Cell cell = grid[row][col]; 
      Cell nCell = grid[row][col]; // gets 

      if(cell != null){ 
       int amount = neighbors(row, col); // find out how many neighbors are ALIVE/ON 

       if(cell.isOn() == true && amount != 3) // if the current cell is on but doesnt have 3 alive neighbors, it gets turned off 
        nCell.onOff(false); 
       else if(cell.isOn() == false && (amount >= 1 && amount <= 4)) // if it is off and has 1-5 alive neighbors it gets turned on 
        nCell.onOff(true); 

       next[row][col] = nCell; 
      } 
     } 
    } 
    grid = next; 
} 

public int neighbors(int row, int col){ // checks the amount of neighbors that are ALIVE/ON 
    int amount = 0; 

    for(int r = row-1; r <= row+1; r++){ // stepping through a 3x3 area of the grid, which surrounds the selected block 
     for(int c = col-1; c <= col+1; c++){ 

      // clamp 
      if((r > 0 && r < 99) && (c > 0 && c < 99)){ 
       if(grid[r][c].isOn() == true && (r != row && c != col)) // checks if the current neighbor is ALIVE/ON 
        amount++; // if it is then add one to the count 
      } 
     } 
    } 
    return amount; 
} 

Im используя простой 12345/3 (/ Рождение Выживание) правила в моем клеточных автоматах.

В настоящее время проблема заключается в том, что у меня есть сетка 100x100 с ячейками ALIVE/ON размером 10x10 в центре. После того, как мой код запускается один раз, все клетки умирают.

Если кому-то нужна дополнительная информация, не стесняйтесь спрашивать. Заранее спасибо!

ответ

0

Есть некоторые проблемы, но я не уверен, как все мертво в результате.

Первая проблема:

if(cell.isOn() == true && amount != 3) // if the current cell is on but doesnt have 3 alive neighbors, it gets turned off 
    cell.onOff(false); 
if(cell.isOn() == false && (amount >=1 && amount <= 5)) // if it is off and has 1-5 alive neighbors it gets turned on 
    cell.onOff(true); 

Давайте предположим, что клетки имеют 1 живого соседа. Затем первое предложение отключает его, а затем второе возвращает его обратно. Поэтому правило «смерти» не работает. Решение: используйте else if.

Вторая проблема:

Вы проверяете все в том же месте. Например, поле:

**. 
*.* 

Проверяет ячейку (0,0), а затем поле:. *. .

Тогда ведь первая строка проверяется поле является: ... . Затем все умирают. :) Решение: сначала проверьте номер соседей для каждой ячейки и сохраните ее в каждой ячейке. Только после этого включите и выключите их по правилам.

И третья проблема: на краях поля некоторые соседи проверяются дважды. Например, ячейка (0,0) включена, и мы проверяем соседей по ячейке (0,1). Сначала мы пробуем (-1, 0), который изменяется на (0,0) и добавляется к сумме. Позже (0,0) снова проверяется как слева neihbour и добавляется к количеству снова.

+0

Извините за поздний ответ. Поэтому я внедрил некоторые изменения, которые решили проблемы, о которых вы говорили. Другая проблема возникла, хотя теперь она делает массивную пирамиду справа от стартовых блоков и медленно вырастает, казалось бы, без рифмы или разума. Iv обновил мой код –

0
if(grid[r][c].isOn() == true && (r != row && c != col)) 

Здесь вы будете рассматривать только соседей, которые не находятся в той же колонке И столбце, что и ваша центральная ячейка. В результате, Youre рассматривает 4 клетки вместо 8. Вы, вероятно, означало это:

if(grid[r][c].isOn() == true && (r != row || c != col) 
-1

Так я реализовал некоторые изменились, которые решали проблемы, которые говорили о . Еще одна проблема возникла, хотя теперь она делает массивную пирамиду справа от стартовых блоков и медленно растет с, казалось бы, без рифмы или причины. Iv обновил мой код

Является ли ячейка классом? Потому что вы назначаете nCell непосредственно из сетки.Если вы сделаете это по ссылке, вы также измените значение ячейки в старом gridview. Это создаст шаблоны, которые имеют тенденцию распространяться в нижнем правом углу сетки.

EDIT: Только что поняли, что это Java, и приведенное выше может быть неверным. Не обращайте на это внимания, если это так.

EDIT2: Также:

    if(cell.isOn() == true && amount != 3) // if the current cell is on but doesnt have 3 alive neighbors, it gets turned 
off 
        nCell.onOff(false); 
       else if(cell.isOn() == false && (amount >= 1 && amount <= 4)) // if it is off and has 1-5 alive neighbors it gets turned on 
        nCell.onOff(true); 

Это не сцепляется с 1-5 Выживанием 3 правила рождения.

Смежные вопросы