Асимметричный КОТ: Поймай кота
ОБНОВЛЕНИЕ : Гист-файлы обновляются (включая новые подпункты), так как Controller.java не перехватывает исключения (только ошибки). Теперь он ловит ошибки и исключения, а также печатает их.
Эта задача состоит из двух потоков: это нить кошки, нить ловушки можно найти здесь .
Контроллер можно скачать здесь .
Это асимметричный КОТ: каждое представление является либо кошкой, либо ловцом . Есть игры между каждой парой каждой кошки и ловца. Кошки и ловцы имеют отдельные рейтинги.
ловец
Есть кошка на гексагональной сетке. Ваша задача - поймать его как можно быстрее. Каждый ход вы можете поместить ведро воды в одну ячейку сетки, чтобы кошка не могла туда попасть. Но кошка (возможно) не настолько глупа, и всякий раз, когда вы кладете ведро, кошка перемещается в другую ячейку сетки. Поскольку сетка шестиугольная, кошка может идти в 6 разных направлениях. Ваша цель - окружить кота ведрами с водой, чем быстрее, тем лучше.
Кот
Вы знаете, что ловец хочет поймать вас, поместив вокруг себя ведра с водой. Конечно, вы пытаетесь уклониться, но поскольку вы ленивый кот (как и кошки), вы точно делаете один шаг за раз. Это означает, что вы не можете оставаться на том же месте, что и вы, но вам нужно переместиться в одно из шести окружающих мест. Всякий раз, когда вы видите, что ловец положил новое ведро с водой, вы идете в другую камеру. Конечно, вы пытаетесь уклониться как можно дольше.
сетка
Сетка шестиугольная, но поскольку у нас нет гексагональных структур данных, мы берем 11 x 11
квадратный двумерный массив и имитируем шестиугольное «поведение», которое кошка может перемещать только в 6 направлениях:
Топология является тороидальной, это означает, что если вы наступите на ячейку «вне» массива, вы будете просто перенесены в соответствующую ячейку на другой стороне массива.
Игра
Кошка начинает с заданной позиции в сетке. Ловец может сделать первый ход, затем кошка и ее ловец попеременно ходят, пока кошка не будет поймана. Количество шагов - это результат этой игры. Кошка старается набрать как можно больше очков, ловец пытается набрать как можно меньше очков. Средняя сумма по всем играм, в которых вы участвовали, будет оценкой вашего участия. Есть два отдельных рейтинга, один для кошки, один для ловцов.
контроллер
Данный контроллер написан на Java. Как ловец или кошка, каждый из вас должен каждый реализовать класс Java (уже есть несколько примитивных примеров) и поместить его в players
пакет (и обновить список кошек / ловцов в классе Controller), но вы также можете написать дополнительные функции в этом классе. Контроллер поставляется с каждыми двумя работающими примерами простых классов кошек / ловцов.
Поле представляет собой 11 x 11
2D- int
массив, в котором хранятся значения текущих состояний ячеек. Если ячейка пуста, она имеет значение 0
, если есть кошка, она имеет значение, -1
а если есть область, то есть 1
.
Есть несколько функций, которые вы можете использовать: isValidMove()
/ isValidPosition()
для проверки правильности вашего хода (кошка) / позиции (ловушка).
Каждый раз, когда ваша очередь, ваша функция takeTurn()
вызывается. Аргумент содержит копию текущей таблицы и имеет методы, такие как read(i,j)
чтение ячейки (i,j)
, а также isValidMove()/ isValidPosition()
проверяет правильность вашего ответа. Это также управляет наложением тороидальной топологии, что означает, что даже если сетка имеет размер только 11 x 11, вы все равно можете получить доступ к ячейке (-5,13).
Метод должен возвращать int
массив из двух элементов, которые представляют возможные ходы. Для кошек это те, {-1,1},{0,1},{-1,0},{1,0},{0,-1},{1,-1}
которые представляют относительное положение того, куда кошка хочет идти, а ловцы возвращают абсолютные координаты того, где они хотят поместить ведро {i,j}
.
Если ваш метод приводит к неверному ходу, ваша заявка будет дисквалифицирована. Движение считается недействительным, если в вашем пункте назначения уже есть корзина или движение не разрешено / пункт назначения уже занят (как кошка), или если уже есть корзина / кошка (как ловец). Вы можете проверить это заранее с помощью данных функций.
Ваше представление должно работать достаточно быстро. Если ваш метод занимает больше 200 мс для каждого шага, он также будет дисквалифицирован. (Желательно намного меньше ...)
Программы могут хранить информацию между этапами.
Материалы
- Вы можете сделать столько заявок, сколько захотите.
- Пожалуйста, не вносите существенных изменений в материалы, которые вы уже отправили.
- Пожалуйста, каждый представленный в новом ответе.
- Каждое представление должно иметь свое уникальное имя.
- Представление должно состоять из кода вашего класса, а также описания, которое говорит нам, как работает ваше представление.
- Вы можете написать строку
<!-- language: lang-java -->
для исходного кода, чтобы получить автоматическую подсветку синтаксиса.
счет
Все кошки будут соревноваться со всеми ловцами одинаковое количество раз. Я постараюсь регулярно обновлять текущие оценки, победители будут определены, когда активность снизится.
Этот вызов вдохновлен этой старой флеш игрой
Спасибо @PhiNotPi за тестирование и конструктивную обратную связь.
Текущие результаты (100 игр за пару)
Name Score Rank Author
RandCatcher 191962 8 flawr
StupidFill 212688 9 flawr
Achilles 77214 6 The E
Agamemnon 74896 5 The E
CloseCatcher 54776 4 randomra
ForwordCatcher 93814 7 MegaTom
Dijkstra 47558 2 TheNumberOne
HexCatcher 48644 3 randomra
ChoiceCatcher 43834 1 randomra
RandCat 77490 9 flawr
StupidRightCat 81566 6 flawr
SpiralCat 93384 5 CoolGuy
StraightCat 80930 7 CoolGuy
FreeCat 106294 3 randomra
RabidCat 78616 8 cain
Dijkstra's Cat 115094 1 TheNumberOne
MaxCat 98400 4 Manu
ChoiceCat 113612 2 randomra
main.Controller
, вызыватьgetCatchers()
и имитировать / саботировать ответы ловцов с помощью своихtakeTurn
методов?Ответы:
FreeCat
Выбирает движение, которое даст ему наиболее возможные пути после 3 шагов, если поле не изменится.
FreeCat против Ахиллеса:
источник
Кот Дейкстры
Он выучил и применяет мастер-алгоритм своего мастера. Обратите внимание, что он зависит от некоторых методов в своем соответствующем классе ловца.
Кот Дейкстры против Hexcatcher (нуждается в обновлении):
Как он работает:
Он пытается найти движение, которое минимизирует неровность доски по отношению к себе. Для получения дополнительной информации см. Соответствующий пост ловца.
С обновлением:
Теперь он избегает странных геометрических фигур, которые иногда образуют водяные ведра.
источник
MaxCat
Я попытался реализовать алгоритм Minimax. Тем не менее, он не очень хорошо работает из-за ограниченного времени. Редактировать: теперь он использует многопоточность, но (по крайней мере, на моем компьютере) я не могу установить глубину больше. В противном случае происходит тайм-аут. Используя ПК с 6 или более ядрами, эта подача была бы намного лучше :)
МаксКат против Дейкстры:
источник
Field
общественности. Извините, я еще не обновил файлы, но мы обсуждали это ранее!SpiralCat
Двигается по спирали. Это
SpiralCat против Агамемнона:
источник
turns[i]
чтобыturns[i%6]
для того , чтобы избежать из оценок (которые не должны иметь место в этом stuation).turns[i%6]
? Я имею в виду,takeTurn
не будет вызван, если кот заблокирован, верно?i>=6
никогда не должно произойти.RabidCat
У RabidCat есть гидрофобия, поэтому он боится воды. Он находит ближайший и бежит в противоположном направлении.
RabidCat против ForwordCatcher:
источник
ChoiceCat
Для каждой возможной новой позиции кошки мы проверяем ее качество и выбираем лучшую. Доброта - это функция двух лучших соседних клеток, которые находятся дальше от позиции кошки, чем от позиции, чей счет мы вычисляем. Мы используем только две клетки, потому что одну можно заблокировать, а кошке нужна еще одна, чтобы уйти. Наша функция предпочитает две довольно хорошие ячейки, чем одну большую и одну плохую. Позиции с сегментами имеют оценку 0, а самые дальние свободные ячейки - 1.
ChoiceCat кажется лучше, чем нынешние кошки.
ChoiceCat против ChoiceCatcher:
источник
StupidRightCat
Это было сделано только для тестирования контроллера. Кошка двигается вправо, когда это возможно, в противном случае движется в случайном направлении.
источник
RandCat
Это было сделано только для тестирования контроллера. Кошка просто движется случайно.
источник
StraightCat
Этот кот двигается прямо.
В начале он выбирает случайное направление и продолжает движение в этом направлении, пока не может, в этом случае он смещает направление по часовой стрелке в следующее действительное направление и повторяет этот процесс.
StraightCat против Агамемнона:
источник