Асимметричный КОТ: поймай кота
ОБНОВЛЕНИЕ : Гист-файлы обновляются (включая новые подпункты), так как 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 191674 8 flawr
StupidFill 214246 9 flawr
Achilles 76820 6 The E
Agamemnon 74844 5 The E
CloseCatcher 54920 4 randomra
ForwordCatcher 94246 7 MegaTom
Dijkstra 46500 2 TheNumberOne
HexCatcher 48832 3 randomra
ChoiceCatcher 43828 1 randomra
RandCat 77928 7 flawr
StupidRightCat 81794 6 flawr
SpiralCat 93868 5 CoolGuy
StraightCat 82452 9 CoolGuy
FreeCat 106304 3 randomra
RabidCat 77770 8 cain
Dijkstra's Cat 114670 1 TheNumberOne
MaxCat 97768 4 Manu
ChoiceCat 113356 2 randomra