var chanceOfLiveCells = 0.5;
var gridDomReference = null;
var gridDimension = 15;
var timer = null;
function init() {
gridDomReference = document.getElementById('grid');
idleCells = new Array();
liveCells = new Array();
deadCells = new Array();
drawGrid();
createRandomLiveCells();
}
function drawGrid() {
var counter = 0;
var nodes = new Array();
for(var x = 0; x <= gridDimension - 1; x = x + 1) {
nodes.push('<tr>');
for(var y = 0; y <= gridDimension - 1; y = y + 1) {
nodes.push('<td id="' + counter + '">' + counter + '</td>');
idleCells.push(counter);
counter = counter + 1;
}
nodes.push('</tr>');
}
gridDomReference.innerHTML = nodes.join('');
}
function createRandomLiveCells() {
for(var x = 0; x <= gridDimension - 1; x = x + 1) {
for(var y = 0; y <= gridDimension - 1; y = y + 1) {
if(Math.random() < chanceOfLiveCells) {
liveCells.push(x * gridDimension + y);
idleCells.splice(getCell('idle', x, y), 1);
document.getElementById(getCell('live', x, y)).innerHTML = 'L';
console.log('[Live function] Live cells: ' + liveCells.length + ' | ' + ' Dead cells: ' + deadCells.length
+ ' | Idle cells: ' + idleCells.length + ' | ' + 'getCell: ' + getCell('live', x, y)
+ ' | N: ' + (x * gridDimension + y));
}
else {
deadCells.push(x * gridDimension + y);
idleCells.splice(getCell('idle', x, y), 1);
document.getElementById(getCell('dead', x, y)).innerHTML = 'D';
console.log('[Dead function] Dead cells: ' + deadCells.length + ' | ' + ' Live cells: ' + liveCells.length
+ ' | Idle cells: ' + idleCells.length + ' | ' + 'getCell: ' + getCell('dead', x, y)
+ ' | N: ' + (x * gridDimension + y));
}
}
}
}
function getCell(array, x, y) {
if(x > gridDimension - 1) {
x = 0;
}
if(y > gridDimension - 1) {
y = 0;
}
if(x < 0) {
x = gridDimension - 1;
}
if(y < 0) {
y = gridDimension - 1;
}
switch(array) {
case 'idle':
return idleCells[x * gridDimension + y];
break;
case 'live':
return liveCells[x * gridDimension + y];
break;
case 'dead':
return deadCells[x * gridDimension + y];
break;
}
}
Я переписываю свою реализацию «Игры жизни Конвея», перед этим переписыванием я столкнулся с несколькими проблемами.Я предполагаю, что мой код правильный, но я озадачен этой проблемой.Я провел какое-то исследование, и многие говорят, что это связано с тем, как Chrome «делает вещи».
Вот общий вывод в консоли из выполнения:
gameoflife.js: 54 [Живая функция] Живые клетки: 1 |Мертвые клетки: 0 |Свободные ячейки: 225 |getCell: 0 |N: 0 gameoflife.js: 54 [Живая функция] Живых клеток: 2 |Мертвые клетки: 0 |Свободные ячейки: 224 |getCell: 1 |N: 1 gameoflife.js: 54 [Живая функция] Живых клеток: 3 |Мертвые клетки: 0 |Свободные ячейки: 221 |getCell: 2 |N: 2 gameoflife.js: 54 [Живая функция] Живых клеток: 4 |Мертвые клетки: 0 |Свободные ячейки: 214 |getCell: 3 |N: 3 gameoflife.js: 54 [Живая функция] Живых клеток: 5 |Мертвые клетки: 0 |Свободные ячейки: 206 |getCell: 4 |N: 4 gameoflife.js: 54 [Живая функция] Живых клеток: 6 |Мертвые клетки: 0 |Холостые ячейки: 197 |getCell: 5 |N: 5 gameoflife.js: 54 [Живая функция] Живых клеток: 7 |Мертвые клетки: 0 |Свободные ячейки: 187 |getCell: 6 |N: 6 gameoflife.js: 54 [Живая функция] Живых клеток: 8 |Мертвые клетки: 0 |Свободные ячейки: 169 |getCell: 7 |N: 7 gameoflife.js: 54 [Живая функция] Живых клеток: 9 |Мертвые клетки: 0 |Свободные ячейки: 142 |getCell: 8 |N: 8 gameoflife.js: 54 [Живая функция] Живых клеток: 10 |Мертвые клетки: 0 |Свободные ячейки: 105 |getCell: 9 |N: 9 gameoflife.js: 64 Uncaught TypeError: Невозможно установить для свойства 'innerHTML' значение null
Итак, здесь произошло 10 живых клеток, после которых была предпринята попытка создать мертвую ячейку., но вместо этого он возвращает ошибку.Когда я изменил запись в журнал перед кодом, строка перед ошибкой была такой:
gameoflife: 62 [Мертвая функция] Мертвые клетки: 0 |Живые клетки: 5 |Свободные ячейки: 206 |getCell: undefined |N: 5 gameoflife.js: 47 Uncaught TypeError: Невозможно установить свойство 'innerHTML' для null
Учитывая, что нет никаких отличий от создания живых ячеек, я не уверен, почему это происходит.Но вот еще одна вещь, которая сбивает с толку, с более низким шансом живых клеток, функция, которая создает мертвые клетки, на самом деле работает, и проблема заключается в функции, которая создает живые клетки.Мало того, есть странный паттерн в количестве ячеек в массиве idleCells, учитывая, что я использую функцию splice () только один раз на каждой итерации, чтобы удалить индекс, который находится либо в массиве liveCells, либо в массиве deadCells.
Сначала создается сетка, а затем idleCells заполняется идентификаторами ячеек таблицы.Когда я вызываю метод createRandomLiveCells (), задача этой функции - создавать случайные ячейки, либо мертвые, либо живые.Итак, я ожидаю, что и массив liveCells, и массив deadCells будут составлять количество ячеек таблицы, а массив idleCells пуст, поскольку нет свободных ячеек, поскольку ячейки таблицы либо мертвы, либо живы.
Извините за недокументированный код, я позаботился о том, чтобы он был хорошо выделен и выделен для удобства чтения, но, надеюсь, вы понимаете, что я пытаюсь сделать.помощь.