четверг, 6 января 2011 г.

Игра "Жизнь" Конвея

Сначала правила:
"Каждая клетка на плоскости может находиться в двух состояниях: быть живой или быть мёртвой. Клетка имеет восемь соседей. Распределение живых клеток в начале игры называется первым поколением. Каждое следующее поколение рассчитывается на основе предыдущего по таким правилам:
  • пустая (мёртвая) клетка, рядом с которой ровно три живые клетки, оживает;
  • если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; в противном случае (если соседей меньше двух или больше трёх) клетка умирает (от «одиночества» или от «перенаселённости»).

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

Более подробно можно прочитать на Википедии (ссылка).

Попробуем реализовать эту игру в Excel без использования VBA.

Так как вычисления производятся поэтапно, необходимо отключить автоматический пересчет таблиц. Заходим в пункт меню "Сервис" - "Параметры", переходим на вкладку "Вычисления".
Дальше выбираем пункт вычисления "вручную", ставим галочку "итерации", указываем "предельное число итераций" равным 1. Щелкаем ОК.

Для начала делаем ширину столбцов и высоту строк одинаковой, к примеру 20 пикселей. Как это сделать описано в заметке Квадратные ячейки в Excel.

Нам нужно будет 2 таблицы. Выделяем область B2:AA27, обводим ее границей, затем копируем и вставляем на область B35:AA60. Пусть Таблица 1 - сверху, а Таблица 2 - снизу.

Живая клетка будет содержать значение 1, мертвая - пустая.

Создаем именованную формулу, которая суммирует 8 ячеек, расположенных вокруг данной:
  1. Активизируем ячейку B2.
  2. Выбираем меню "Вставка" - "Имя" - "Присвоить".
  3. В поле Имя пишем Суммавокруг.
  4. В поле Формула пишем =!A34+!B34+!C34+!C35+!C36+!B36+!A36+!A35


Теперь если мы в ячейке B2 напишем =Суммавокруг, то получим сумму вокруг ячейки B35, если в ячейке B3 напишем =Суммавокруг, то получим сумму вокруг ячейки B36 и т.д.

Вычисление будут проходить так. В Таблицу 2 забиваем исходное положение, щелкаем F9 (вычислить) и Excel производит расчет в Таблице 1 на основании Таблицы 2 и копирует Таблицу 1 в Таблицу 2.

Чтобы определить, когда в Таблице 2 выводятся исходные данные, а когда копируются из Таблицы 1, присвоим ячейке B31 имя флаг. Если там 1, то выводим исходные данные, если 0, то копируем из Табл. 1.

Приступим к заполнению таблиц.

Выделяем Таблицу 1 и в строке формул пишем (на основании правил игры)   
=ЕСЛИ(ИЛИ(Суммавокруг<2;Суммавокруг>3);0;ЕСЛИ(Суммавокруг=3;1;B35))
и щелкаем Ctrl + Enter, чтобы заполнить сразу все ячейки.

Выделяем Таблицу 2 и в строке формул пишем =ЕСЛИ(флаг;0;A2) и щелкаем Ctrl + Enter, чтобы заполнить сразу все ячейки.

Чтобы нули не выводились заходим в пункт меню "Сервис" - "Параметры", переходим на вкладку "Вид" и снимаем галочку с пункта "нулевые значения".

Но пока у нас исходное положение не содержит "живых" клеток. Чтобы "оживить" клетку, необходимо в формуле, которая в ячейке поменять 0 на 1, но делать это нужно только в Таблице 2. Можно выбрать сразу несколько клеток (выбираем их, удерживая клавишу Ctrl), затем в строке формул меняем 0 на 1 и щелкаем Ctrl + Enter.

Как с этим работать:
  1. Пишем в ячейке флаг значение 1, т.е. переходим к исходному положению.
  2. Выделяем Таблицу 2 и в строке формул пишем =ЕСЛИ(флаг;0;A2) и щелкаем Ctrl + Enter. Таким образом мы обнуляем исходные данные.
  3. Выделяем нужные нам ячейки в Таблице 2 и в строке формул меняем 0 на 1 и щелкаем Ctrl + Enter. Таким образом мы формируем первоначальную позицию.
  4. Пишем в ячейке флаг значение 0, т.е. запускаем эволюцию. 
  5. Щелкаем F9 (вычислить), чтобы переходить к следующему поколению. 
Для большей наглядности сделаем следующее.
Выделяем все ячейки Таблицы 2. Переходим в пункт меню "Формат" - "Условное форматирование". Задаем условие равно 1 и выбираем "Формат" красный шрифт и красная заливка.

Теперь Таблицу 1 можно скрыть и работать только с Таблицей 2.

Результат

   
   

Похожие по тематике посты - еще почитать:

1 комментарий:

  1. НЕТОЧНОСТЬ.
    Выделяем Таблицу 2 и в строке формул пишем =ЕСЛИ(флаг;0;A2) и щелкаем Ctrl + Enter, чтобы заполнить сразу все ячейки. НЕТОЧНОСТЬ. Вместо =ЕСЛИ(флаг;0;A2) надо =ЕСЛИ(флаг;0;B2)

    ОтветитьУдалить