Игра "Жизнь" в одном запросе


В статье приводится запрос, одного которого достаточно, чтобы реализовать всю механику игры "Жизнь" (http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life) на бесконечном поле. Запрос основан на технике искусственных таблиц, применяемой также в примерах из http://infostart.ru/public/90367/. Приведен отчет-игра "Эволюция", реализующий игровой процесс на основе рассматриваемого запроса. Отчет не привязан к метаданным и должен работать в любой конфигурации.

 

В отличие от известных реализаций «Эволюции» на 1С, здесь считается, что поле игры не ограничено. Живые клетки представлены записями в таблице «Популяция», хранящими их координаты — целые числа. Используется искусственная таблица «Дельта», содержащая три числа: -1, 0 и 1 как шаги по вертикали или горизонтали. Выборкой из трех независимых таблиц: двух таблиц «Дельта» и таблицы «Популяция» получаем для каждой живой клетки девять записей. Восемь из них являются координатами соседних клеток и берутся с весом 1, а девятая — самой живой клеткой, которая берется с весом 9. После группировки по координатам отбираются только клетки, суммарный вес которых равен 3, 11 или 12. Используется правило игры: клетка образуется на пустом месте, если у нее три соседа (0 + 3), либо остается на своем месте, если у нее два (9 + 2) или три соседа(9 + 3).

Весь запрос умещается на восьми строчках:

Запрос

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

Для вывода поля игры используется окно, размеры и сдвиг которого настраиваются. В этом окне состояние клетки можно менять двойным кликом мышки. При этом клетка, выходящая за пределы активного окна, переходит как бы в другой слой этого же окна, двигается в нем, но отображается узором. Доступны кнопки сохранения и восстановления «популяции», очистки «популяции». Для эволюции есть режим ручного шага, автоматического шага с интервалом 1 сек, максимальный режим с прорисовкой промежуточных состояний и без. Выход из максимального режима — только через Ctrl+Break.

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

1) искусственные таблицы упрощают решение задач на языке запросов, расширяют его возможности;

2) упаковывая сложные действия в один запрос, можно повысить скорость вычислений за счет того, что в 1С быстрее делается то, что описывается одной инструкцией;

3) гибкость языка запросов достаточно высока, что позволяет решать на нем задачи, далеко выходящие за привычные рамки.

 

12 Comments

  1. cool.vlad4

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

    Reply
  2. ildarovich

    (1) Скачав и запустив игру, введя в нее одну из бесконечно-растущих популяций, Вы сможете оценить потребности в памяти сами. Я не смог дождаться, когда потребуется более 100 мегабайт памяти. «Обычные» методы вообще на бесконечном поле не работают. Кроме того, «порождающий запрос» здесь и вовсе не используется и не нужен: необходимая искусственная таблица очень мала.

    Reply
  3. oberonm

    Весьма познавательно

    Reply
  4. v.l.

    Интересное решение. А можете написать статейку, как оное чудо можно реализовать?

    Готовая обработка — это хорошо.

    А вот мне интересно, как этот запрос обернуть в ГУЙ — будет познавательно.

    Интересно ведь самому сделать, пусть и по картинкам, но самому.

    P.S. Как вариант — я могу написать такую статью со всеми копирайтами и т.д. А потом выложить в своем или Вашем блоге.

    Reply
  5. ildarovich

    (4) В коде обработки 251 строка (спасибо платформе!), включая пустые, причем запрос из 8 строк конструктором развернут на 40. Там всего две содержательных процедуры. Первая стирает и раскрашивает клетки (16 строк), вторая отрабатывает двойной клик (14 строк). Как-то не вижу предмета описания. Кажется, что кто хочет — тот посмотрит код (он открыт), а кто хочет — напишет свой.

    Reply
  6. v.l.

    (6) Поглядите в моих публикациях — есть под 7.7 сборничек

    Добавлено: и дома есть коллекция игрушек на 8-ке

    Reply
  7. KlimPopov

    Очень здорово, причем можно использовать не только как игру, но и для релакс-минутки. Например, при входы и выходе из базы. Либо же, когда мозги кипят у бухгалтера — немного отвлечься. Очень интересно, уже даже появилась идея написать нечто подобное, спасибо!

    Reply
  8. bazcom

    мда

    Reply
  9. iksanova

    Интересно, чего только не напишешь на 8-ке.

    Reply
  10. iksanova

    Хорошая игрушка,

    надо воспользоваться!

    Reply
  11. NOVOPRO

    Прикольно, надо попробовать…

    Reply
  12. fixin

    интересное решение, плюсую.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *