Муравей Лэнгтона на JS и Canvas

    Прочитав здесь пост об этой замечательной зверушке (wiki) я подумал, что будет интересно его реализовать и за вечер написал его на js+canvas.
    Заодно чтобы было не скучно добавил ему соседей, получилось 5 цветовых популяций и ограниченное поле, которое породило граничные узоры.

    Ну был бы муравей и был, но сегодня запустив его я поймал очень интересное поведение, желтая популяция в какой то момент начала методично избавляться от плодов деятельности розовой и при этом не оставлять следы своей деятельности, меня это заинтересовало и я потратил еще пару минут наблюдая за полем, желтая популяция полностью уничтожила стартовую локацию розовых, затем полностью само уничтожилась и начала строить дивный новый мир с «0», т.е. с 1 желтого пикселя.

    Начальная позиция желтых по центру поля, а захваченная и заново отстроенная территория это оставшийся желтый блок



    Я предполагаю что это связанно с тем что каждая популяция живет в собственном setInterval() и именно это было отправной точкой для создания данной комбинации и далеко не каждый раз такое поведение можно будет увидеть.

    Хотелось бы услышать комментарии причины данного явления и способы его повторения.

    Код и demoДемонстрация http://wrewolf.github.io/LangtonsAntJS/

    Поймал еще раз поведение
    Начало экспансии


    Захватываем стан врага


    Враг повержен


    Мечта нигилиста почти сбылась


    Уже строим новый дивный мир


    Ну и выход в «тираж»


    П.С.

    С удовольствием выслушаю варианты по улучшению качества жизни данных насекомых.

    UPD.
    Обновил картинки.
    Поделиться публикацией

    Комментарии 24

      0
      Добавьте возможность кликая по клетке, изменять ее цвет.
        0
        А в какой цвет? (хотя по факту сейчас учитывается только клетка окрашена, клетка не окрашена)
        0
        Да хоть в черный!
          0
          Как выкрою время, обязательно добавлю такую возможность
          0
          Вот интересно, а как будет себя вести этот муравей на треугольном и гексагональном поле? А в трех- и многомерных пространствах?
            0
            ну для 3д пространства нужно вводить правила смены z уровня, а в плоскости можно строить любые эксперименты.
            Надо будет тоже попробовать сделать такой вариант, а в js можно сделать это просто через передачу функции валидатора нахождения на игровом поле муравья, только для этого нужно будет все в виде модулей переписать, а не огромной лапши
            0
            А что за алгоритм? Я на досуге делал «жизнь» на JS, так она работает на порядок быстрей: осторожно, рекламная ссылка :-). Мне казалось, что между муравьём и жизнью принципиальной разницы нет. Или я ошибаюсь?
              0
              В начале поста ссылка на алгоритм.
              wiki
                0
                Это понятно :-) Я про реализацию. Такое чувство, что вы каждый раз всё поле оббегаете… может не один раз… я про это говорю.
                  0
                  нет, расчёт идёт по отдельным таймерам и только текущая клетка для каждой популяции
                    0
                    Ё-моё :-) Я осознал! Это не тормоза, это просто таймеры :-)
                      0
                      Таймеры с 0 интервалом,
                      setInterval(function () { }, 0);
                      жаль только setTimeout тут не катит, он был бы побыстрее, но слишком быстро падает с перполнением стека
                0
                А я на досуге решил посмотреть, что будет если в пространстве для «жизни» будут случайные глюки «вакуума» с заданной вероятностью — тоже на canvas: allter.github.io/misc/life_canvas.html Если кому интересно — можете заглянуть внутрь и посмотреть, как сделано ускорение просчётов (при задержке 0), что бы считалось быстрее обновлений графики.
                  0
                  Крутая идея про вакуум
                  Тоже надо тоже реализовать расчет быстрее графики, иначе оч долго идет развитие, хотя смотреть на него весьма залипательно
                0
                Поймал с первого раза это поведение. Вот он, оставшийся пиксель в розовом поле
                Image #2225219, 118.4 KB
                  +1
                  После просмотра кода у меня появилось предложение по его улучшению — 5 раз записан один и тот же код, различие лишь в индексах у используемых массивах. Кажется, достаточно лишь передать в функции таймера индекс и цвет, чтобы скрипт сократился в более чем 4 раза.
                    0
                    Изначально была написана 1 функция с параметром индекс, но так по какой то причине работать не захотело
                      0
                      Как то так jsfiddle.net/duburlan/rgCfP/
                        0
                        Странно, что я делал не так в самом начале :)
                        В коде то осталась начальная функция mur
                        Сейчас обновил на такой подход
                          0
                          Вы наверно вызывали как то так
                          for (i=1; i <= 4; i++) {
                              setInterval(mur(i), 10);
                          }
                          

                          но функция с динамическими параметрами в setInterval нужно запихивать как нечто
                          setInterval(funcWithParams, delay, [dynamicParam1, ...dynamicParamN]);

                          и тогда ваш пример заработает вот так
                          for (i=1; i <= 4; i++) {
                              setInterval(mur, 10, i);
                          }
                          

                            0
                            Не заглянул в док и делал наоборот
                            setInterval(mur, i, 0);
                    0
                    Думается мне, что просто когда муравей входит в точку выхода другого муравья, он начинает повторять все движения предшественника задом на перёд. Ведь поведение муравьёв вполне инвертируемо. Вот и выходит, что если в любой момент муравья развернуть строго на 180 градусов, то он начнёт всё стирать как на обратной перемотке, пока не наткнётся на работу другого муравья.
                    Не уверен, понятно ли объяснил. Если что, спрашивайте.
                      0
                      Вполне возможно так и есть
                        0
                        Если оставить одного муравья, и сделать кнопку «Развернуть на 180 градусов», то это очень легко можно проверить.

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое