Привет. Решил написать для общего развития свою реализацию игры жизнь. Конвея если не ошибаюсь, но столкнулся со странной проблемой:
Просчитывая соседий я обращаюсь к элементам массива grid (клетки поля) ища соседей где (1 клетка жива 0 пусто) справа и снизу я нахожу без проблем значение - там идет обращение x+1 где х текущая позиция и x + y где y размер поля (3*3 то y=3). А при запросе соседей слева и снизу то есть обращени к элементам с отниманием 1 и y соответственно от текущей позиции дает неверные результаты. Дает 0 хотя я точно знаю что там 1. Я бился над проблемой часа 4. Выручайте.
Я не писал алгоритм проверки по диаганали так как столкнулся с этой проблемой, смысла тогда нет .
<html>
<head>
<title>x</title>
</head>
<body>
<canvas height='1000' width='1000' id='example'>Обновите браузер</canvas>
<script>
var example = document.getElementById("example");
var ctx = example.getContext('2d');
//_---------------------
var size_grid = 3; //размера поля х*х
var grid = new Array();//массив со всеми клетками
var rules_0 = new Array(0,0,0,1,0,0,0,0,0,0); //правила рождения для ячейка 0
var rules_1 = new Array(0,0,0,1,1,0,0,0,0,0);//ячейка равно 1
for(i=1;i<=size_grid*size_grid;i++){
grid[i]=Math.floor(Math.random()*2);
// заполнение массива произвольно 1 0
}
function draw(){ // отрисовка клеток это работает
ctx.clearRect(0,0,1000,1000);
var st=1;
for(i=1;i<=size_grid;i++){//stroka
for(e=1;e<=size_grid;e++){//stolbec
if(grid[st]==1){ctx.fillRect(e*20,i*20,10,10);
}//if
st++;
}//for1
}//for2
} //draw end
function life(){
var cicle = size_grid*size_grid;
for(w=1;w<=cicle;w++){
var sosedi_=0; //количиство соседей у клетки
var stroka = Math.ceil(w/size_grid)-1;//строка в которой находится клетка
var mesto = w-(stroka*size_grid);//порядковое место в строке (столбец)
if(mesto<size_grid){sosedi_+=grid[w+1]; } //проверка есть ли сосед справа
if(mesto>1){sosedi_+=grid[w-1];}//сосед слева не рабатоет
if(stroka>0){sosedi_+=grid[w-size_grid];} //наверху тоже
if(stroka<size_grid-1){sosedi_+=grid[w+size_grid];} //снизу а это пашит
if(grid[w]==0){grid[w]=rules_0[sosedi_];} //вынесние вердикта жить или не жить
if(grid[w]==1){grid[w]=rules_1[sosedi_];}
}//for end
draw(); //отрисовка сцены
}//function end
//setInterval(life,1000);
//вызов просчета жизни
life();
</script>
</body>
</html>