CelAut v1

Материал из Department of Theoretical and Applied Mechanics
Версия от 13:56, 9 марта 2015; Wikiadmin (обсуждение | вклад) (Замена текста — «</syntaxhighligh>» на «</syntaxhighlight>»)

Перейти к: навигация, поиск
Виртуальная лаборатория > Игра "Жизнь" > Клеточный автомат - версии > CelAut v1

Скачать программу: CelAut_v1_release.zip Текст программы на языке JavaScript (разработчик Цветков Денис): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default"> Файл "CelAut_v1_release.js"

  1 function MainCelAut(canvas) {
  2 
  3     // Предварительные установки
  4 
  5     var context = canvas.getContext("2d");                  // на context происходит рисование
  6     document.oncontextmenu=function(e){return false};       // блокировка контекстного меню
  7 
  8     // *** Задание вычислительных параметров ***
  9 
 10     var fps = 5;             	    // frames per second - число кадров в секунду
 11 
 12     // Выполнение программы
 13 
 14     var w = canvas.width;		    // ширина окна
 15     var h = canvas.height;		// высота окна
 16     var n = 50;                   // количество клеток по горизонтали (желательно, делитель ширины окна)
 17     var m = 50;                   // количество клеток по горизонтали (желательно, делитель высоты окна)
 18     var cellW = w/n;              // ширина клетки
 19     var cellH = h/m;              // высота клетки
 20 
 21     var pause = false;
 22 
 23     // "Жизнь" Конвея: [B = 000100000, L = 001100000]
 24     var B = "000100000";            // геном рождения
 25     var L = "001100000";            // геном выживания
 26 
 27     // Работа с массивом
 28 
 29     var cells;                      // массив клеток
 30     var cellsBuf = [];              // буфер для расчета следующего шага
 31     for (var i = 0; i < n; i++) cellsBuf[i] = [];
 32     function generateRandomField(n, m) {        // каждая клетка заполняется случайным значением жива/мертва
 33         cells = [];
 34         for (var i = 0; i < n; i++) {
 35             cells[i] = [];
 36             for (var j = 0; j < m; j++) {
 37                 cells[i][j] = (Math.random() >= 0.5);
 38             }
 39         }
 40     }
 41 
 42     // Основной цикл программы
 43 
 44     function control() {
 45         step();
 46         draw();
 47     }
 48 
 49     MainCelAut.prototype.changePauseState = function() {          // кнопка паузы
 50         pause = !pause;
 51         if (pause) {
 52             clearInterval(intervalID);
 53 //            document.getElementById('pause').value = "Start";
 54             pause1.value = "Start";
 55         }
 56         else {
 57             intervalID = setInterval(control, 1000/fps);
 58             document.getElementById('pause1').value = "Stop";
 59         }
 60     };
 61 
 62     // Расчетная часть программы
 63 
 64     // функции, обеспечивающие периодичность системы
 65     function next(i, n) {if (i == (n-1)) return 0; else return i+1;}
 66     function prev(i, n) {if (i == 0) return n-1; else return i-1;}
 67 
 68     function step(){                             // то, что происходит каждый шаг времени
 69         // копирование массива cells в cellsBuf
 70         for (var i0 = 0; i0 < n; i0++)
 71             for (var j0 = 0; j0 < m; j0++)
 72                 cellsBuf[i0][j0] = cells[i0][j0];
 73 
 74         for (var i = 0; i < n; i++) {
 75             for (var j = 0; j < m; j++) {
 76 
 77                 // подсчет количества живых клеток вокруг рассматриваемой клетки
 78                 var near = 0;
 79                 if (cellsBuf[prev(i, n)] [prev(j, m)])   near++;
 80                 if (cellsBuf[prev(i, n)] [j])            near++;
 81                 if (cellsBuf[prev(i, n)] [next(j, m)])   near++;
 82                 if (cellsBuf[i]          [prev(j, m)])   near++;
 83                 if (cellsBuf[i]          [next(j, m)])   near++;
 84                 if (cellsBuf[next(i, n)] [prev(j, m)])   near++;
 85                 if (cellsBuf[next(i, n)] [j])            near++;
 86                 if (cellsBuf[next(i, n)] [next(j, m)])   near++;
 87 
 88                 if (cellsBuf[i][j])                     // рассматриваемая клетка жива
 89                     cells[i][j] = (L[near] == '1');     // проверка условия выживания по биному L
 90                 else                                    // рассматриваемая клетка мертва
 91                     cells[i][j] = (B[near] == '1');     // проверка условия рождения по биному B
 92 
 93             }
 94         }
 95     }
 96 
 97     // Рисование
 98 
 99     function draw(){
100         context.clearRect(0, 0, w, h);          // очистить экран
101         for (var i = 0; i < n; i++){
102             for (var j = 0; j < m; j++){
103                 if (cells[i][j]){
104                     context.beginPath();
105                     context.rect(i*cellW, j*cellH, cellW, cellH);
106                     context.closePath();
107                     context.fill();
108                 }
109             }
110         }
111     }
112 
113     // Запуск системы
114     generateRandomField(n, m);                  // сгенероровать поле
115     var intervalID = setInterval(control, 1000/fps);
116 
117 }

Файл "CelAut_v1_release.html"

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title>Cellular automaton</title>
 5     <script src="CelAut_v1_release.js"></script>
 6 </head>
 7 <body>
 8     <canvas id="canvasCelAut" width="600" height="600" style="border:1px solid #000000;"></canvas><br>
 9     <script type="text/javascript">var app = new MainCelAut(document.getElementById('canvasCelAut'));</script>
10     <input id="pause1" type="button" name="" style="width: 60px" onclick="app.changePauseState();return false;" value="Stop"/>
11 </body>
12 </html>

</toggledisplay>