StoTisteg написал: даже слегка искусственно замедлить
для этого есть параметр в модели "Замедление, сек" - задавайте любое (можно и доли секунды, к примеру 0,2 сек.)
Цитата
StoTisteg написал: вообще сомневаюсь, что на торе возможно вечное ружьё. Есть подозрение, что рано или поздно оно застрелит само себя.
- для этого есть переключатель "гибель клеток на границе - 0 / закольцованные координаты - 1 ", где закольцовка отменяется и жизнь не может выйти за границы поля, еще есть "пожиратели" (в прилагаемом файле файле аж 5!, 2 в составе "отражателя" -№1 на рис.) Итак прилагаю модель, где в бесконечном цикле: 1. Стреляет "Планерное ружьё Госпера" -слева и ружье "B-52 bomber" - правее (№2 на рис.) 2. Летящие планеры, поворачивает на 90 градусов - Отражатель "Snark" - №3 на рис. 3. "Планер P60" - представляет собой осциллятор периода 60, состоящий из планера, отраженного двумя пятиугольниками (планер летает между двумя Pentadecathlon) - №4 на рис. 4. Планеры мы уже все знаем, стрелками указаны направления полета. 5.Что бы планеры не улетали их жрут пожиратели "Eater 1" - №1 на рис.
В модели при нажатии на "стоп" - инфа из статус бара удаляется. На втором листе зачатки оформления разных моделей/фигур в этой игре. Ввел опять закрашивание правой кнопкой на поле (проставляются единицы в выделенном диапазоне).
Запускаем - смотрим движение описанное выше и отмеченное на прилагаемом рисунке.
Модернизировал это чудо. Получилось более стабильно-быстрее. Скорость фактически не зависит от размера поля. Жаль нельзя массив в ключ засовывать, возможно, что скорость бы ещё возросла.
Мартын, благодарю за внимание к теме и за рабочий пример. Есть два момента: 1. при отрисовке поля у вас на иногда видно паразитные клетки предыдущего поколения (посмотрите, после 400 ходя хорошо видно на планере и на периодических фигурах, когда движения замедляется) 2. менее важный момент - мой пример все же немногим быстрее, даже в конце роста дуба из жёлудя (вначале быстрее явно, в конце почти одинаковые скорости). Excel16 x64. Сравните и у себя, возможно мой тест не показателен. Пример прилагаю.
bedvit написал: мой пример все же немногим быстрее
Я замерял по секундомеру. Ваш вариант 1000 поколений давал за 5 мин 22 сек, мой - за 1 мин 56 сек. На малых полях (когда всё расположено компактно и не расползается) Ваш вариант работает быстрее, но как только хоть один глайдер улетает подальше, то начинаются жуткие тормоза. В моём варианте размер поля и "разбег жителей" не имеет никакого значения, важно только их количество, если "жителей" немного, то жизнь ОЧЕНЬ ускоряется. Так что "кто быстрее" - вопрос относительный, как и всё в этом мире
Цитата
bedvit написал: видно паразитные клетки предыдущего поколения
не замечал. посмотрю внимательнее. не должно быть такого.
Поделюсь и я заготовками, раз подняли тему. Предлагаю на вашу оценку стабильную бета версию своей программы - LIFE Правая кнопка мыши - двигает поле. Левая рисует (можно и во время расчета). Колесико мыши - масштаб (масштабирование до экранного пикселя). Вообщем, все стандартно. Поле для жизни БЕСКОНЕЧНОЕ. Статистика справа. "Замедление" можно задавать (в миллисекундах 1сек.=1000мс.) , кому слишком быстро Сохранение шаблонов и загрузка в формате *.rle в процессе разработки. Оптимизация скорости пока не проводилась, еще впереди (еще только бета версия), но и сейчас вполне для запуска своей вселенной, проверьте сами. Продукт написан на С++, GUI на WinAPI.
Даже в текущей реализации данный шаблон должен по скорости нормально отрабатывать в Life. Посмотрим, по необходимости, перейдем на DirectX и графику переложим на ГП, пусть ЦП занимается расчетом жизни, подключим все ядра. Загрузку/выгрузку только пилить печаль, с парсингом всех этих строк. Может по алгоритму на форум задачку подкинуть? Алгоритм простой.
Life v1.0.0.0 Работает загрузка файлов-шаблонов RLE, сохранение в этот же формат. Несколько оптимизирован алгоритм. Итак пришло время запустить Фабрику космических кораблей p416_60P5H2V0_gun. На моем ПК программа Life выдает 27 поколений в секунду. Есть некоторые соображения по оптимизации алгоритма расчета поколений. Ожидаются в следующей версии программы.
Life v1.1.0.0 Добавлены горячие кнопки, оптимизирован алгоритм отрисовки. Теперь на winapi выдает 40 поколений (кадров) в секунду. Итого прирост от предыдущей версии - 50%. Думаю больше не отжать, без серьезных костылей записи напрямую в память ручками попиксельно. Попробую подключить Dirext3D.
Life v1.2.0.0 Небольшие доработки алгоритма расчета, проведена работа над ошибками при рисовании во время выполнения, оптимизирован вывод только видимой части кадра, рекомендуется как замена версии 1.1.0.0 55 поколений в секунду. В идеале нужно 60 - с частотой обновления кадров на экране.
Виктор, готов поделится 50%/50% с тем, кто займётся маркетингом и продажами. Если серьезно, продукт в данном виде не для продаж, а так, развлечения и обучение. Если только выложить на Play маркет, бесплатно и размещать рекламу Для этого должны быть конкурентные свойства у данного продукта и интерес у аудитории. Сейчас это просто развлечение. Да и у пользователей широкий простор в выборе самых разнообразных развлечений, от стратегий до шутеров. Здесь явно эта тема проигрывает.
Да понятно, я шучу. А на самом деле здорово, когда интересная задача и хочется над ней работать. Я еще до Нового года сделал вариант на итеративных вычислениях. VBA - только для настроек и управления. Нужно еще формулу перехода на границах поля, но забросил.
Удалось достичь 55 кадров (поколений) в секунду (обновил пост 49). В идеале нужно 60 - макс. частота (частота обновления инфо на мониторе, 60 Герц - 60 кадров в секунду). Правда, этот показатель сильно зависит от ПК (на слабом выдает всего 15 кадров/поколений в секунду) и размеров модели (тестовая -"фабрика" - 27 тыс. клеток).
vikttur написал: Я еще до Нового года сделал вариант на итеративных вычислениях.
А что забросили, стало не интересно или не эффективно? Я тоже пробовал, мне не понравился из-за некоторых нюансов итеративных вычислений, но подкупает многопоточный расчет через формулы (в VBA только один поток). Хотел выложить версию, но не нашел (жаль).
Это было, когда другие версии в теме были медленные. На итерациях - только для интереса. Из-за формул файл очень сильно пухнет. Но картина жизни воспроизводится. Позже выложу.
Life v1.3.0.0 Основные параметры: 1. Размер игрового поля 2^32 на +2^32 клеток (рамка примерно 4,3*4,3 млрд. клеток) 2. Масштаб от 32 пикселей - одна клетка, до 32768 клеток на один пиксель (можно загрузить целиком самый большой космический корабль Gemini, размером рамки в 4 млн. клеток, посмотреть в подробностях - по ссылке есть загрузочный шаблон в архиве) Такой большой корабль у меня отрисовывается - одно поколение - 1 сек. 3. Замедление хода в мс.(микросекунда=1/1000 сек.) 4. Шаг поколений. В один ход (ход - отрисовка инфо на экране) рассчитываем указанное количество поколений. Параметр нужен для того, что бы посмотреть динамику жизни при скорости выше 60 поколений в секунду, т.к. WinAPI не может отрисовать более 60Гц в секунду (частота обновления экрана). К примеру, при шаге 7 поколений в ход, фабрика космических кораблей у меня собирает космические корабли со скоростью 120 поколений в секунду (см.рис). С какой скоростью строятся у вас? 5. Самая быстрая отрисовка в WinAPI через CreateDIBSection, с прямым доступом через DIB к битам битовой карты (следующий этап - Dirext3D, пока в разработке). 6. Новая кнопка "Начало координат" - перемещение в начало координат (левая верхняя точка экрана - координаты: 0.0). Работает при расчете жизни. Если вдруг потерялись Эта же позиция отрисовывается при запуске программы и при создании нового поля. Загрузка всех шаблонов происходит тоже в начало координат. 7. Сочетание кнопок для действий - новый холст, открыть и сохранить файл - стандартные (к примеру, как в Excel)
14/03/2019 Обновление версии: Life v1.4.0.0 - Обновлен интерфейс и сетка игрового поля. - Оптимизирован алгоритм расчета и отрисовки - теперь быстрее на 30%. - Добавлены команды: 13. "Инфо.панель" - информация о настройках, игровом поле. 14. "Показать ареал" - показать весь ареал (клетки где была и есть жизнь) на экране. 15. "Автомасштаб" - автомасштабирование ареала до размеров экрана. 16. "Ареал по живым" - сужения ареала только до живых клеток.
И замеченного: у меня, версия х32 работает на 30% быстрее, чем х64 (win7 x64), что на первый взгляд, кажется парадоксальным.
В комбинации "Автомасштаб" и "Ареал по живым" дают интересный эффект - можно смотреть движение одиночных фигур в пространстве, к примеру космические корабли (для более качественного просмотра, можно замедлить движение, см.п.3).
на рис. космический корабль "p15 pre-pulsar spaceship" Интересны мнения и выявленные баги. В архиве прилагаю для теста пару простых шаблонов в формате RLE.
bedvit, спасибо. Игрался с автоматами на .NET, но так далеко не зашел Мне кажется не совсем корректно работает последовательное кликание на "автомасштаб" и "ареал по живым". Картинка не меняется, хотя некоторые объекты уходят за границу поля. Но сделано здорово, конечно.
VSerg, спасибо за оценку. Команда "Автомасштаб" - автомасштабирует ареал (пространство, где когда-либо была жизнь) до размеров экрана, т.е за границу экрана ничего не уходит, алгоритм подгоняет масштаб под нужный размер автоматом. Команда "Ареал по живым" - сужает ареал только до живых клеток (но не масштабирует, просто пересчитывает ареал и в инфо панели отражается новый, этот же ареал участвует в сохранении, в файле), при этой команде автомасштабирования нет, клетки могут уйти за границы экрана. Что бы было видно все живые, без пространства, в котором ранее была жизнь, эти две команды нужно включить одновременно. Протестируйте, все ли верно у вас отрабатывает?