Клеточный автомат в excel

Рейтинг: 3.67. Голосов: 3.

Запись от bedvit размещена 01.03.2019 в 20:55

Обновил(-а) bedvit 18.07.2019 в 12:35


Зацепила тема, реализовал довольно шустрый (для Excel 2010 и выше) алгоритм.
То, что вышло — прилагаю.

Функционал:
1. Переключатель «гибель клеток на границе — 0 / закольцованные координаты — 1 «
2. Счетчик поколений
3. Замедление расчета задаваемое в секундах, с дробной частью (к примеру — 0,11 сек.)
4. Выделение ячеек — левой кнопкой, закрашивание выделенного или отдельной ячейки — правой.
5. Поле для жизни 500*500 клеток (поэтому версия №5)

Предустановленная модель в файле и на рис.
1. Стреляет «Планерное ружьё Госпера» -слева и ружье «B-52 bomber» — правее (№2 на рис.)
2. Летящие планеры, поворачивает на 90 градусов — Отражатель «Snark» — №3 на рис.
3. «Планер P60» — представляет собой осциллятор периода 60, состоящий из планера, отраженного двумя пятиугольниками (планер летает между двумя «Pentadecathlon») — №4 на рис.
4. Планеры («Glider»), стрелками указаны направления полета.
5.Что бы планеры не улетали их жрут пожиратели «Eater 1» — №1 на рис.

Запускаем — смотрим движение описанное выше и отмеченное на прилагаемом рисунке.

В дальнейшем развивать посчитал нецелесообразно, все равно, на больших объемах — медленно выходит.
Решил писать свою программу.

Миниатюры

Нажмите на изображение для увеличения
Название: Life.PNG
Просмотров: 336
Размер:	162.5 Кб
ID:	5258
 

Изображения

Всего комментариев

Скриншот листа Excel с динамической моделью системы

Модель клеточного автомата, реализованная средствами VBA в Excel (с использованием модуля класса) 

В таблице произвольного размера клетки могут быть в трех состояниях: пустая (без цвета), травоядное (зеленый цвет ячейки), хищник (красный цвет ячейки).  

Поведение системы характеризуется следующими параметрами:

  • особь может переместиться на любую клетку, имеющую с данной общую сторону. Направление выбирается случайно из возможных свободных.
  • особь может оставить потомство в той клетке, из которой она переместилась. Потомство появляется периодически, период является параметром.
  • если особь является «хищной», то она может поглотить свою жертву, при этом перемещаясь на место жертвы.
  • особь живет ограниченное количество времени, называемое временем жизни особи – так же параметр.
  • если «хищная» особь не находит себе пищи в течение определенного времени (называемого временем голодной смерти), то она погибает.
  • время голодной смерти является параметром.

Для запуска программы нажмите зелёную кнопку.

Предварительно вы можете изменить параметры в желтых ячейках.



Задание:

Создать и визуализировать математическую модель распространения лесного пожара в Excel.
Модель лесного пожара Клеточный автомат

    Условия:

  • поле 30 на 30 клеток;
  • одна клетка — один шаг и одно дерево;
  • вокруг горящего дерева есть 8 ближайших клеток, на которые может перейти пожар,
  • состояние дерева: горящее — красное, сгоревшее — черное, несгоревшее — зеленое.
  • Загорится ли дерево (вероятность) зависит от направления ветра (всего 8 направлений);
  • Вероятность возгорания, направление ветра и скорость ветра выставляется произвольно в начале программы,
    и являются исходными данными для формирования правил клеточного автомата.

Решение:

    Правила для клеток автомата:

  1. Зеленая клетка может превратиться только в «красную» по вероятностному закону, если в соседях у нее красная;
  2. Красная – на следующем шаге, превращается в черную;
  3. Черная никогда не меняется.
    В теории в автоматах существуют два принципиально разных вида клеток (по параметрам Причина-Следствие):

  1. Клетка-приемник – использует данные о состояниях своих соседей и в конечном итоге изменяет свое состояние
    (как правило, для комплексного учета влияния соседей)
  2. Клетка-причина – влияет на соседей и, в конечном счете, изменяет их состояние или создает предпосылки
    для такого изменения (и не исключено, что и свое).

