Конкурс завершен! Читайте комментарии на блобах, чтобы посмотреть их счет.
Этот KoTH свободно вдохновлен моделированием естественного отбора . Ваш бот - это капля. Для того, чтобы выжить, вы должны есть гранулы, чтобы восстановить энергию, которая используется для перемещения. С дополнительной энергией капли могут разделиться на две части.
Энергия и Движение
Ваш шарик начинается каждый раунд со 100 энергией, и у него нет ограничений на количество энергии, которое он может собрать. Каждый раунд выполняется по очереди, и каждый шарик имеет возможность перемещаться на север, восток, юг или запад в любой данный ход или стоять на месте. Перемещение использует 1 энергию, а стоя на месте использует 0,25 энергии. Длина стороны картыceil(0.25 * blobCount) * 2 - 1
единиц, с минимум 9 единиц. Все капли начинаются на краю карты, по одному в каждом углу, а каждый последующий капель располагается на расстоянии 2 единицы от других. Каждые 30 ходов волна гранул размещается в случайных местах вокруг карты, по крайней мере, в 1 единице от любого края. Каждый раз, когда появляется волна гранул, количество гранул (первоначально в два раза больше количества шариков или ширины карты, в зависимости от того, что больше) в следующей волне уменьшается на 1, что приводит к уменьшению количества шариков с течением времени. Каждая гранула восстанавливает от 5 до 15 энергии. Когда энергия капли меньше или равна 0, он умирает.
принимать пищу
Если два или более сгустка попытаются занять одно и то же место, тот, у кого больше энергии, съест остальных, получая их энергию. Если оба имеют одинаковую энергию, оба исчезают.
Обнаружение и информация
Капли могут видеть любые шарики или другие шарики на расстоянии 4 единиц. Когда их функции вызываются, BLOB-объекты предоставляются:
- Длина стороны карты
- Положение капли на карте
- Позиции всех гранул в пределах их радиуса поиска, а также их значения
- Позиции всех BLOB-объектов в радиусе их поиска, а также их энергия и UID
- Энергия, UID и местоположение большого двоичного объекта, функция которого выполняется
- Объект хранения, уникальный для BLOB-объекта
- Объект хранения, общий для всех BLOB-объектов, связанных с BLOB-объектами, путем разделения
расщепляющий
Если у сгустка больше 50 энергии, он может разделиться. Расщепление стоит 50 энергии, а любая оставшаяся энергия делится поровну между двумя каплями. Все капли являются либо оригиналами, либо разделенными копиями, причем каждая копия восходит к оригиналу. Все это вместе "родственники". Все родственники имеют один объект общего хранения. Родственники могут поедать друг друга и могут разделяться, использовать свои собственные объекты хранения или собирать энергию, не влияя на других.
Передача энергии
Если два шарика находятся рядом друг с другом (после перемещения), один из ботов может передавать энергию другому. Это делается путем возвращения SendNorth(amt)
, SendEast(amt)
, SendSouth(amt)
или SendWest(amt)
, с amt
быть число , представляющее сумму отправки. Это может быть любая сумма, которую может позволить отправитель, включая всю его энергию. Рекомендуется, чтобы блоб, получающий энергию, велел оставаться неподвижным через коммунальное хранилище, чтобы он не уходил при передаче энергии (хотя в этом случае энергия не будет вычтена из общей суммы отправителя).
Функции, хранилище и UID
Для обеспечения более сложного поведения при обучении всем BLOB-объектам будет присвоен целочисленный UID (уникальный идентификатор). Эти UID будут генерироваться случайным образом на каждой карте, предотвращая стратегии, основанные на отдельных целях. Когда вызывается функция BLOB-объекта, ему передается четыре аргумента:
- Длина стороны карты в виде целого числа
- Объект с двумя массивами:
pellets
иblobs
. Оба массива содержат объекты, оба имеютpos
свойство, содержащее позицию шарика или шарика в формате[x,y]
. У гранул будетenergy
свойство, в то время как у капель будетuid
свойство иenergy
свойство - Объект , содержащий различные свойства сгустка он передается:
energy
,uid
иpos
.pos
Массив в формате[x,y]
- Объект, содержащий два объекта хранения большого двоичного объекта.
self
Свойство содержит отдельный объект хранения , который может быть изменен , однако считает нужным блобо (путем манипулирования свойства объекта , который передается), иcommunal
свойство , которое может быть изменено с помощью любого родственника.
Капли не перемещаются немедленно, чтобы предотвратить преимущество ранних / поздних ходов. Все движения обрабатываются в группах (Все столкновения / прием пищи, затем все гранулы, затем расщепление и т. Д.) Если шарик приземляется на шарик или шарик меньшего размера и в процессе использует свою последнюю энергию, шарик все равно будет потреблять шарик / энергия не зависит от того, принесет ли это его полную энергию выше 0.
Чтобы относительные двоичные объекты распознавали друг друга, для каждого большого двоичного объекта необходимо использовать общее хранилище для записи его UID в массив или через какую-либо другую систему.
Возвращаемые значения
Для перемещения или разделения используется возвращаемое значение функции. Во-первых, значение основных направлений в терминах координат:
- Север = -Y
- Восток = + X
- Юг = + Y
- Запад = -X
Обратите внимание, что [0,0]
это верхний левый угол , и Y увеличивается с понижением. Возвращаемое значение функции должно соответствовать следующим правилам:
- Ничего не делать: ничего не возвращать, 0, null, undefined, false или любое другое значение, равное false
- To Move: вернуть одну из четырех глобальных переменных: север, восток, юг или запад, которые равны «север», «восток», «юг» или «запад» (которые также могут использоваться в качестве возвращаемого значения)
- To Split: вернуть глобальную переменную SplitNorth, SplitEast, SplitSouth или SplitWest, направление, указывающее, куда поместить новый BLOB-объект
Если возвращается команда разделения и требуемое количество энергии больше или равно энергии BLOB-объекта, ничего не произойдет. Капли не смогут покинуть карту.
Предопределенные библиотечные функции
Есть несколько основных функций, доступных по умолчанию, чтобы сэкономить время:
taxiDist (pt1, pt2)
Возвращает расстояние такси между двумя точками (расстояние X плюс расстояние Y).
taxiDist([0, 0], [2, 2]) //4
taxiDist([3, 4], [1, 5]) //3
taxiDist([1.25, 1.3], [1.3, 1.4]) //0.15
taxiDist([0, 0], [5, 2.5], 2.5) //3
taxiDist([0, 0], [2, 4], 2.5) //2.4
hypotDist (pt1, pt2)
Возвращает расстояние между двумя точками согласно теореме Пифагора
hypotDist([0, 0], [5, 12]) //13
hypotDist([4, 6], [8, 9]) //5
hypotDist([0, 1], [2, 1]) //2
hypotDist([1, 1], [2, 2]) //sqrt(2)
modDir (dir, amt)
Принимает введенное направление, поворачивает на 90 градусов по часовой стрелке amt
, затем возвращает новое значение.
modDist(North, 1) //East
modDist(East, 2) //West
modDist(West, 3) //South
modDist(South, 4) //South
Пример Blob
Этот шарик не будет двигаться, пока не найдет шарик поблизости. Затем он будет двигаться в направлении, которое, по его мнению, наиболее вероятно вознаградит его. Если его энергия превысит 150, он расколется.
function(map, near, me, storage) {
if (me.energy > 150)
return SplitNorth;
if (!near.pellets.length)
return null;
var dirs = [0, 0, 0, 0];
for (let p, i = 0; i < near.pellets.length; i++) {
p = near.pellets[i];
dirs[0] += me.pos[1] - p.pos[1];
dirs[1] += p.pos[0] - me.pos[0];
dirs[2] += p.pos[1] - me.pos[1];
dirs[3] += me.pos[0] - p.pos[0];
}
return [North, East, South, West][dirs.indexOf(Math.max(...dirs))];
}
правила
- Стандартные лазейки запрещены. Также нет нестандартных лазеек.
- Ни один BLOB-объект не может пытаться изменить или прочитать любые данные, не переданные ему через его параметры.
- Ни один BLOB-объект не может пытаться изменить переменную возвращаемого значения, чтобы саботировать другие BLOB-объекты.
- Раунд длится до тех пор, пока единственные оставшиеся капли не станут родственниками
- Ни один BLOB-объект не может изменять данные, вводя функции в свои параметры, которые изменяют значения с помощью
this
ключевого слова. - Все материалы должны быть либо на Javascript, либо на языке, который не слишком отличается от Javascript (например, Python). Все ответы будут преобразованы в Javascript для конкурса.
- Победителем является капля, которая собрала наибольшее количество энергии за все раунды (либо от гранул, либо от использования мелких капель, которые не являются родственниками)
Контроллер: https://gist.github.com/RedwolfPrograms/1facc0afe24c5dfd3ada8b8a2c493242
Чат: https://chat.stackexchange.com/rooms/93370/hungry-blobs-koth