Вы - предприимчивая точка, которая хочет увеличить землю под ее контролем. Это довольно просто - отправляйтесь за пределы своей нынешней земли и возвращайтесь обратно на свою землю, и все в этом цикле теперь принадлежит вам. Но тут есть подвох. Если какая-то другая точка каким-то образом находит вашу петлю и пересекает ее, вы умираете.
Если вы еще не пробовали, перейдите на Splix.io и попробуйте игру. Используйте клавиши со стрелками для управления вашим движением.
GIF
Кредит: http://splix.io/
конкретика
Все игроки начинают со случайных позиций на доске 200х200. (Я оставляю за собой право изменить это :). У вас будет определенное количество ходов, чтобы набрать как можно больше очков. Очки подсчитываются по:
- Количество игроков, которых вы убили раз 300
- Количество земли, которой вы владеете в конце раунда
Это поднимает вопрос о том, что другие могут украсть вашу землю. Если они начнут петлю, которая пересекает часть вашей земли, они могут потребовать это. Если вы умрете во время раунда, вы потеряете все очки за этот раунд.
Каждый раунд имеет случайно выбранную группу игроков (максимум 5 уникальных игроков) (возможны изменения). Каждый игрок участвует в равном количестве раундов. Окончательный счет вашего бота определяется его средним за игру счетом. Каждая игра состоит из 2000 ходов (также могут быть изменены). Все боты делают свои ходы одновременно.
Случаи смерти
Голова прикладом
Оба игрока умирают, когда они сталкиваются друг с другом. Это все еще верно, даже когда оба игрока находятся на краю своего пространства.
Однако, когда только один из игроков находится на своей земле, другой игрок умирает.
Линия Крест
В этом случае умирает только фиолетовый игрок.
Вы не можете пересечь свою собственную линию.
Выход из доски
Если игрок попытается покинуть игровое поле, он умрет и потеряет все очки.
Захват области
Игрок захватит область, когда у него будет след, и он снова войдет в свою землю.
Красный цвет заполняет две красные линии. Единственный случай, когда игрок не заполняется, это когда другой игрок находится в цикле. Чтобы было ясно, это применимо только тогда, когда другой игрок сам находится в цикле, а не только земля, принадлежащая ему. Игрок может захватить землю у другого человека. Если игрок не может заполнить область, окруженную его следом, след превращается непосредственно в обычную землю. Если игрок внутри лупа другого игрока умирает, область в этом лупе заполняется. Каждый раз, когда игрок умирает, доска пересматривается для области, которая может быть заполнена.
Детали контроллера
Контроллер здесь . Она очень похожа на оригинальную игру, но были внесены небольшие изменения, чтобы сделать ее более подходящей для KotH и по техническим причинам. Он построен с помощью библиотеки @ NathanMerrill 's KotHComm , а также при значительной помощи @NathanMerrill. Пожалуйста, дайте мне знать о любых ошибках, которые вы найдете в контроллере в чате . Чтобы соответствовать KotHComm, я использовал коллекции Eclipse по всему контроллеру, но боты могут быть написаны с использованием только библиотеки Java Collections.
Все упаковано в uberjar на странице релизов github . Чтобы использовать его, загрузите его и прикрепите к своему проекту, чтобы вы могли использовать его для автозаполнения (инструкции для IntelliJ , Eclipse ). Чтобы проверить ваши представления, вы запускаете банку с java -jar SplixKoTH-all.jar -d path\to\submissions\folder
. Убедитесь, что у вас path\to\submissions\folder
есть имя субфолера java
, и разместите там все ваши файлы. Не используйте имена пакетов в своих ботах (хотя это может быть возможно с KotHComm, это просто немного больше проблем). Чтобы увидеть все варианты, используйте --help
. Чтобы загрузить все боты, используйте --question-id 126815
.
Написание бота
Чтобы начать писать бота, вы должны продлить SplixPlayer
.
Direction makeMove(ReadOnlyGame game, ReadOnlyBoard board)
- Именно здесь вы решаете, какой шаг вы хотите сделать своим ботом. Не должен возвращать ноль.
HiddenPlayer getThisHidden()
- Получить
HiddenPlayer
версиюthis
. Полезно для сравнения вашего бота с доской.
- Получить
enum Direction
- Значения
East
(х = 1; у = 0)West
(х = -1; у = 0)North
(х = 0; у = 1)South
(х = 0; у = -1)
Direction leftTurn()
- Получить то,
Direction
что вы получите, если вы сделали левый поворот.
- Получить то,
Direction RightTurn()
- Получить то,
Direction
что вы получите, если вы сделали правильный поворот.
- Получить то,
ReadOnlyBoard
Это класс, где вы получаете доступ к доске. Вы можете получить либо локальное представление (20x20) доски с указанием позиций игрока, либо глобальное представление (всю доску) только с информацией о том, кто владеет и претендует на позиции на доске. Это также, где вы получаете свою позицию.
SquareRegion getBounds()
- Получить размер доски.
MutableMap<com.nmerrill.kothcomm.game.maps.Point2D,ReadOnlySplixPoint> getGlobal()
- Получить глобальную карту доски.
MutableMap<com.nmerrill.kothcomm.game.maps.Point2D,ReadOnlySplixPoint> getView()
- То же самое
getGlobal()
, за исключением того, что оно ограничено областью 20x20 вокруг вашего игрока и показывает позиции игрока.
- То же самое
Point2D getPosition(SplixPlayer me)
- Получить позицию вашего игрока. Использовать как
board.getPosition(this)
.
- Получить позицию вашего игрока. Использовать как
Point2D getSelfPosition(ReadOnlyBoard)
- Получить свою позицию на доске. Использование:
Point2D mypos = getSelfPosition(board)
- Получить свою позицию на доске. Использование:
ReadOnlyGame
ReadOnlyGame
только обеспечивает доступ к количеству ходов, оставшихся в игре до конца int getRemainingIterations()
.
ReadOnlySplixPoint
HiddenPlayer getClaimer()
- Получить
HiddenPlayer
версию о том, кто претендует на очко - утверждая = след.
- Получить
HiddenPlayer getOwner()
- Получите, кому принадлежит точка.
HiddenPlayer getWhosOnSpot()
- Если игрок находится в этой точке, верните скрытую версию. Работает только в
getLocal()
.
- Если игрок находится в этой точке, верните скрытую версию. Работает только в
Point2D
В отличие от других классов здесь, Point2D
содержится в библиотеке KotHComm.com.nmerrill.kothcomm.game.maps.Point2D
Point2D(int x, int y)
int getX()
int getY()
Point2D moveX(int x)
Point2D moveY(int y)
Point2D wrapX(int maxX)
- Оберните
x
значение, чтобы быть в пределах диапазонаmaxX
.
- Оберните
Point2D wrapY(int maxY)
- Оберните
y
значение, чтобы быть в пределах диапазонаmaxY
.
- Оберните
int cartesianDistance(Point2D other)
- Это переводит на то, сколько ходов потребуется игроку, чтобы переместиться из пункта a в пункт b.
Поддержка Clojure
Компилятор Clojure в комплекте с SplixKoTH-all.jar
, так что вы можете использовать Clojure для своего бота! Обратитесь к моему, random_bot
чтобы увидеть, как его использовать.
Отладка бота
Контроллер поставляется с отладчиком для тестирования стратегий. Чтобы запустить его, запустите банку с --gui
опцией.
Чтобы прикрепить отладчик к банке, следуйте этим инструкциям для IntelliJ или этим инструкциям для Eclipse (версия Eclipse не проверена).
Если вы используете отладчик с вашим кодом, вы можете использовать это, чтобы помочь визуализировать то, что видит ваш бот. Установите точку останова в начале makeMove
вашего бота и убедитесь, что он останавливает только текущий поток. Затем нажмите кнопку «Пуск» в пользовательском интерфейсе и выполните пошаговый просмотр кода.
Теперь, чтобы сложить все вместе:
Бегущие боты
Чтобы запускать своих ботов вместе с другими, вам нужно запустить jar на странице релизов. Вот список флагов:
--iterations
(-i
) <=int
(по умолчанию500
)- Укажите количество игр для запуска.
--test-bot
(-t
) <=String
- Запускайте только те игры, в которые включен бот.
--directory
(-d
) <= Путь- Каталог для запуска представлений. Используйте это, чтобы запустить своих ботов. Убедитесь, что ваши боты находятся в подпапке пути с именем
java
.
- Каталог для запуска представлений. Используйте это, чтобы запустить своих ботов. Убедитесь, что ваши боты находятся в подпапке пути с именем
--question-id
(-q
) <=int
(только использовать126815
)- Скачайте и скомпилируйте другие материалы с сайта.
--random-seed
(-r
) <=int
(по умолчанию случайное число)- Дайте семя бегуну, чтобы у ботов, использующих случайное число, могли быть воспроизведены результаты.
--gui
(-g
)- Запустите интерфейс отладчика вместо запуска турнира. Лучше всего использовать с
--test-bot
.
- Запустите интерфейс отладчика вместо запуска турнира. Лучше всего использовать с
--multi-thread
(-m
) <=boolean
(по умолчаниюtrue
)- Запустите турнир в многопоточном режиме. Это обеспечивает более быстрый результат, если ваш компьютер имеет несколько ядер.
--thread-count
(-c
) <=int
(по умолчанию4
)- Количество потоков для запуска, если разрешено использование нескольких потоков.
--help
(-h
)- Распечатать справочное сообщение, подобное этому.
Чтобы запустить все представления на этой странице, используйте java -jar SplixKoTH-all.jar -q 126815
.
Форматирование вашего поста
Чтобы гарантировать, что контроллер может загрузить все боты, вы должны следовать этому формату.
[BotName], Java // this is a header
// any explanation you want
[BotName].java // filename, in the codeblock
[code]
Также не используйте декларацию пакета.
Табло
+------+--------------+-----------+
| Rank | Name | Score |
+------+--------------+-----------+
| 1 | ImNotACoward | 8940444.0 |
| 2 | TrapBot | 257328.0 |
| 3 | HunterBot | 218382.0 |
+------+--------------+-----------+
Пожалуйста, дайте мне знать, если какая-то часть правил неясна, или если вы обнаружите какие-либо ошибки в контроллере в чате .
Повеселись!
источник
Ответы:
ImNotACoward, Java
Этот бот
трусливыйэксперт по выживанию. Если поблизости нет врага, он претендует на часть земли. Если петля другого игрока может быть достигнута безопасно, оннаносит удар другому игроку в спину,вовлекает другого игрока в поединок. Если другой игрок не может быть атакован безопасно, онбежит,выполняет стратегическое отступление на свою землю.источник
TrapBot, Java
Это, пожалуй, самый простой бот. Все, что он делает, это прослеживает край доски, удваивая себя, чтобы уменьшить риск быть убитым.
источник
random_bot, Clojure
Это RandomBot , но мне пришлось придерживаться соглашений об именах, и некоторые проблемы не позволяют мне использовать дефис в имени, поэтому подчеркиваю царствование!
make-move
П возвращает VEC с первым пунктом являетсяDirection
вы хотите двигаться, а второй является состояние вы хотите передать обратно к вам на следующий ход. Не используйте внешние атомы, так как этот код может запускать несколько игр параллельно.источник
HunterBot, Java
Один из самых простых ботов. Он ищет на доске места, чтобы убить других, и будет следовать кратчайшим путем, чтобы добраться до позиции убийства. Если он находится за пределами своей территории, он будет делать случайные ходы, пока у него не появится еще одно отверстие, чтобы убить другого игрока. У него есть некоторая логика, чтобы он не мог перебежать через себя, а когда все остальные игроки мертвы, он возвращается домой. Однажды дома он просто идет на маленькой площади.
источник