В нашем случае, проще и удобнее использовать второй вид клеток, а для ускорения процесса расчета провести трансформацию правил.
Самые сложные правила отдадим красной клетке. Матрица вероятностей «поджога соседей» должна учесть
и скорость, и направление ветра, и влажность леса. Такая клетка как бы переводит соседние зеленые клетки
в новое состояние (так более реально выглядит пожар). И сама тут же гаснет. В этом случае правила для
зеленых и черных клеток – пусты.

Процесс пересчета состояний:
Цикл перебора клеток бежит пока не встретит «красную» в массиве. В самом массиве сразу ничего не меняется,
а лишь проверяются соседи и если среди них есть «зеленая», то в нее бросается «Искра» (функция RND).
Клетка, возможно, загорится, а возможно и нет. Изменения, если произойдут, зафиксируются в специальной коллекции.
Матрица вероятностей «поджога соседей» формируется таким образом, что «красные» клетки бросает искры в
основном по направлению ветра – и только на «зеленые» соседние клетки.
После окончания цикла очередного шага, вносим изменения в массив, одновременно очищая «коллекцию изменений».

А это чуть усложненный вариант, позволяющий учитывать характер (план) растительности на участке местности и характеристики пород деревьев с точки зрения устойчивости к пожарам…
Большинство лиственных пород имеют пониженный коэффициент возгорания и являются естественным барьером на пути распространения огня в лесу…

Моделирование насаждений препятствующих распространению пожара в лесу

Задать схему насаждений для моделирования распространения огня при различных направлениях и скоростях ветра можно при помощи этих не сложных и интуитивно понятных элементов управления

Управление моделированием насаждений препятствующих распространению пожара в лесу

Еще есть Клеточный автомат на Delphi 7 ! Не пожар… Как игра «Жизнь»…

И клеточный автомат для маркетинговых исследований распространения на рынке двух товаров, отличающихся ценой и качеством. Изменяя параметры, можно видеть, как один товар вытесняется с рынка другим… с различной скоростью…

Другие примеры на языке «Delphi»

Если на этой странице не нашлось того, что Вы так искали…

        
Не расстраивайтесь, не все потеряно… Смело щелкайте…

       телефон:

+7(919) 572-59-92
+7(987) 848-79-61

Чтобы
убедить читателя в том, что, используя
возможности электронных
таблиц Excel,
любой
начинающий пользователь мо­жет
заниматься клеточным моделированием,
рассмотрим одну из реализаций игры
«Жизнь».

Клетки
в исходной таблице Excel
слишком
велики для на­шей
задачи. Поэтому придадим им вид небольших
квадратов. В качестве
примера возьмем игровое поле 5×5,
хотя увеличение размера в несколько
раз не требует никаких усилий. Отведем
для игры клетки В2 : F6.

Если
клетка жива, то в ячейку запишем 1, если
мертва, то О. Зададим
произвольное начальное состояние. Далее
нам понадобят­ся
две вспомогательные таблицы. В ячейках
Н2 : L6
будет
хра­ниться
«потенциал» клеток. Для вычисления
потенциала клет­ки
В2 введем в ячейку Н2 следующую формулу:

=
СУММ(А1 : СЗ) — В2 (14.1)

В
данном случае подсчитывается число
живых клеток в окрест­ности
клетки В2 (окрестность по Муру). Закончив
ввод этой форму­лы
нажатием клавиши Enter,
установим
курсор на правый ниж­ний
угол клетки Н2 и размножим формулу (14.1)
сначала до ячейки L2,
а
затем вниз, заполнив всю таблицу Н2 : L6.
(Обратите
внима-

266

ние
на то, как следует учитывать состояние
клеток, граничных с таблицей
В2 : F6.
В
данном случае они остаются пустыми, но
воз­можны
и более сложные формы задания граничных
условий.)

Сложнее
всего задать правило поведения клеточного
автома­та.
Запишем в ячейку BlO
правило
поведения автомата В2, ис­пользуя
логические функции:

=
ЕСЛИ (ИЛИ (Н2 >3;
Н2
<2); О; ЕСЛИ (Н2 = 3; 1;

ЕСЛИ(Н2
= 2;В2;-1))) (14.2)

Первое
ЕСЛИ в (14.2) означает, что клетка будет
мертва при потенциале
Н2 = О, 1, 4, 5, 6, 7; второе ЕСЛИ — что при
потенциа­ле
3 клетка будет живой, третье ЕСЛИ — что
при потенциале 2 состояние автомата в
клетке В2 не меняется. Наконец, выраже­ние
(-1) означает, что при невыполнении всех
предыдущих ус­ловий в ячейку BlO
будет
записано значение (-1). (Заметим, что в
данном случае этот вариант невозможен.)

Запись
логической функции требует аккуратности.
Однако сле­дует
учесть, что для освоения Excel
необходимо
умение работать с логическими
функциями.

Функция
(14.2) записывается только в одну ячейку
BlO,
да­лее
она размножается вправо до ячейки FlO,
а
затем вниз, за­полняя всю таблицу
B10:F14.
Таким
образом, если в таблице B2:F6
мы
имеем состояние системы в момент t,
то
в таблице B10:F14
вычисляется
состояние системы в следующий момент
t
+
1. Теперь необходимо скопировать таблицу
B10:F14
в
табли­цу
B2:F6.
Делается
это следующим образом.

Шаг
1.
Выделяем
таблицу BlO:
F14.

Шаг
2.
В
меню «Правка» выбираем команду
«Копировать».

Шаг
3.
Устанавливаем
курсор в ячейку В2.

Шаг
4.
В
меню «Правка» выбираем команду
«Специальная вставка». В раскрывшейся
дополнительной вкладке следует из
первого
столбца «Вставить» выбрать строку
«Значения» и нажать кнопку
OK.
В
итоге в таблице B2:F6
появится
картинка нового состояния
системы.

Процедуру
копирования можно существенно ускорить,
если подготовить соответствующий
макрос. Делается это очень про­сто.
В Excel
2000
в меню «Сервис» выбираем «Макрос»,
а затем ко­манду
«Начать запись». В раскрывшейся
вкладке можно дать имя макросу
либо оставить предлагаемый вариант
«Макрос 1». На­значаем макросу
клавишу быстрого вызова, например Ctrl
+
е. Нажимаем OK.
Появится
таблица Excel,
и
на экране возникнет

267

кнопка
«Остановить макрос». Выполним
указанные выше опе­рации (шаги 1-4) и
нажмем кнопку «Остановить». Запись
мак­роса будет закончена.

Теперь
переход к следующему временному такту
будет про­исходить
после каждого нажатия комбинации клавиш
Ctrl
+
ей можно
спокойно наблюдать за эволюцией системы.

Столь
подробное описание процесса построения
модели дано лишь
с той целью, чтобы читатель немного
освоил электронные таблицы
и понял, насколько легко могут быть
построены значи­тельно
более сложные и реалистичные модели.

Ясно,
что легко усложнить формулу расчета
потенциала, из­менить
окрестность, ввести в расчет случайные
факторы. Учет гео­графических
особенностей региона может заставить
вас отказать­ся
от простой квадратной решетки. В ней
могут появиться дырки, а
граница вполне может быть извилистой.
Совершенно необяза­тельна
унификация правил поведения автоматов.
Например, вы можете
для центральных клеток задать одни
правила, а для пери­ферийных
— другие.

14.3.
Приложения клеточных моделей

Модель
электорального процесса. В цикле работ
Т.Брауна рассматривается ряд контекстуальных
моделей электорального процесса.
Он считает, что избирательные предпочтения
индиви­да
определяются установками его ближайшего
окружения [8]. В одной
из моделей предполагается, что индивид
принимает реше­ние голосовать в момент
t
+
1
за республиканцев или демократов в
соответствии с правилом простого
большинства. Учитываются взгляды
индивида и четырех его ближайших соседей
в момент t
(окрестность
фон Неймана). Если из пяти человек трое
или боль­ше
поддерживают демократов, то индивид
также голосует за де­мократов. Если
большинство составляют республиканцы,
то ин­дивид
и в этом случае разделяет точку зрения
большинства.

В
данном случае клеточный автомат имеет
два состояния: 1 — голосование
за республиканцев; О — голосование за
демократов. Нетрудно
заметить, что указанная модель может
быть реализова­на
на ЭВМ даже проще, чем рассмотренная
выше игра «Жизнь».

Браун
и его коллеги проводили вычислительные
эксперименты на
решетке 128 х 128, при этом начальное
распределение задава­лось
случайным образом. Модель исследовалась
на большом вре­менном
горизонте — до 20 000 тактов. Оказалось,
что партийная

