Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Игра "life" я чуствую себя дураком. (https://javascript.ru/forum/misc/31944-igra-life-ya-chustvuyu-sebya-durakom.html)

madmax 27.09.2012 09:28

Игра "life" я чуствую себя дураком.
 
Привет. Решил написать для общего развития свою реализацию игры жизнь. Конвея если не ошибаюсь, но столкнулся со странной проблемой:
Просчитывая соседий я обращаюсь к элементам массива 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>

madmax 27.09.2012 19:38

Ребята?

trikadin 27.09.2012 19:48

var stroka =   Math.ceil(w/size_grid)-1;//строка в которой находится клетка


Вот это место вызывает лёгкое недоумение... Что оно должно делать?

madmax 27.09.2012 20:21

Это получаем номер строки в которой находится клетка округление понятно зачем а -1 это чтобы отчет был с 0.
Например поле 3*3 текущий элемент 5 то строка 5\3= 1.6 ceil округляет до 2 элемент на 1 строке (отчет от нуля).

madmax 28.09.2012 03:32

Отбой я нашел первопричину первооснов.

ksa 28.09.2012 08:58

Цитата:

Сообщение от madmax
я нашел первопричину первооснов

Фигасе! :lol:

madmax 29.09.2012 00:29

Вот что получилось на первом этапе. Так сказать 0.1.

Dim@ 30.09.2012 13:46

madmax,
щас посмотрел правила в вики, попробую сам написать :D

madmax 02.10.2012 01:34

Второй этап - передача "генов". У каждой клетки есть парный ген = цвет. При создании новой клетки берутся гены всех трех возможных родителей и выбирается 2 гена для новой клетки, и внимание! получаются полосатые клетки)
Вот что получилось 0.2

trikadin 03.10.2012 02:15

madmax, что-то не заработало. При попытке поставить цвет клетки выдаёт:
"Uncaught TypeError: Cannot set property '0' of undefined gen_mod_2.html:60"


Часовой пояс GMT +3, время: 20:35.