Это симулятор искуственной жизни, построеный на основе генитических алгоритмов. Основа симуляции - боты, у них есть свой геном (он же является их мозгом и их программой), который записан в виде 64 чисел, каждое от 0 до 63. Свой первый ход бот начинает с 1 ячейки генома (указатель генома = 0), считывая записанное в ней число и совершая действие (команду), соответствующее этому числу. Указатель на то, какую ячейку считывать следующей, перемещается на несколько ячеек вперёд, в зависимости от исполненной команды. Если указатель выходит за рамки генома (число более 63), то он закольцовывается и геном начинается сначала. В зависимости от установленных правил, бот может давать потомство. При этом есть шанс мутации - тогда случайная ячейка генома будет заменена на случайное число. Таким образом, боты, наиболее приспособленные к окружению (то есть могущие дать потомство) клонируются, с некоторым шансом случайно сделать более лучшую версию себя.
Далее описаны команды для ботов и некоторые правила.
-
В ход бот может сделать основное действие и несколько малых действий. Основное действие заканчивает ход бота, малое действие не заканчивает ход, а вызывает следующую команду.
-
Бот может расти, создавая органы. Каждый орган потребляет одну дополнительную энергию в ход, но даёт боту преимущества. Если мы делаем простые органы:
- максимальный уровень энергии повышен в полтора раза
- орган может дать +1 действие в ход
- орган может дать дополнительный фотосинтез
- орган может нанести урон (?) атакующему, если у бота больше энергии чем у атакующего Если мы делаем сложные органы: <<< сейчас реализован этот вариант
- орган имеет свой геном из Х ячеек (но с 64 значениями)
- максимальный уровень энергии бота будет больше на размер генома органа
- команды для органа работают немного иначе, чем для бота
- бот может съесть свой орган, тогда он восполняет +X энергии (указывается в конфиге) #TODO
- если орган кусает бота, то орган поглощается. если орган кусает орган, то целевой орган поглощается #TODO
-
На текущий момент у бота нет понятия поворота в какую-либо сторону, команды, зависящие от направления, вычисляют его каждый раз заново
Команды бота: ~ = основное действие _ = малое действие
~0 - стоять, ничего не делать. Указатель генома (УГ) +1
_5 - безотносительный взгляд - вычисляем направление взгляда на основе ячейки генома +1 - перемещаем указатель генома в зависимости от того, что увидели: - пусто: +2 - другой бот: +3 - родственник: +4 - еда: +5 - сам бот: +6 // например, голова смотрит на один из органов бота
~10 - безотносительное движение - вычисляем направление движения на основе ячейки генома +1 - проверяем возможность сдвига бота и всех его органов в этом направлении - если возможности движения нет, то стоим на месте и указатель генома +2 - если возможность движения есть, то перемещаем бота и все органы, указатель генома +3
~15 - укусить
- вычисляем направление кусания на основе ячейки генома +1
- кусаем объект в этом направлении
- если укусили и пусто, то УГ +2
- если укусили другого бота, то УГ +3
- если укусили еду, то УГ +4
- если укусили себя, то УГ +5
~20 - фотосинтез - бот просто получает +Х энергиии (настраивается в конфиге), УГ +1
~25 - орган - начиная с направления "вперёд" и по часовой, найти первое незанятое направление #TODO переделать в зависимость от генома - если пустого места не нашлось, УГ+N+1 - если нашлась пустая клетка, создать там орган, скопировав следующие N значений генома (настраивается в конфиге, по умолчанию 8) в геном органа. УГ+N+2
~30 - потомство - начиная с направления "вперёд" и по часовой, найти первое незанятое направление #TODO переделать в зависимость от генома - если пустого места не нашлось, УГ+1 - если нашлась пустая клетка, создать там нового бота. Новый бот берёт геном родителя, с шансом мутации - заменится одно из значений генома. УГ+2
_иное число - перевод указателя генома на [иное число] вперёд
Команды органа: ~0 - простой, ничего не делаем. УГ+1
~10 - ускорить бота
- орган даёт +Х доп. очков действий своему боту. По умолчанию 5 очков действия за орган, т.е. нужно два органа, чтобы получить одно основное действие
~15 - укусить
- вычисляем направление кусания на основе ячейки генома +1
- кусаем объект в этом направлении
- если укусили и пусто, то УГ +2
- если укусили другого бота, то УГ +3
- если укусили еду, то УГ +4
- если укусили себя, то УГ +5
~20 - фотосинтез - дать боту +Х энергии, УГ+1