268

борьба
приводит к очень сложным конфигурациям,
существенно зависящим
от исходного распределения. По мнению
Брауна, дан­ная
модель относится к четвертому классу
клеточных автома­тов, так же как и
игра «Жизнь». Однако детального
исследова­ния модели пока не проводилось
и нахождение замечательных конфигураций
в политической «Жизни», таких как
«блок», «змея»,
«катапульта», еще впереди.

Рассмотрим
обобщение модели Т.Брауна на случай,
когда учи­тываются взгляды индивида
и восьми его ближайших соседей
(ок­рестность
Мура). Если из девяти человек пятеро или
больше под­держивают
демократов, то индивид также голосует
за демократов. Если
большинство составляют республиканцы,
то индивид и в этом случае
разделяет точку зрения большинства.

Покажем,
что данная модель может быть реализована
на ЭВМ с помощью
электронных таблиц даже проще, чем игра
«Жизнь». Придадим
клеткам исходной таблицы Excel
вид
небольших квад­ратов
(с помощью форматирования). Отведем для
модели поле 10
х 10 (клетки В2: К11) и зададим в нем начальное
состояние.

Перейдем
на лист 2 и введем в ячейку В2 формулу:

=ЕСЛИ
(СУММ (Лист 1!А1 :СЗ) > 4; 1; 0)

Данная
логическая функция вычисляет «потенциал»
ячейки В2
— в нашем случае число сторонников
республиканцев. Если это
число больше 4, то ячейке В2 присваивается
1 (автомат голо­сует
за республиканцев), в противном случае
присваивается 0 (го­лосование
за демократов).

Размножим
эту формулу на все ячейки В2:К11. Получим
но­вое состояние системы, скопируем
его и вставим с помощью ко­манды
«Специальная вставка» только
«значения» в те же ячейки на
листе 1. Запишем процедуру копирования
в виде макроса. (Пер­вым
шагом при записи макроса должен быть
переход с листа 1 на лист
2.) Назначим макросу клавиши быстрого
вызова, например Ctrl+e.
Теперь
переход к следующему временному такту
будет про­исходить
после каждого нажатия этой комбинации
клавиш [4].

Отметим,
что для длительного прогона модели не
требует­ся много раз нажимать кнопки.
Достаточно одного нажатия. В
Excel
2000
для выхода в режим редактирования
макроса следу­ет
в меню «Сервис» выбрать команду
«Макрос», затем «Макро­сы…»
и «Изменить». На экране вы увидите
подпрограмму. Ин­тересно,
что вы составили эту программу сами.
Точнее, это сделал автоматически Excel,
пока
вы формировали макрос. Вставим в этот
макрос цикл следующим образом. После
пер-

269

вой
строки (Sub
Макрос)
вставьте строку For
i =
1 То 100, а перед последней строкой (End
Sub) вставьте
строку Next
i. Теперь
одно нажатие клавиш Ctrl
+
е заставит модель проде­лать 100 шагов.

Изложенный
подход основан на методологии
иконологичес-кого
моделирования (см. § 12.1). Отметим, что в
данном случае возможности
моделирования существенно расширяются
за счет использования макросов. Умение
слегка скорректировать текст макроса,
вставляя операторы цикла и условного
перехода, дает возможность
пользователю самостоятельно строить
сложные ком­пьютерные
модели, не прибегая к помощи программистов.

Модели
диффузии инноваций.
Индийские
ученые предложи­ли
следующую модель клеточных автоматов
[7]. Каждый индивид соответствует одной
клетке, которая может находиться в двух
со­стояниях:
1 — новинка принята; О — новинка пока
еще не приня­та.
Предполагается, что автомат, приняв
новинку один раз, ос­тается
ей верен до конца.

Автомат
принимает решение о принятии новинки,
ориенти­руясь
на мнение ближайших соседей (используется
окрестность Мура).
Пусть в окрестности данной клетки
имеется т
сторонни­ков
новинки. Генерируется случайное число
р
вероятность
принятия
новинки. Если рт
> г,
где
г
фиксированное
порого­вое
значение, то автомат принимает
нововведение, в противном случае новинка
пока отвергается.

