gifts2017

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

Опубликовал Сергей (ildarovich) в раздел Программирование - Практика программирования

В статье приводится запрос, одного которого достаточно, чтобы реализовать всю механику игры "Жизнь" (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) гибкость языка запросов достаточно высока, что позволяет решать на нем задачи, далеко выходящие за привычные рамки.

 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Внешний отчет - игра "Эволюция"
.erf 25,88Kb
27.09.11
70
.erf 25,88Kb 70 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Ийон Тихий (cool.vlad4) 25.09.11 08:32
а проводились ли замеры производительности - обычного решения задачи и запроса? у методов подобных порождающему запросу есть один очень серьезный недостаток - жрут память не подетски, на простых задачах. (вычисление квадратного корня у меня вообще вызвало зависание) . А так познавательно.
2. Сергей (ildarovich) 25.09.11 08:52
(1) Скачав и запустив игру, введя в нее одну из бесконечно-растущих популяций, Вы сможете оценить потребности в памяти сами. Я не смог дождаться, когда потребуется более 100 мегабайт памяти. "Обычные" методы вообще на бесконечном поле не работают. Кроме того, "порождающий запрос" здесь и вовсе не используется и не нужен: необходимая искусственная таблица очень мала.
3. Oberonm (oberonm) 26.09.11 09:01
4. vladal (Vladal) 27.09.11 09:56
Интересное решение. А можете написать статейку, как оное чудо можно реализовать?

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

P.S. Как вариант - я могу написать такую статью со всеми копирайтами и т.д. А потом выложить в своем или Вашем блоге.
5. Сергей (ildarovich) 27.09.11 12:53
(4) В коде обработки 251 строка (спасибо платформе!), включая пустые, причем запрос из 8 строк конструктором развернут на 40. Там всего две содержательных процедуры. Первая стирает и раскрашивает клетки (16 строк), вторая отрабатывает двойной клик (14 строк). Как-то не вижу предмета описания. Кажется, что кто хочет - тот посмотрит код (он открыт), а кто хочет - напишет свой.
7. vladal (Vladal) 29.09.11 13:19
(6) Поглядите в моих публикациях - есть под 7.7 сборничек
Добавлено: и дома есть коллекция игрушек на 8-ке
8. Клим Попов (KlimPopov) 30.09.11 14:39
Очень здорово, причем можно использовать не только как игру, но и для релакс-минутки. Например, при входы и выходе из базы. Либо же, когда мозги кипят у бухгалтера - немного отвлечься. Очень интересно, уже даже появилась идея написать нечто подобное, спасибо!
10. Татьяна Иксанова (iksanova) 19.12.11 07:13
Интересно, чего только не напишешь на 8-ке.
11. Татьяна Иксанова (iksanova) 19.12.11 07:14
Хорошая игрушка,
надо воспользоваться!
12. Anatoliy (NOVOPRO) 11.12.14 08:09
Прикольно, надо попробовать...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа