Это испытание для Точек и Ящиков с изображением короля холма (он же Свинья). Игра проста, в свою очередь просто нарисуйте линию на пустом заборе. Каждый раз, когда вы завершаете квадрат, вы получаете очко. Кроме того, поскольку мы играем по правилам чемпионата , если вы завершите хотя бы один квадрат в свой ход, вы получите дополнительный ход. Это круговой турнир, где каждый бот играет друг друга дважды 12 раз по сетке 9x9. Проверьте этот матч между двумя титанами в супертяжелом весе, где ChainCollector делает фарш из действующего со-чемпиона Asdf:
правила
- 0,5 секунды времени за ход.
- Не мешать другим ботам.
- Используйте PigPen.random () и PigPen.random (int) для случайности.
- Нет записи в файлы.
- Бот и все его постоянные данные будут сбрасываться каждый раз при смене противника (каждые 12 раундов).
Боты
Каждый бот расширяет Player.java:
package pigpen;
public abstract class Player {
public abstract int[] pick(Board board, int id, int round);
}
Board
является игровой доской, которая в основном служит для того, чтобы дать вам доступ к Pen
классам, и id
является вашим идентификатором игрока (говорит вам, если вы первый или второй), round
сообщает вам, в каком раунде вы играете против одного и того же противника (1 или 2). Возвращаемое значение - это int[]
, где первый элемент - это penID (1-индексированный), а второй элемент - fenceID (0-indexed). Смотрите Pen.pick(int)
простой способ генерирования этого возвращаемого значения. Смотрите страницу Github для примера игроков и JavaDoc. Поскольку мы используем только квадратную сетку, игнорируем любые функции и поля, связанные с шестиугольниками.
Как запустить
- Скачать источник с Github.
- Напишите свой бот-контроллер (обязательно включите
package pigpen.players
) и поместите его вsrc/
папку; - Компилировать с
javac -cp src/* -d . src/*.java
. Выполнить сjava pigpen.Tournament 4 9 9 false
(последние два числа можно изменить, чтобы настроить размер сетки. Последняя переменная должна быть установлена только,true
если вы хотите использовать программное обеспечение pp_record.)
множество
- ChainCollector: 72
- Asdf: 57
- Ленивые: 51
- Финишер: 36
- = LinearPlayer: 18
- = BackwardPlayer: 18
- RandomPlayer: 0
Смотрите также:
Примечание : эта игра - соревновательный вызов, и ее нелегко решить из-за того, что она дает игрокам дополнительный ход для завершения бокса.
Спасибо Натану Мерриллу и Даррелу Хоффману за консультацию по этому вопросу!
Обновления :
- Добавлен
moves(int player)
метод в класс Board, чтобы получить список каждого хода, который сделал игрок.
Неограниченная награда (100 представителей) :
Первый человек, который публикует решение, которое выигрывает каждый раунд и использует стратегию (корректирует игру, основываясь на наблюдении за тем, как играет противник).
источник
Ответы:
лентяй
Этот бот ленивый. Он выбирает случайное место и направление и продолжает строить в этом направлении, не двигаясь слишком сильно. Есть только 2 случая, когда он делает что-то другое:
источник
pen.n(Pen.LEFT)
(функция соседей).pick()
метода теперь естьint round
параметр в конце, поэтому, пожалуйста, добавьте его.ChainCollector
Этот бот любит цепочки 1 . Он хочет как можно больше из них. Иногда он даже жертвует маленькой частью цепи, чтобы выиграть большую.
[1] Цепочка состоит из ручек, соединенных открытыми заборами, где каждая ручка имеет 1 или 2 открытых забора. Если можно закончить одну ручку, принадлежащую цепочке, то из-за правила чемпионата можно закончить и всю цепочку.
источник
финишер
Использует Comparator, чтобы выбрать ручку с большинством доступных заборов, но отдает приоритет ручкам с только 1 доступным забором. (7 используется вместо 5, чтобы этот код работал и в режиме шестиугольника)
источник
Asdf
Назначает оценку каждому забору и затем выбирает лучшее из них. Например: ручка с одним открытым забором имеет 10 баллов, а ручка с 2 открытыми заборами - 8 баллов.
Кажется, что Lazybones использует похожую стратегию, потому что это связано с этим ботом.
источник
LinearPlayer
На самом деле проще всего написать этого бота
return null
, потому что неверная запись автоматически выберет первый доступный забор. Этот код не использует ярлыки и вручную генерирует возвращаемое значение.источник
BackwardPlayer
Этот код использует метод ярлыка
Pen.pick(int)
для генерации возвращаемого значения. Если верхний забор недоступен, он выберет ближайший забор, идущий по часовой стрелке.источник
RandomPlayer
Та же идея, что и у BackwardPlayer, но случайным образом выбирается перо. Обратите внимание,
+1
потому что Pen's 1-indexed.источник