Авторы
модели полагают, что вероятность принятия
новин­ки
со временем должна уменьшаться, так как
степень новизны постепенно
снижается.

Моделирование
проводилось на решетке 10Ox
100.
Эволюция системы
рассматривалась на временном горизонте
в 100 тактов, если
вероятность принятия новинки р
=
0,1, и 130 тактов при р
=
0,05. Для каждого случая осуществлялось
50 прогонов моде­ли.
Проводилось также исследование влияния
на поведение мо­дели начального
распределения сторонников новшества.

Для
каждого временного такта t
подсчитывалось
число авто­матов,
принявших инновацию (п().
Приводимые авторами графи­ки
функции п(
показывают хорошую степень совпадения
с моде­лью
Фишера — Прея (см. § 9.2).

По
мнению индийских ученых, клеточное
моделирование позволяет
строить значительно более реалистические
модели рын­ка,
чем традиционные подходы к исследованию
диффузии инно­ваций.
Главное достоинство этого подхода
заключается в воз­можности эмпирической
оценки фактора р
вероятности

270

принятия
новинки. Для этого можно использовать
данные со­циологических опросов и
материалы фокус-групп. Другое пре­имущество
предлагаемого подхода заключается в
возможности получения оценок необходимого
числа сторонников и их про­странственного
распределения в начальный момент
кампании.

»
• »

Исследования
последних лет показывают, что многие
физичес­кие
и информационные процессы прекрасно
описываются кле-точно-автоматными
моделями. Оказалось, что если к клетке
при­делать
часы, то можно получить новые многообещающие
формы представления
процессов, протекающих в живой и неживой
при­роде
[1]. Очевидно, что, снабдив клетку даже
примитивным искус­ственным
интеллектом, можно исследовать более
глубокие слои социальной
реальности. Весьма перспективным
направлением ис­следований
является клеточное моделирование
процессов коопе­рации
и конкуренции с использованием для
принятия решений моделей
теории игр.

Читателю
может показаться, что в данной главе
рассматрива­ются
разрозненные, ничем не связанные модели
из различных об­ластей
науки, практики и сферы развлечений.
Однако более вни­мательное отношение
к рассматриваемым процессам показывает,
что
они все тесно взаимосвязаны. Игра
становится Жизнью, Жизнь уже стала
Маркетингом, Маркетинг становится
Искус­ством (может быть единственным).
И все эти процессы можно и нужно
моделировать.

Задачи
и упражнения

1.
Рассмотрите различные определения
понятия «окрестность клет­ки».
Какие еще модификации «окрестности»
целесообразно исследо­вать?

2.
Позволяет ли клеточное моделирование
исследовать географичес­кие
особенности региона?

3.
Можно ли применить клеточное моделирование
для анализа ком­муникативных
процессов?

4.
Реализуйте на ЭВМ модель электорального
поведения Брауна. Используйте в своей
модели различные виды окрестностей.
Как это повлияет на поведение модели?

5.
Бесконечно расширяет возможности
клеточного моделирования использование
цвета. Дж.Касти полагает, что с помощью
клеточных автоматов можно анализировать
творчество художников. В работе [9] он
рассматривает картину известного
голландского абстракциониста Пи­та
Мондриана «Шахматная доска. Яркие
цвета». Картина представляет

271

собой,
по мнению Касти, прямоугольную решетку
из 256 клеток, рас­крашенных в восемь
цветов. Касти формулирует следующие
задачи:

а)
можно ли построить клеточный автомат,
который бы из любой начальной конфигурации
строил картину Мондриана?

б)
можно ли построить «фильтр»,
позволяющий различать индиви­дуальные
стили художников?

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

Выработайте
оптимальную маркетинговую стратегию.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Развлекая — поучай.
(Гораций)

Если вы уже имели какой-то опыт программирования в прошлой жизни (привет, Basic, Pascal и т.д.), то, скорее всего, уже прошли этап «игрописательства». Однако, тряхнуть стариной и размять мозги вполне можно. Если же вы никогда не программировали игр, то никогда не поздно начать этот весьма увлекательный процесс. Всё, что нам потребуется — это Excel (любой версии) и 15-20 минут времени для начала.

