Голодные игры - Ешь или умри
Если ты не ешь, ты умрешь. Если ты ешь, ты живешь (пока не умрешь). Вы будете умирать, так что постарайтесь , чтобы умереть в прошлом.
обзор
Есть остров, населенный стадом хищных животных. Вы контролируете стаю из пяти хищников. Ваша цель состоит в том, чтобы сохранить ваш пакет в живых. Делайте это, поедая добычу. Добыча, как правило, убегает от хищников и в противном случае старается держаться стаями. Конечно, ваша стая будет на том же поле, что и любая другая , поэтому участники соревнований попытаются съесть их раньше, чем вы сможете. Не позволяйте этому обескураживать вас, иначе вы будете голодать.
Как играть
Создайте и отправьте программу командной строки, чтобы направить ваш пакет. Он будет получать информацию о состоянии от управляющей программы на STDIN и выводить команды на STDOUT. Формат подробно описан ниже. Каждая программа будет выполняться только один раз и должна продолжаться до тех пор, пока в ней не останется живых участников пакета. Вам нужно будет прочитать ввод, как он поступает, и быстро ответить. Для каждого ответа существует строгое время ожидания 200 мс. Если к тому времени вы не ответили, ваш пакет не получит новых инструкций для текущего хода.
Если ваша программа не может быть запущена контроллером, она не будет считаться действительной. Пожалуйста, включите строку командной строки, которую мне нужно будет использовать для запуска вашего представления. Если есть какие-либо специальные инструкции (для настройки компиляторов и т. Д.), Пожалуйста, включите их. Если я не могу заставить его работать, я буду просить вас о помощи в комментариях. Если вы не ответите, я не смогу принять вашу заявку.
Турнир будет проходить на 64-битной системе Linux. Имейте это в виду при указании любых необходимых указаний.
подробности
Положение и направление каждого существа имеют форму пары чисел с плавающей запятой двойной точности (например
double
), представляющих ихx
иy
координаты соответственно.Каждое существо считается точкой. Это означает, что они могут перекрываться и занимать одно и то же пространство. Вы не будете отталкиваться, и нет понятия столкновения с другими существами.
Остров представляет собой квадрат, 500 единиц в сторону. Если вы попытаетесь выйти за эти рамки, вы будете зажаты на краю. Начало координат
{0,0}
вверху слева, сx
увеличением вправо иy
увеличением вниз. Опять же карта не переносится .Игра начинается с 1500+ (packCount * 50) хищных животных. Они будут собраны в центре острова, но быстро решат начать движение.
Пакеты будут расположены равномерно по периметру. Заказ на упаковку перемешивается, поэтому не рассчитывайте на запуск в определенном месте.
Хищные животные могут видеть всех других животных в радиусе 30 единиц. Они могут двигаться максимум 6.0 единиц за ход.
Хищники могут видеть всех других животных в радиусе 50 единиц. Они могут двигаться со скоростью не более 6,1 единиц за ход. Это означает, что они могут видеть добычу до того, как ее увидят, и (едва) опередить ее.
Хищники живут и умирают в зависимости от уровня голода . Он начинается с 1000 и уменьшается на единицу каждый ход. Если после движения хищник находится в пределах 1 единицы добычи, он автоматически съест его. Это удаляет добычу и устанавливает голод хищника на 1000. Каждый хищник может съесть только одну добычу за ход. Если в пределах диапазона более одного, он будет съедать тот, к которому цикл попадет первым (не обязательно ближайший). Хищник умирает, если его голод достигает нуля.
Пакеты начинаются с пяти участников каждый. Каждые 5000 ходов, все пакеты в игре будут порождать одного нового участника. Он будет размещен в пределах видимого диапазона другого участника стаи. Убедитесь, что ваши записи могут обрабатывать более пяти членов.
Каждые 1000 ходов появляется больше жертв. Число новых жертв будет числом живых хищников минус один.
Хищники не могут атаковать других хищников. Они едят добычу, когда ловят ее. Вот и все.
Порядок за ход:
- Все жертвы принимают решения
- Все хищники принимают решения
- Все добыча движется
- Все хищники двигаются / едят
Порядок, в котором каждая колода принимает свои решения / поступает, будет рандомизирован на каждом ходу.
Протокол (Общий)
Все коммуникации осуществляются в строковом формате US-ASCII
. Числа преобразуются в строки с использованием Java Double.toString()
или Integer.toString()
. Ваш вывод должен быть отформатирован так, чтобы его могли прочитать Java Double.valueOf(String)
(вы не будете выводить целые числа). Подробнее о разбираемых форматах см. В документации поDouble
. Все поля в строке разделены стандартным \t
символом, а переводы строки \n
. Вся строка будет завершена нулевым байтом \0
.
В примерах ниже я использую, <>
чтобы пометить поля для удобства чтения. Их нет в реальных строках.
Протокол (вход)
Длина входной строки зависит от количества видимых существ в вашем пакете. Он может превышать 100 тыс. Символов, так что будьте к этому готовы. Базовая настройка:
Строка 0: основная информация об игре.
turn
номер текущего хода, а количество - это общее количество добычи и хищников, оставшихся на поле. Этоinteger
в виде строки.<turn>\t<preyCount>\t<predatorCount>\n
Строка 1: уникальные идентификаторы членов вашей группы и уровни голода. Они не даны в одинаковом порядке для каждого входа. Используйте уникальные идентификаторы для отслеживания отдельных членов, а не порядок, в котором они появляются на входе. Опять же, это
integer
как строки. Для пакета из двух это будет:<id[0]>\t<hunger[0]>\t<id[1]>\t<hunger[1]>\n
Строка 2: Позиции участников вашей стаи, в том же порядке, который указан в строке 1 . Это
double
как строка:<x[0]>\t<y[0]>\t<x[1]>\t<y[1]>\n
Следующие строки отображают видимость каждого члена пакета в том же порядке, который указан в строке 1 . Они будут представлены в виде двух строк на члена.
Первый для каждого состоит из мест для добычи, которую он может видеть. Второе - места для хищников, которых он может видеть. Эти места не являются уникальными в целом. Например, если два члена стаи могут видеть одно и то же животное, оно будет в строке обоих членов. Кроме того, ваши собственные участники пакета будут включены. Если вы хотите исключить их, вы можете сравнить местоположения с собственными участниками. Все местоположения в double
формате строки.
Для каждого живущего члена:
<prey[0].x>\t<prey[0].y>\t<prey[1].x>\t<prey[1].y>\n
<predator[0].x>\t<predator[0].y>\t<predator[1].x>\t<predator[1].y>\n
Наконец, последний символ будет \0
в начале следующей строки.
Исключение: если вы получили ввод dead\0
, ваш пакет мертв. Пожалуйста, закончите свою программу изящно. Контроллер должен закрывать все живые процессы в закрытом состоянии, но я бы не хотел, чтобы процессы зомби были повсюду. В качестве любезности вы можете указать время ожидания ввода. Например, мой пример класса заканчивается, если он не получает ввод в течение 15 секунд.
Протокол (Выход)
Вывод прост. Вы дадите пару double
значений для каждого члена пакета live. Они представляют движение, которое вы хотели бы, чтобы они взяли на этом ходу. Например, если ваше существо находится в данный момент {100.0, 100.0}
и вы даете им команду {-1.0, 1.0}
, они перейдут в {99.0, 101.0}
. Все числа будут в одной строке, разделенной табуляцией.
Например, если у вас было 3 активных участника пакета, это был бы правильный ответ:
1.0\t-1.0\t2.0\t-2.0\t3.0\t-3.0\0
Это будет двигаться ваши существа путем {1.0,-1.0}
, {2.0,-2.0}
и {3.0,-3.0}
. Порядок такой же, как и полученный на входе. Не забудь конец \0
!
Если вы введете неверные данные, последуют плохие результаты. Если какое-либо одно число не может быть проанализировано для a double
, оно станет нулевым. Если строка в целом не может быть проанализирована, никаких новых инструкций не будет, и весь ваш пакет будет использовать указания из предыдущего хода.
Все направления будут зафиксированы на максимальном расстоянии 6,1 единиц. Вы можете двигаться медленнее, чем это, если хотите. Например, {1, 0}
переместит вас на одну единицу. {6,8}
(расстояние 10) только переместит вас на 6,1 единиц и уменьшит до примерно {3.66, 4.88}
. Направление остается постоянным.
Важно: управляющая программа считывает ваш STDOUT и STDERR. Если вы сгенерируете исключение и напечатаете в STDERR, очень маловероятно, что сообщение будет иметь форму правильного ответа. Старайтесь избегать этого.
Программа управления / Тестирование
Источник для контроллера можно найти здесь на bitbucket.org . Вам нужно будет скомпилировать его перед запуском. Основной класс есть Game
, и все классы находятся в пакете по умолчанию. Для запуска включите команду каждого пакета в качестве отдельного аргумента. Например, если вы хотите запустить Java ChaserPack и Python LazyPack.py, вы можете использовать:
java Game "java ChaserPack" "python LazyPack.py"
На карте добыча отображается зеленым цветом, а хищники - красным. Однако, какой бы пакет не был первым, указанный в качестве аргумента, он будет окрашен в синий цвет. Это сделано для того, чтобы их было легче различить в целях тестирования. Хищники также будут мигать белым в течение пяти кадров, когда они едят.
Игра будет продолжаться до тех пор, пока последний хищник не умрет от голода, и пишет в консоль, когда происходят события голодания или вымирания. Как только игра будет завершена, оценка будет выставляться за каждую колоду. Если вы не хотите видеть события голодания / вымирания, вы можете использовать -silent
аргумент. Тогда он будет только выводить окончательный счет. Вы должны передать это в качестве первого аргумента :
java Game -silent "java ChaserCat" "./someOtherPack"
Включен скелет Java-пакета с именем GenericPack
. Он включает в себя основные необходимые операции ввода / вывода. Это там, чтобы дать четкий пример того, как разобрать и ответить. Если вы хотите добавить шаблон на другом языке, дайте мне знать.
Также включен хищник, основанный на шаблоне ChaserPack
. Он не будет включен в турнир и включен только в целях тестирования. Он работает довольно плохо из-за преднамеренного недостатка прицеливания. Если вы не можете победить, продолжайте пытаться.
Ниже приведен пример запуска управляющей программы (нажмите для просмотра видео). Качество видео не очень хорошее (извините), но вы можете почувствовать, как движется добыча. ( осторожно: аудио )
счет
Победитель будет определяться турниром, набирая очки в каждом раунде.
Каждый раунд продолжается, пока все хищники не мертвы. Каждый пакет будет оценен в зависимости от того, когда его последний член умер от голода. Затем им будут назначены баллы в зависимости от порядка. Очки будут накапливаться в течение десяти раундов, и победителем становится колода с наибольшим количеством очков.
Первое место за каждый раунд получит 100 очков. За каждое место после этого вознаграждение будет уменьшено на 20% (округлено в меньшую сторону). Это будет продолжаться до тех пор, пока очки не достигнут нуля (после 17-го места). Места 18+ не получат очков за раунд. Пакеты, которые связывают, получат равные очки. Например:
1st : 100
2nd : 80
3rd : 64 (T)
3rd : 64 (T)
4th : 51
...
17th: 1
18th: 0
19th: 0
Максимально возможное количество очков в течение турнира составляет 1000, с первого места все десять раз.
Если несколько программ завершат турнир, привязанный к первому месту, будет проведен еще один турнир из десяти раундов, в котором будут представлены только заявки на первое место . Это будет продолжаться, пока не появится один победитель.
Я постараюсь проводить турнир примерно еженедельно или по мере поступления новых заявок.
Дополнительные правила (играй честно!)
Вы не можете читать или писать на любые внешние ресурсы. Поскольку вы не собираетесь вызывать вашу программу несколько раз, любая информация о состоянии может храниться внутри.
Не вмешивайтесь в другие процессы / представления. Это не означает, что не пытайтесь украсть их добычу, убежать от них и т. Д. Это означает, что не мешайте выполнению процесса. Это на мое усмотрение.
Конкурсанты ограничены максимум тремя заявками. Если вы отправите больше, я наберу только первые три отправленных. Если вы хотите отозвать один, удалите его.
Записи могут не существовать исключительно для поддержки других записей. Каждый должен играть, чтобы выиграть на свой счет.
Ваша программа может порождать максимум один дочерний процесс за раз ( всего потомков, а не прямых). В любом случае, убедитесь, что вы не превысили время ожидания. Вы не можете вызывать сам
Game
класс каким-либо образом.
Результаты - 29 апреля 2014
Вот результаты последнего турнира из десяти раундов:
Clairvoyant : 1000
EcoCamels : 752
Netcats : 688
RubySpiders : 436
RubyVultures : 431
CivilizedBeasts : 382
LazyPack : 257
Пакеты, представленные до 09:00 EDT 2014/04/29, включены в этот прогон.
Вы также можете просмотреть детали для каждого раунда . По какой-то причине я решил пронумеровать раунды в обратном порядке, поэтому он начинается с «раунда 10».
Обновления
2014/04/23: FGreg сообщил об ошибке, связанной с тайм- аутами (спасибо!). Исправление было реализовано, поэтому тестировщики захотят обновить код своей управляющей программы.
источник
Ответы:
ясновидящий
Код обновлен до AbleDogs
Woo Hoo! Наконец-то бьет этот Netcats! Я расширил существующий код (кредит Geobits!) С небольшой модификацией для создания этого будущего пакета прогнозирования. Ничто не сравнится с хищниками, которые знают, куда будет двигаться добыча!
Из двух тестов, которые я сделал, мой стэк всегда побеждал Netcats. Но это не будет работать так же хорошо, если других пакетов нет, так как предсказание все равно не будет выполнено, если поблизости будет слишком много других жертв.
Вероятно, я могу включить уловку CivilizedBeasts, чтобы существенно сократить количество жертв в течение первых нескольких тысяч ходов.
Из названия моего пакета вы должны знать, какую стратегию я использую = D
Редактировать :
Улучшение особых случаев, когда предыдущая версия просто застряла в углу.flock[ALIGN]
фактор добычиЯ посчитал, сколько еды съедает каждая пачка, и вот результат:
Мой пакет очень агрессивен, и я думаю, что большинство из 916 очков получают от кражи добычи из Netcats, как и RubySpiders.
CivilizedBeasts, к сожалению, проигрывает из-за центрального верблюда от EcoCamel.
И EcoCamel (с критическим голодом 500) довольно эффективен, он ест достаточно, чтобы выжить до конца.
Также с этим обновленным Ясновидением игра едва достигает 10000 ходов.
Код:
источник
Netcats
Вот пачка, чтобы вы, ребята, начали. Расширяет
GenericPack
класс, включенный в управляющую программу. Он был улучшен с момента первоначальной публикации, и больше не голодает с редким стадом.Netcats используют сетчатое образование в форме V, чтобы поймать добычу в углу, где они могут съесть их в свободное время. Сетка сформирована с одним «головным» членом в центре. После того, как голова съела, она поменяется местами с самым голодным членом стаи, так как голова, как правило, первой получает возможность поесть.
Сеть начинается довольно мало, но расширяется, когда стадо становится меньше, чтобы более эффективно тралить поле.
Если жертвы не видно, формация расширяется в наивную схему поиска, охватывающую большую часть острова.
Как только пакет становится до двух участников, сеть просто не работает. В этот момент каждый идет своим путем, жадно съедая самое близкое, что может найти, и в противном случае совершает полуслучайную прогулку.
Эта версия выживает намного лучше, чем наивные Netcats, показанные в видео, связанном в вопросе.
источник
Рубиновые Пауки
Поскольку иногда меньше - это больше, и многие решения, вероятно, попытались бы загнать добычу в любом случае ...
Я думал, что мой пакет может просто расстаться и ждать, пока другие сделают эту работу.
Предостережение: на самом деле он не работает, не считывает вводимые данные и не реагирует быстро. Тем не менее, так как он хорошо работает с контроллером, я надеюсь, что он подходит без дальнейших настроек.
источник
CivilizedBeasts
Наконец-то пришло время похвастаться моими животными
Моя порода думает, что охота несколько примитивна, поэтому они работают вместе в команде из 4 человек, и поэтому они отказываются от своего 5-го союзника, потому что: меньше хищников = больше добычи для себя. То, что они в основном делают, это то, что люди делают, они ловят добычу и заботятся о своем скоте;)
Моим грудям становится довольно трудно выжить с менее чем 200 жертвами на ходу + -12.000 только с вражескими Netcats в игре. Вы будете счастливы с этой породой, так как она действительно пожирает огромное количество добычи со скоростью, с которой не может справиться ни одна другая порода (не то, что быстрая и большая бойня дает победу, но это влияет на (длительное) время, которое занимает целый раунд).
источник
Рубиновые грифы
А вот и пачка более активных паразитов . Они пытаются окружить ближайшего движущегося хищника , чтобы они могли украсть его добычу . Они немного зависят от удачи, поскольку у них нет умного способа выбрать, кому следовать, но они обычно бьют охотников и иногда пауков .
Они не совсем закончены, так как я опубликовал это, чтобы подтолкнуть темп :)
Я надеюсь:
22 апреля 2014: добавлена скука , которая делает их менее липкими и позволяет им охотиться за добычей самостоятельно и искать хищников
источник
ЗлыеЭко ВерблюдыИзменить: мутация # 2. О, нет, я опоздал с моей реализацией прогноза движения добычи, чтобы быть первым, кто победил Netcats. ОК, пусть будет так.
Эта мутация имеет
$hunger_critical
переменную (постоянную). Изменение его значения выше 1000 заставляет Верблюдов всегда охотиться, как Ясновидящих. Затем:Если
$hunger_critical
установлено, например, 500 (как показано ниже), то мои верблюды (увидев ужасы цивилизации ) пытаются вести себя экологически безвредно (следовательно, они изменили название своей породы), то есть они убивают только когда голодны. Если они не голодны, они патрулируют критические районы острова - центр и углы, чтобы предотвратить бессмысленную бойню других охотников. Ну, с центром, это более или менее работает. Идея кружить по углам состояла в том, чтобы отогнать добычу и усложнить жизнь кошкам и паразитам. Ну, это не работает. Глупая добыча все равно уходит в углы.Интересно также, что
flock[ALIGN]
компонент может быть угадан только хищниками, и моя реализация отличается от реализации justhalf. Я боюсь , что какая - то незначительная ошибка в моемплагиатереализации кода Geobits', наблюдая / сравнивая отдельные охоты на Верблюды против ясновидящих.И программа довольно длинная, извините.
Изменить: мутация # 1. Остров оказывается довольно радиоактивным (что объясняет отсутствие растительности и необъяснимый характер «добывающих» существ), поэтому вот первая мутация моих верблюдов. Любой из них может стать одиночным охотником, если голоден или нет свободного уголка для всех. Охотник пытается активно преследовать ближайшую добычу. Если его нет, он патрулирует широким кругом вокруг центра острова, а затем преследует ближайшее существо, когда находит его. К сожалению, направление добычи становится непредсказуемым, когда оно приближается к своему рое (стоит исследовать ...), поэтому одиночная погоня не очень эффективна. Но если это удастся, верблюд идет переварить в ближайший свободный угол (если есть). Когда уровень голода ниже определенного уровня, любой верблюд покидает свой угол (вероятно, проклинает Netcats ('где еда?') )) и выходит в свободный роуминг самостоятельно. И так далее.
Одна и та же шутка, рассказанная дважды, не смешна, но (1) я должен был начать где-то, и я новичок в этом, (2) Честно, я думал о угловой тактике (а кто нет?), Наблюдая за Netcats, перед Ruby Пауки появились на острове.
Итак, когда-нибудь слышали о плотоядных верблюдах? Бедные животные однажды проснулись на этом забытом богом острове, чтобы вообще не найти ни травы, ни деревьев, но множество странных зеленых, хотя съедобных, быстро движущихся (довольно раздражающих) мелочей. Не имея охотничьих привычек (но они скоро мутируют, я надеюсь), мои верблюды разработали очень злую схему выживания: они делятся и идут каждый в 1 из 4 углов, а пятый идет в центр (чтобы умереть там первым, так как оказывается). На своих направлениях они терпеливо ждут, выполняя своего рода верблюжий военный танец, или, может быть, они просто стараются не наступать на других животных, уже находящихся там, пауков и всех ...
источник
vec
свойство в основном просто смещение от предыдущего поворота к текущему. И, как я уже сказал, мы проводим сопоставление из предыдущего хода, чтобы выяснить, какая добыча идет в какую сторону, мы не можем полагаться на порядок добычи. Это возможно, потому что жертвы обычно (в типичном сценарии) держатся на достаточном расстоянии друг от друга (> 12 единиц), и поэтому большую часть времени мы можем сопоставить жертвы в предыдущем ходу с текущим ходом.AbleDogs - PHP
Эти милые собаки научились кусать добычу, чтобы прогонять ее вдоль стен. Они также любят бродить по пастбищам в поисках новых жертв. Наконец, их учили воздерживаться от еды, если им действительно не нужны калории.
Поместите код в
AbleDogs
файл и запустите его сphp AbleDogs
Общие Соображения
Это финал, который имеет значение. У вас может быть самый умный алгоритм охоты, если вы не заметите и поймаете последние несколько одиночных жертв быстрее, чем противник, вы проиграете.
Если ваши хищники не могут поймать добычу в одиночку (или, по крайней мере, парами), вы начинаете жарить, как только плотность добычи падает настолько низко, что вы можете полагаться либо на слепую удачу, либо блокируя добычу по углам.
Предиктор движения добычи в основном обязателен. Я не могу себе представить, что можно победить программу, основанную на предикторах, без собственного предиктора.
Хвостовая погоня
Самый неэффективный способ поймать добычу - преследовать ее. Если предположить, что один хищник преследует одну добычу и не имеет внешних воздействий (стены, другие жертвы и т. Д.), Погоня за хвостом может длиться вечно. Как только вы вводите радиус видимости добычи в 30 единиц, жертва бежит со скоростью 6 для ваших 6,1, так что вы получаете 0,1 расстояние за ход: по прямой линии вам потребуется около 300 поворотов, чтобы ее получить.
Принимая во внимание размер арены, жертва преодолеет диагональ квадрата 500 единиц, прежде чем ударить по стене или углу, что займет не более 117 поворотов.
Стратегия победы, очевидно, состоит в том, чтобы найти способ замедлить добычу, а именно, имея другого хищника или стену / угол перед ним.
предсказатель
Со скоростью добычи 6, жертва может перемещаться на площадь 36 * пи единиц в квадрате. С радиусом ловли 1, слепое предположение о том, где будет добыча, имеет шанс 1/36 * пи (около 1%) на успех. Очевидно, что-то должно быть сделано, чтобы улучшить это!
Глядя на код механизма моделирования, вы можете видеть, что входные данные:
Хотя все позиции доступны, предыдущие скорости добычи не доступны. Единственный способ вычислить эти скорости - отслеживать каждую добычу от одного хода до следующего, что практически невозможно (если вы не внедрили очень умный алгоритм отслеживания движения). Таким образом, предиктор может легко воспроизвести все условия вычисления, за исключением того, какой вклад в скорость должен быть угадан.
В случае с одной добычей скорость можно отслеживать без особых проблем, что позволяет создать «идеальный» предиктор, чтобы поймать добычу, изолированную от стада. Это в основном все, что вам нужно для эндшпиля, когда жертв слишком мало, чтобы взаимодействовать друг с другом. Когда жертвы в изобилии и эффект скопления достаточно силен, чтобы обмануть предсказателя, абсолютная плотность жертв компенсирует ошибки (если вы не поймаете ту, на которую рассчитывали, скорее всего, вы получите одного из ближайших друзей ).
Голодные жертвы
Обладая точным знанием вычисления скорости добычи, можно «направить» заданную добычу в желаемом направлении, отрегулировав положение хищника.
Это позволяет прижать добычу к стене или направить ее к другому участнику стаи. Я попробовал некоторые изощренные стратегии, такие как зажатие добычи между двумя участниками стаи. К сожалению, это оказалось менее эффективным, чем текущая процедура «прикалывать и сканировать», поскольку из-за того, что два хищника заняты преследованием одной жертвы, у оппозиции слишком много свободных хищников, чтобы разведать пастбище.
Кража добычи
Одной из характеристик поведения жертв является то, что влияние хищника увеличивается пропорционально его расстоянию от добычи (при условии, что оно остается в пределах радиуса обзора добычи). Ближайший хищник попадает к добыче, а наименьшая жертва уклоняется от нее.
Это означает, что когда два хищника соревнуются, чтобы поймать добычу, самый близкий обязан получить ее первым. Даже супер-умный соперник, которому удалось бы расположиться прямо перед осью охотник / жертва, по сути, напугал бы добычу в челюсти соперника.
Чтобы украсть добычу, нужна хотя бы пара хищников. Один пойдет на убийство, а другой (и) останется в радиусе видимости добычи, настолько далеко от жертвы, насколько это возможно, чтобы максимизировать влияние и направить добычу к охотнику.
Кроме того, каждое изменение направления позволит соревнованию срезать угол с добычей, и удержание позади соперника возможно только в том случае, если «начальник» был достаточно близко к добыче в начале действия.
Таким образом, воровство добычи может быть успешным только в том случае, если начальные позиции «воровщиков» благоприятны, и вы можете сэкономить хотя бы второго хищника. По моему опыту, это не стоит сложности.
Предлагаемые изменения
Чтобы учесть более сложные стратегии, перемещение хищника выше максимальной скорости добычи может привести к голоду, пропорциональному превышению скорости. Скажем, например, движение до скорости 6 бесплатно, и каждая точка скорости выше 6 стоит 100 пунктов голода (переход к 6.3 стоит 30 пунктов голода за ход, сжигание 1000 пунктов голода позволит достичь скорости 16 за один ход - и умереть, если вы не наденете поймай добычу при этом!).
Вместо того, чтобы отдать убийство случайному хищнику, когда несколько человек достаточно близко, чтобы съесть добычу, я предлагаю разделить выгоду (например, 3 хищника будут получать по 333,33 очка голода каждый). Это позволило бы использовать более интересные стратегии эндшпиля (например, замаскирование врага-хищника может оказаться полезным, если вы считаете, что у вас больше голодающих очков).
Особый цвет для первой упаковки довольно сложно увидеть. Я предлагаю голубой или оранжевый вместо синего.
источник
Lazy Pack Haskell
Вам понадобится платформа haskell для запуска этого. Затем вы используете
runhaskell
команду, чтобы запустить его. Моя стая ждет, пока жертва придет к ним.источник
-silent
Не запись, я всегда заинтересован в добавлении индивидуального цвета для каждой участвующей записи в king-of-the-the-hill ;)
Кроме того, процесс приема пищи не визуализируется путем изменения цвета, а изменения размера, так что мы можем видеть несколько событий приема пищи за короткое время.
Game.java
Predator.java
источник