Пользовательский алгоритм Game of Life не будет работать должным образом

По какой-то причине мой алгоритм Game of Life для JavaScript не работает. Я пытался проверить это с помощью Blinker

мигалка

но очень быстро не получилось

сломанный поворотник

(обратите внимание, это бесконечная плоскость, поэтому те 2 внизу на самом деле выше вершины.)

Это очень интересный дизайн, но это не Игра Жизни.

Мой код работает как

var RxC = []; //the array to hold information about the plane
var drawGame = function(first) {
    for (var i=0;10000>i;i++) {//for each box
        var x = i%100;//gets what x block it is
        var y = Math.floor((i-x)/100);//gets what y block it is
        var box = canvas.getContext('2d');

        if (first) {
            if (!RxC[y]) RxC[y] = [];
            RxC[y][x] = Math.round(Math.random()) === 1;//random alive or dead
        }else {

            //get all neighbors

            //I am using 99 because the plane is 100 wide and 100 tall, but since arrays count from 0, I have to use 99 instead of 100
            var neighbors = 0;
            var topY = (y-1 < 0) ? 99 : y-1;
            var bottomY = (y+1 > 99) ? 0 : y+1;
            var leftX = (x-1 < 0) ? 99 : x-1;
            var rightX = (x+1 > 99) ? 0 : x+1;
            //N
            if (RxC[topY][x]) neighbors++;
            //NE
            if (RxC[topY][rightX]) neighbors++;
            //E
            if (RxC[y][rightX]) neighbors++;
            //SE
            if (RxC[bottomY][rightX]) neighbors++;
            //S
            if (RxC[bottomY][x]) neighbors++;
            //SW
            if (RxC[bottomY][leftX]) neighbors++;
            //W
            if (RxC[y][leftX]) neighbors++;
            //NW
            if (RxC[topY][leftX]) neighbors++;

            if (RxC[y][x]) {//if block is alive
                if (neighbors === 0 || neighbors >= 4) //kill block?
                    RxC[y][x] = false;
            }else {//block is dead
                if (neighbors === 3) //revive block?
                    RxC[y][x] = true;
            }
        }

        if (RxC[y][x]) {//block is alive
            box.fillStyle = '#000';
        }else {//block is dead
            box.fillStyle = '#eee';
        }
        box.fillRect(5*x,5*y,5,5);
        box.strokeRect(5*x,5*y,5,5);
    }
};
drawGame(true);//run game for first time, this will create the board originally
setInterval(drawGame, 25);

Код будет в основном

  1. сделать доску случайным образом
  2. run the rules
    • if the block is alive, and it has 0 neighbors or 4 or more neighbors, it will die
    • если блок мёртв, и у него 3 соседа, то он оживёт

Я получил правила от здесь, но они, кажется, не работают... вообще.

Я попытался удалить бесконечную плоскость (сокращение if else в соседнем разделе), неоднократно проверял свой код и пытался использовать Google, Wikipedia и т. д., чтобы убедиться, что правила, которые я использую, неверны, но я могу не нахожу ничего говорящего по-другому.

Итак, мой вопрос: правильны ли правила, которые я использую? Если они верны, есть ли что-то явно неправильное в моем коде?


person ZomoXYZ    schedule 11.05.2016    source источник
comment
Обычно вы читаете значения ячеек из массива, составляющего предыдущее (текущее) поколение, и записываете новые значения ячеек в другой массив, который затем становится новым поколением, и так далее.   -  person 500 - Internal Server Error    schedule 11.05.2016
comment
Вместо того, чтобы просто запускать его и смотреть на код, задаваясь вопросом, почему он не работает, сделайте то, что делают разработчики программного обеспечения: проследите цикл построчно с помощью отладчика и проверьте значения каждой переменной на каждом шаге. Вскоре станет ясно, почему алгоритм терпит неудачу.   -  person adelphus    schedule 11.05.2016
comment
Кроме того, такие строки кода if (RxC[(y-1<0?99:y-1)][(x+1>99?0:x+1)]) neighbors++; затрудняют чтение всего алгоритма. Тернарные операторы внутри оператора if в одной строке. Аааа..   -  person element11    schedule 11.05.2016
comment
@element11 извините, я это исправлю   -  person ZomoXYZ    schedule 11.05.2016
comment
@adelphus Я сделал это аналогичным образом. Я создаю больше переменных, чем нужно, и использую console.log для их экспорта. Я не могу найти ошибки в коде таким образом.   -  person ZomoXYZ    schedule 11.05.2016
comment
@FrankPuffer Извините, плоскость 100x100, а массивы отсчитываются от 0, а не от единицы, следовательно, 99. Я добавил это объяснение в качестве комментария к коду.   -  person ZomoXYZ    schedule 11.05.2016
comment
Вывод трассировки @Jaketr00 (запись на консоль) не является отладочным. Трассировка часто предоставляет огромные объемы данных для просеивания, что дает очень мало пользы. Отладка заключается в значении переменных прямо сейчас — их сравнении с тем, что, по вашему мнению, должно быть. Если вы хотите разобраться в этом коде (или будущем коде), обучение отладке должно быть вашей первой задачей.   -  person adelphus    schedule 11.05.2016
comment
@ Jaketr00, ты запускаешь это в Chrome или Firefox? Браузерные отладчики JS очень хороши, просты в использовании и очень помогут вам в подобных ситуациях.   -  person adelphus    schedule 11.05.2016
comment
@ 500-InternalServerError Это помогло, спасибо   -  person ZomoXYZ    schedule 11.05.2016


Ответы (1)


ваши правила неверны. Конвей игра жизни.

if on then if(neighbors >3||neighbors<2) turn off.
if off then if(neighbors==3) turn on.

person altruios    schedule 23.09.2020