Тренироваться будем на известной в узких кругах программистов игре «Жизнь» (Life). Её придумал британский математик Джон Конвей еще в 1970 году на основе работ легендарного Джона фон Неймана — прадедушки всех современных компьютеров. Если вы не сталкивались с ней раньше — не проблема, правила можно объяснить за полминуты:

  • Игра идет на большом (иногда даже бесконечном) поле в клеточку («вселенной»). Как вы понимаете, Excel для такого подходит идеально :)

  • В один момент времени каждая клетка может быть в двух состояниях — живой (обозначим её каким-нибудь значком или просто единичкой) или же мертвой (пустой). Начальное состояние всех клеток в игре называют первым поколением.

  • Если брать блок клеток 3х3 с текущей клеткой в середине, то вокруг неё оказывается 8 клеток-соседей. Дальнейшая судьба клетки зависит от того, сколько именно живых клеток (N) окажется в этой окружающей области. Вариантов несколько:

  • Правила игры

  • Если клетка была пустая (мертвая), но у нее есть ровно 3 живых соседа, то в ней зарождается жизнь.
  • Если клетка живая, но у неё меньше 2 соседей, то она умирает от одиночества.
  • Если клетка живая, но у неё больше 3 соседей, то она умирает от перенаселения.
  • Если клетка живая и у нее 2-3 соседа, то клетка продолжает жить.

Вот, собственно, и все правила. Можно даже сказать, что всё это неправильно называть игрой, т.к. здесь нет соперников в привычном понимании. Вы расставляете первое поколение, запускаете процесс и затем просто наблюдаете за развитием вашей «колонии» на протяжении нескольких поколений.

Однако, не стоит недооценивать обманчивую простоту этой логики — количество комбинаций, сценариев игры и многообразие фигур в такой игровой вселенной поражает своим разнообразием и поистине бесконечно. В математике подобные модели называют клеточными автоматами. А самое интересное, что реализовать подобную модель можно в любой версии Excel буквально на 20 строчках кода.

Поехали.

Шаг 1. Готовим игровое пространство

Создадим в новой книге три листа:

  • game — это будет основной листы игры, где мы будем наблюдать за развитием нашей «колонии»
  • next — этот лист будет формировать следующее поколение, которое затем придет на смену текущему
  • start — на этом листе мы будем задавать начальную конфигурацию, т.е. первое поколение в нашей игре

На каждом листе (можно выделить их заранее, удерживая клавишу Shift или Ctrl, чтобы не повторять трижды одни и те же действия), разметим игровое поле размером, допустим, 30 на 30 ячеек. Впоследствии размер поля можно будет подправить в соответствии с вашими аппетитами и мощью вашего ПК:

Игровое пространство

На листе start разметим с помощью единичек первое поколение любым желаемым образом:

Первое поколение

Шаг 2. Пишем макрос

Теперь пришла пора расчехлить наш VBA и написать макрос, который и будет делать всю работу, а именно:

  1. Копировать первое поколение с листа start на лист game.
  2. Проходить по ячейкам игрового поля на листе game и проверять окружающих соседей (блок 3х3) для каждой из них.
  3. В зависимости от результатов проверки помечать на листе следующего поколения next ту же ячейку как живую (1) или мертвую (пусто).
  4. Копировать получившееся новое поколение с листа next вместо текущего на листы игры game.
  5. Повторять пункты 2-4 несколько раз, сменяя одно поколение другим и отображая на экране изменения в нашей «колонии».

Для начала откроем редактор Visual Basic на вкладке Разработчик (Developer). Если такой вкладки не видно, то её нужно будет сначала отобразить через Файл — Параметры — Настройка ленты (File — Options — Customize Ribbon), включив соответствующий флажок.

В открывшемся окне редактора создадим новый модуль с помощью команды меню Insert — Module, а затем скопируем и вставим туда код нашего макроса:

Sub Life()
    Dim cell As Range, n As Integer, i As Integer
    
    Set rGame = Worksheets("Game").Range("B2:AE31")
    Set rStart = Worksheets("Start").Range("B2:AE31")
    Set rNext = Worksheets("Next").Range("B2:AE31")
    Set wNext = Worksheets("Next")

    rStart.Copy Destination:=rGame
    
    For i = 1 To 50
        rNext.ClearContents
        For Each cell In rGame.Cells
            n = WorksheetFunction.CountA(cell.Offset(-1, -1).Resize(3, 3)) - cell.value
            If cell = "" And n = 3 Then wNext.Cells(cell.Row, cell.Column) = 1
            If cell = 1 And (n = 2 Or n = 3) Then wNext.Cells(cell.Row, cell.Column) = 1
            If cell = 1 And (n < 2 Or n > 3) Then wNext.Cells(cell.Row, cell.Column) = ""
        Next cell
        rNext.Copy Destination:=rGame
    Next i
