Правильна ли моя новая условная логика для правил игры жизни? (разграничение условий рождения и жизни)

Ранее я просил о помощи, просматривая мой код Game of Life здесь: Проблема с методом кода Game of Life ? (Пользовательский интерфейс завершен, но реальные методы GOL не генерируют то, что они должны) и получили обратную связь (за исключением моего последнего вопроса, который лег в основу этого вопроса), но я не был уверен, как опубликовать обновленный вопрос с моим кодом правильно отформатирован в ответе.

Вот мой обновленный код к правилам только для Game of Life. Я попытался учесть предположение, что мне нужно сделать различие между условиями РОЖДЕНИЯ и ЖИЗНИ. Но он все еще не работает и делает даже меньше, чем раньше (теперь он пропадает после первого поколения, вместо того, чтобы создавать глупости). Если бы кто-то мог просмотреть это и сказать мне, верна ли моя логика, это было бы очень полезно, поскольку кажется, что это должно работать, учитывая формат:

if ((map = true) && ((count == 2) || (count == 3))){
map2 = true;} else {map2 = false;}

if (map = false) && count == 3)
map2 = true; 
.
.
.
update map = map2;

Код:

for (int j = 0; j < y; j++) {
      for (int i = 0; i < x; i++) {
        if ((map[j][i] = true) && ((neighborCount[j][i] == 2) || (neighborCount[j][i] == 3))){//alive/dead
          map2[j][i] = true;
        } else {map2[j][i] = false;
        }

        if ((map[j][i] = false) && (neighborCount[j][i] == 3)){//birth
          map2[j][i] = true;
        }
        }
    } 

    map = map2;
  }

2 ответа

Решение

Взгляните на это условие:

if ((map[j][i] = true) && ... ) {

Обратите внимание, что вы пишете

(map[j][i] = true)

что означает "установить map[j][i] чтобы быть правдой, то оценить true"Другими словами, это меняет содержание map[j][i] (упс!) и затем переходит к остальной части оператора if.

Я полагаю, вы хотели написать что-то вроде

if ((map[j][i] == true) && ... ) {

или даже лучше,

if (map[j][i] && ... ) {

что означает то же самое и не рискует случайное назначение.

Точно так же, здесь вы пишете

if ((map[j][i] = false) && ...

какие обновления map[j][i] быть ложным (упс!). Я думаю ты имел ввиду

if ((map[j][i] == false) && ...

или, еще лучше,

if (!map[j][i] && ...

Как примечание, многие компиляторы выдают предупреждения, если они видят код как то, что вы написали, так как это почти всегда неправильно. Вы можете проверить, было ли у вас такое предупреждение. Если так, то теперь вы знаете, что это значит! Если нет, возможно, вы захотите повысить уровень предупреждения на вашем компиляторе, чтобы в будущем вероятность возникновения подобных ошибок была ниже.

Может быть, с большим количеством скобок:

if ((map[j][i] = true) && ((neighborCount[j][i] == 2) || (neighborCount[j][i] == 3)))
Другие вопросы по тегам