В отличие от известных реализаций «Эволюции» на 1С, здесь считается, что поле игры не ограничено. Живые клетки представлены записями в таблице «Популяция», хранящими их координаты — целые числа. Используется искусственная таблица «Дельта», содержащая три числа: -1, 0 и 1 как шаги по вертикали или горизонтали. Выборкой из трех независимых таблиц: двух таблиц «Дельта» и таблицы «Популяция» получаем для каждой живой клетки девять записей. Восемь из них являются координатами соседних клеток и берутся с весом 1, а девятая — самой живой клеткой, которая берется с весом 9. После группировки по координатам отбираются только клетки, суммарный вес которых равен 3, 11 или 12. Используется правило игры: клетка образуется на пустом месте, если у нее три соседа (0 + 3), либо остается на своем месте, если у нее два (9 + 2) или три соседа(9 + 3).
Весь запрос умещается на восьми строчках:
Прилагаемый отчет является примером использования запроса, поэтому реализован только самый необходимый функционал:
Для вывода поля игры используется окно, размеры и сдвиг которого настраиваются. В этом окне состояние клетки можно менять двойным кликом мышки. При этом клетка, выходящая за пределы активного окна, переходит как бы в другой слой этого же окна, двигается в нем, но отображается узором. Доступны кнопки сохранения и восстановления «популяции», очистки «популяции». Для эволюции есть режим ручного шага, автоматического шага с интервалом 1 сек, максимальный режим с прорисовкой промежуточных состояний и без. Выход из максимального режима — только через Ctrl+Break.
Эксперименты показали, что расчет динамики даже довольно больших популяций не вызывает существенного «торможения». Скорость «игры» больше ограничивается не запросом, а временем перерисовки табличного поля. Несмотря на то, что отчет «Эволюция» по сути — «безделушка», он весьма поучителен. Выводы заключаются в том, что:
1) искусственные таблицы упрощают решение задач на языке запросов, расширяют его возможности;
2) упаковывая сложные действия в один запрос, можно повысить скорость вычислений за счет того, что в 1С быстрее делается то, что описывается одной инструкцией;
3) гибкость языка запросов достаточно высока, что позволяет решать на нем задачи, далеко выходящие за привычные рамки.
а проводились ли замеры производительности — обычного решения задачи и запроса? у методов подобных порождающему запросу есть один очень серьезный недостаток — жрут память не подетски, на простых задачах. (вычисление квадратного корня у меня вообще вызвало зависание) . А так познавательно.
(1) Скачав и запустив игру, введя в нее одну из бесконечно-растущих популяций, Вы сможете оценить потребности в памяти сами. Я не смог дождаться, когда потребуется более 100 мегабайт памяти. «Обычные» методы вообще на бесконечном поле не работают. Кроме того, «порождающий запрос» здесь и вовсе не используется и не нужен: необходимая искусственная таблица очень мала.
Весьма познавательно
Интересное решение. А можете написать статейку, как оное чудо можно реализовать?
Готовая обработка — это хорошо.
А вот мне интересно, как этот запрос обернуть в ГУЙ — будет познавательно.
Интересно ведь самому сделать, пусть и по картинкам, но самому.
P.S. Как вариант — я могу написать такую статью со всеми копирайтами и т.д. А потом выложить в своем или Вашем блоге.
(4) В коде обработки 251 строка (спасибо платформе!), включая пустые, причем запрос из 8 строк конструктором развернут на 40. Там всего две содержательных процедуры. Первая стирает и раскрашивает клетки (16 строк), вторая отрабатывает двойной клик (14 строк). Как-то не вижу предмета описания. Кажется, что кто хочет — тот посмотрит код (он открыт), а кто хочет — напишет свой.
(6) Поглядите в моих публикациях — есть под 7.7 сборничек
Добавлено: и дома есть коллекция игрушек на 8-ке
Очень здорово, причем можно использовать не только как игру, но и для релакс-минутки. Например, при входы и выходе из базы. Либо же, когда мозги кипят у бухгалтера — немного отвлечься. Очень интересно, уже даже появилась идея написать нечто подобное, спасибо!
мда
Интересно, чего только не напишешь на 8-ке.
Хорошая игрушка,
надо воспользоваться!
Прикольно, надо попробовать…
интересное решение, плюсую.