End Sub

Теперь давайте разберем его построчно для понятности:

Поскольку в коде нам придется несколько раз ссылаться и много раз работать с диапазонами игрового пространства (B2:AE31) на каждом из трёх листов книги, то имеет смысл сразу оформить их как переменные. Это делается в блоке:

Set rGame = Worksheets("Game").Range("B2:AE31")
Set rStart = Worksheets("Start").Range("B2:AE31")
Set rNext = Worksheets("Next").Range("B2:AE31")

Заодно мы создаем ещё и переменную wNext, которая ссылается на весь лист next целиком — это нам тоже пригодится в будущем:

Set wNext = Worksheets("Next")

Затем, перед началом игры, мы должны перенести первое поколение с листа start на лист game. Это выполяется командой прямого копирования с использованием уже созданных переменных:

rStart.Copy Destination:=rGame

Поскольку мы хотим прокрутить в нашей игре не одно, а несколько (например, 50 для начала) поколений, то дальнейшие действия заключены в цикл:

For i = 1 to 50
...
Next i

А внутри этого цикла мы, во-первых, сначала очищаем рабочее пространство на листе next для формирования следующего поколения:

rNext.ClearContents

А, во-вторых, запускаем вложенный цикл прохода по всем ячейкам игровой вселенной на листе game, чтобы проверить каждую из них — это реализовано циклом прохода по коллекции:

For Each cell in rGame.Cells
...
Next cell

Ссылка на очередную проверяемую ячейку будет храниться в переменной cell. Для этой ячейки нам нужно сначала построить окрестность 3х3 с ней в середине. Это выполняется с помощью конструкции:

cell.Offset(-1, -1).Resize(3, 3)

Здесь метод Offset(-1,-1) виртуально сдвигает текущую проверяемую ячейку на одну строку вверх и на один столбец влево, а потом метод Resize(3,3) опять же виртуально растягивает эту одну ячейку до новых размеров 3 на 3:

Offset и Resize

Чтобы посчитать количество заполненных ячеек в полученной окрестности применяется функция рабочего листа СЧЁТЗ (COUNTA), которую в VBA можно вызвать с помощью объекта WorksheetFunction. Таким образом количество живых соседей в окружающей текущую ячейку области 3 на 3 мы получаем выражением (не забыв вычесть из полученного количества текущую ячейку):

n = WorksheetFunction.CountA(cell.Offset(-1, -1).Resize(3, 3)) - WorksheetFunction.CountA(cell)

Дальше нам нужно проверить полученное количество соседей и пометить на листе следующего поколения текущую ячейку как живую или мертвую, согласно правилам игры. Это выполняет блок из трёх проверок:

If cell = "" And n = 3 Then wNext.Cells(cell.Row, cell.Column) = 1
If cell = 1 And (n = 2 Or n = 3) Then wNext.Cells(cell.Row, cell.Column) = 1
If cell = 1 And (n < 2 Or n > 3) Then wNext.Cells(cell.Row, cell.Column) = ""

Когда цикл прохода по ячейкам будет завершен, то сформированное следующее поколение с листа next нужно скопировать на место текущего на листе game — делаем это уже знакомой конструкцией:

rNext.Copy Destination:=rGame

Вот, собственно, и вся логика.

Осталось вернуться в Excel на лист game, запустить нашу игру через вкладку Разработчик — Макросы (Developer — Macro) и насладиться процессом развития нашей колонии:

Игра Жизнь Life

Ссылки по теме

  • Что такое макросы и как их программировать в Microsoft Excel
  • Справочник по игре «Жизнь» — сайт LifeWiki

Понравилась статья? Поделить с друзьями:
  • Клетки по диагонали excel
  • Клетки для word распечатать
  • Клетка электронной таблицы excel может содержать
  • Клетка с рамкой а4 скачать word
  • Кластерный анализ в excel это