По какой-то причине мой алгоритм 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);
Код будет в основном
- сделать доску случайным образом
- 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 и т. д., чтобы убедиться, что правила, которые я использую, неверны, но я могу не нахожу ничего говорящего по-другому.
Итак, мой вопрос: правильны ли правила, которые я использую? Если они верны, есть ли что-то явно неправильное в моем коде?
if (RxC[(y-1<0?99:y-1)][(x+1>99?0:x+1)]) neighbors++;
затрудняют чтение всего алгоритма. Тернарные операторы внутри оператора if в одной строке. Аааа.. - person element11   schedule 11.05.2016console.log
для их экспорта. Я не могу найти ошибки в коде таким образом. - person ZomoXYZ   schedule 11.05.2016