Показать сообщение отдельно
  #1 (permalink)  
Старый 27.09.2012, 09:28
Аспирант
Отправить личное сообщение для madmax Посмотреть профиль Найти все сообщения от madmax
 
Регистрация: 16.12.2010
Сообщений: 34

Игра "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>

Последний раз редактировалось trikadin, 27.09.2012 в 19:42.
Ответить с цитированием