Задний план
Игра Морра простая игра. В «оригинальной» версии несколько игроков одновременно выбрасывают 0-5 своими руками, угадывая общую сумму рук каждого. Версия, которую я здесь использую, была изменена, чтобы увеличить потенциал для нетривиальной стратегии, и она описана ниже:
- Есть два игрока.
- Как и в каменных ножницах, игроки двигаются одновременно.
- Каждый ход каждый игрок выбирает число 0-5, а также угадывает выбор своих оппонентов 0-5. Это означает, что два числа выводятся каждый ход. Для уточнения оба выходных числа должны быть в диапазоне 0-5 включительно.
- Если вы правильно угадали выбор своего оппонента, но оппонент не угадал правильно, вы выиграли определенное количество очков, равное сумме двух сыгранных чисел. Например, если сыграно 3 и 5, правильное предположение будет стоить 8 баллов.
- Если оба или ни один из игроков не угадают правильно, очки не начисляются.
- Человек с наибольшим количеством очков после 1000 раундов побеждает в этой игре.
Турнир
Турнир будет проводиться в круговом стиле и будет проводиться путем создания каждой возможной пары участников. За каждую победу участник получает 2 победных очка. Каждая ничья приводит к 1 победному очку. За потерю не набираются победные очки.
Интуитивно, победитель турнира должен быть участником с наибольшим количеством победных очков против других.
Как войти
Будет два способа подачи ботов на соревнования. Первый и наиболее предпочтительный метод заключается в реализации интерфейса Java, предоставляемого контроллером. Второй способ - написать независимую программу.
Давайте сначала рассмотрим метод Java. Интерфейс, который вам нужно реализовать, это Player
и он определяет два метода: public String getName()
идентифицирует вашего бота и public int[] getMove(String[] args)
принимает args
в качестве массива шесть строк mychoices myguesses myscore opponentchoices opponentguesses opponentscore
. Примером является следующее:
042 045 0 324 432 6
Это означает, что я выбрал 0 в первом раунде и предположил, что мой противник собирается бросить 0. Мой противник бросил 3 и предположил, что я брошу 4. В третьем раунде мой оппонент сделал правильное предположение, что я брошу 2, что означает, что он получает 2 + 4 = 6 баллов.
Ваш метод вернет массив из двух целых чисел, которые вы выбираете и угадываете соответственно. Пример {4,2}
для выбора 4 и предположения 2.
Вот пример полного Java-бота, написанного как метод. Если вы хотите, ваше представление должно включать только то, что происходит в getMove
методе.
import java.util.Random;
/**
* A simple example Morra bot to get you started.
*/
public class ExampleBot implements Player
{
public String getName()
{
return "ExampleBot";
}
public int[] getMove(String [] args)
{
//easiest way I know to break down to create a move history
//(just contains their throw history)
char[] theirThrowsC = args[3].toCharArray();
int[] theirThrows = new int[theirThrowsC.length];
for(int i = 0; i < theirThrowsC.length; i++)
{
theirThrows[i] = Integer.parseInt(Character.toString(theirThrowsC[i]));
}
//get my score
int myScore = Integer.parseInt(args[2]);
Random r = new Random();
int guess = r.nextInt(6);
if(theirThrows.length > 0)
{
guess = theirThrows[theirThrows.length-1];
}
//throws a random number, guesses what they threw last
return new int[] {r.nextInt(6),guess};
}
public static int otherMethod(int example) //you can write additional static methods
{
return 0;
}
}
Как независимая программа
В настоящее время я ограничен в поддержке других языков. Помимо Java, я могу принимать программы, написанные на Python 3.4, Perl 5 или Ruby 2.1.5. Если есть язык, который, кажется, нужен нескольким людям, я сделаю все возможное, чтобы добавить его.
Ввод вашей программы будет аргументами в командной строке. Это может выглядеть так:
perl awesomebot.plx 042 045 0 324 432 6
Вывод вашей программы должен быть вашим выбором, за которым следует ваше предположение, за которым следует пробел.
Пожалуйста, включите в свой ответ точную команду, необходимую для его запуска. Имейте в виду, что я использую Windows 8.1.
Дополнительные правила
Сохранение состояния и тайм-ауты
Ваша программа сможет создать один текстовый файл в локальном каталоге, где вы можете хранить информацию. Эта информация будет храниться в течение всего турнира, но впоследствии будет удалена. Дайте файлу имя, которое я могу опознать.
Время ответа вашего кода составляет 500 миллисекунд. Невозможность ответить в срок (или неверный ход) приведет к конфискации этого конкретного матча. Представления Java в настоящее время имеют пассивный тайм-аут (который я могу обновить до активного), в то время как представления не-Java имеют активный тайм-аут, когда их процесс завершается через 500 миллисекунд.
Больше правил подачи
- Вам разрешено несколько заявок, если они соблюдают правила и не помечают команду.
- Каждая запись должна быть уникальной. Вы не можете сделать точную копию логики другого бота на другом языке.
- Боты не могут взаимодействовать друг с другом (формировать команду любого рода).
- Вы не можете использовать логику других ботов внутри вашего бота, например, чтобы идентифицировать вашего конкурента и предсказать его действия. Конечно, вы можете попытаться определить стратегию вашего противника.
- Не пытайтесь связываться с контроллером, другими участниками или моим компьютером. Не подключайтесь к внешним источникам информации.
Контроллер
Текущая версия контроллера находится здесь . Он написан на Java 8. Файл «Турнир» является основным контроллером, который также содержит список участников (если вы хотите провести свои собственные соревнования).
Leaderboard
Мне не очень часто удавалось обновлять таблицу лидеров. Я довольно занят в эти выходные. Под «довольно занятым» я подразумеваю отсутствие доступа к компьютеру с 6:30 до 21:30. Вот результаты после 5 пробежек. По какой-то причине бот «Эхо» продолжал терять свои права (возможно, я виноват, я еще не исследовал).
170 - Quinn and Valor
158 - Historian
142 - DeltaMax
140 - MorraCowbell
132 - Extrapolator
115 - Rainbolt
102 - Popularity
100 - Interpolator
83 - CounterBot
80 - Basilisk
76 - Erratica
65 - Trendy
63 - Scholar
62 - RandomGuesser
60 - KingFisher
59 - NullifierBot
55 - EvolvedBot
48 - Confused
кредит
Большое спасибо Rainbolt и Peter Taylor за помощь с контроллером.