Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 27.09.2012, 19:38
Аспирант
Отправить личное сообщение для madmax Посмотреть профиль Найти все сообщения от madmax
 
Регистрация: 16.12.2010
Сообщений: 34

Ребята?
Ответить с цитированием
  #3 (permalink)  
Старый 27.09.2012, 19:48
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

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


Вот это место вызывает лёгкое недоумение... Что оно должно делать?
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #4 (permalink)  
Старый 27.09.2012, 20:21
Аспирант
Отправить личное сообщение для madmax Посмотреть профиль Найти все сообщения от madmax
 
Регистрация: 16.12.2010
Сообщений: 34

Это получаем номер строки в которой находится клетка округление понятно зачем а -1 это чтобы отчет был с 0.
Например поле 3*3 текущий элемент 5 то строка 5\3= 1.6 ceil округляет до 2 элемент на 1 строке (отчет от нуля).
Ответить с цитированием
  #5 (permalink)  
Старый 28.09.2012, 03:32
Аспирант
Отправить личное сообщение для madmax Посмотреть профиль Найти все сообщения от madmax
 
Регистрация: 16.12.2010
Сообщений: 34

Отбой я нашел первопричину первооснов.
Ответить с цитированием
  #6 (permalink)  
Старый 28.09.2012, 08:58
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,225

Сообщение от madmax
я нашел первопричину первооснов
Фигасе!
Ответить с цитированием
  #7 (permalink)  
Старый 29.09.2012, 00:29
Аспирант
Отправить личное сообщение для madmax Посмотреть профиль Найти все сообщения от madmax
 
Регистрация: 16.12.2010
Сообщений: 34

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

Последний раз редактировалось madmax, 30.09.2012 в 05:00.
Ответить с цитированием
  #8 (permalink)  
Старый 30.09.2012, 13:46
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

madmax,
щас посмотрел правила в вики, попробую сам написать
Ответить с цитированием
  #9 (permalink)  
Старый 02.10.2012, 01:34
Аспирант
Отправить личное сообщение для madmax Посмотреть профиль Найти все сообщения от madmax
 
Регистрация: 16.12.2010
Сообщений: 34

Второй этап - передача "генов". У каждой клетки есть парный ген = цвет. При создании новой клетки берутся гены всех трех возможных родителей и выбирается 2 гена для новой клетки, и внимание! получаются полосатые клетки)
Вот что получилось 0.2
Ответить с цитированием
  #10 (permalink)  
Старый 03.10.2012, 02:15
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

madmax, что-то не заработало. При попытке поставить цвет клетки выдаёт:
"Uncaught TypeError: Cannot set property '0' of undefined gen_mod_2.html:60"
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск