Игра "Жизнь"

Задание для лабораторной работы по курсу “Основы MATLAB”

Задание

  1. Разработайте функцию next_generation, которая принимает в качестве аргумента массив \(n \times 2\) координат \(n\) клеток колонии и возвращает массив колонии следующего поколения.
function next_gen_colony = next_generation(colony)
  ...
  ...
  ...
  next_gen_colony = ...  
  1. Используя массив ячеек (cell), напишите скрипт, который сохраняет состояние колонии в массив ячеек на протяжении 20 поколений (в каждой ячейке сохраняется массив \(n_g \times 2\), где \(n_g\) - количество клеток в поколении \(g\)).

  2. Используя результаты п. 2, напишите код, который выводит в консоль (command window) массив-строку \(1 \times n_g\), каждый \(i\)-ый элемент которой содержит количество клеток в \(i\)-ом поколении. Код, формирующий массив-строку \(1 \times n_g\), оформите в виде функции, аргументом которой является массив ячеек, полученный в п. 2, а результатом – массив \(1 \times n_g\) количества клеток в поколениях.

  3. При помощи функции plot постройте график изменения количества клеток от поколения к поколению.

  4. Используя результаты п. 2, напишите код, который выводит в консоль (command window) матрицу размерности \(2 \times n_g\), каждый столбец \(i\) которой содержит положение “центра масс” колонии \(i\)-го поколения. Клетка колонии рассматривается как точечная единичная масса. Код, формирующий матрицу \(2 \times n_g\), оформите в виде функции, аргументом которой является массив ячеек, полученный в п. 2, а результатом – матрица \(2 \times n_g\).

  5. При помощи функции plot постройте “траекторию” движения центра масс поколений.

  6. Для поколения 20 найдите две клетки колонии, между которыми максимальное евклидово расстояние: выведите в консоль это расстояние и координаты клеток.

Файл-скрипт, отображающий развитие колонии.

% Начальное состояние колонии
cells = [ 1, 1; 
          1, 2;
          1, 3;
          2, 1;
          3, 2;          
          10 10;
          10 11;
          10 12];

% Координаты вершин квадрата, изображающего клетку 
% (относительно центра клетки)
vert  = [-0.5,-0.5, 0.5,-0.5, 0.5,+0.5, -0.5,+0.5];

% границы области
xlim([-20,20]);
ylim([-20,20]);

% количество поколений
n_gen = 50;

% Для каждого поколения
for i=1:n_gen    
    % очистить изображение
    cla;
    % получить список клеток для следующего поколения
    cells = next_generation(cells);
    % сформировать список полигонов для функции patch 
    cells_vertices = repmat(cells,1,4)+repmat(vert,size(cells,1),1);
    x = (cells_vertices(:,1:2:end))';
    y = (cells_vertices(:,2:2:end))';    
    % нарисовать клетки
    patch(x,y,'r');
    % включить сетку
    grid on;
    % включить рамку
    box on;
    % сохранить кадр
    getframe;
    % подождать 0.2 с
    pause(0.2);
end

Правила игры “Жизнь”

Дано бесконечное поле, разделенное на ячейки. Ячейка может быть свободной или занятой клеткой. Клетки на поле образуют колонию. У каждой ячейки есть восемь ближайших смежных (граничащих) ячеек, которые могут быть заняты другими клетками.

Колония изменяется по следующим правилам:

  1. Если у клетки заняты соседями две или три смежных ячейки, то клетка “выживает” и переходит в следующее поколение, в противном случае она “умирает” от перенаселения или недостатка соседей.
  2. Если рядом с пустой ячейкой находятся ровно три клетки, то на месте этой ячейки появляется новая клетка.
  3. В процессе смены поколения “умирающие” клетки считаются принадлежащими колонии до определения всех новых клеток и клеток, переходящих в следующее поколение. Также и рождающиеся считаются принадлежащими следующему поколению и не оказывают влияние на количество соседей клеток текущего поколения.


© 2024. All rights reserved.

Powered by Hydejack v9.1.6