Давайте играть в игру мета-крестики-нолики!
Это турнир по методу крестики-нолики в стиле « король горы» . Правила Meta Tic-Tac-Toe следующие:
Все обычные правила крестики-нолики применяются.
Для создания одной мастер-доски предусмотрено девять досок. Вот так:
0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8
доска 0 относится к верхней левой доске, доска 1 относится к верхней средней доске ... вот так
0|1|2 ----- 3|4|5 ----- 6|7|8
Если я скажу «доска 3», тайл 4, это означает центральную плитку доски в середине слева.
Вам разрешено двигаться только на одной из небольших досок.
Если вы выиграете одну из небольших досок, вся эта доска считается вашей плиткой.
Если одна из досок заполняется до того, как один из ботов ее выиграл, она считается плиткой nobody.
Тот, кто выигрывает мастерскую доску, побеждает!
Тем не менее, есть важный поворот. Скажем, я иду на доске 7, клетка 2. Это означает, что на вашем ходу вы можете идти только на доске 2. Затем, допустим, вы идете на доску 2, клетку 5. Теперь на моем ходу я могу пойти только на доске 5. Допустим, доска 1 заполнена. (Осталось больше мест, или один из нас уже выиграл 1-ю доску). Теперь, если я перейду на 5-ю доску, тайл 1, вы можете перейти на любую доску, какую захотите.
Эти правила можно рассматривать как:
- Вы должны играть на доске, соответствующей позиции, сыгранной предыдущим игроком.
- Если Х играет на доске 2, тайл 5; О должен играть на доске 5
- Если целевая доска полна (ничья) или уже имеет победителя, следующий ход будет неограниченным.
- Доска с победителем не может быть разыграна, даже на ход без ограничений.
Если это немного сбивает с толку, вы можете попробовать это онлайн здесь. (не забудьте переключиться с «первых выигрышей плитки» на «3 плитки подряд»)
Теперь вот правила вызова.
Вы должны написать бота, который играет в эту игру.
Бот 1 - это Х, и он должен идти первым. Он будет вызываться с этими аргументами командной строки (без содержимого в скобках):
X (whose turn) --------- (board 0) --------- (board 1) --------- (board 2) --------- (board 3) --------- (board 4) --------- (board 5) --------- (board 6) --------- (board 7) --------- (board 8) --------- (master board) xx (last move)
Первый символ представляет, кто бот. В этом случае бот 1 играет за X. Следующие 9 строк относятся к 9 доскам. 11-я строка относится к основной доске. «Хх» - последний ход. Теперь бот1 должен напечатать два числа от 0 до 8. Номер 1 - доска, на которой движется ваш бот, а номер 2 - фишка на этой доске. Контроллер будет отслеживать этот ход. Допустим, бот 1 печатает 38. Теперь доска будет выглядеть так:
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | |
и bot2 будет вызываться с этими аргументами:
O --------- --------- --------- --------X --------- --------- --------- --------- --------- --------- 38
Теперь бот 2 должен двигаться на доске 8 (потому что бот1 поместил х в клетку 3). Допустим, бот2 печатает 84. Теперь доска выглядит следующим образом.
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || |O| ----- || ----- || ----- | | || | | || | |
теперь bot1 будет вызываться с этими аргументами:
X --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- 84
Теперь бот1 должен переместиться на доску 4. Однако бот1 - это непослушный маленький бот, и он решает переместиться на доску 3. Он печатает «30». Плата не меняется вообще. Мастер бот отслеживает это. Теперь bot2 будет вызываться с этими аргументами:
O --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- xx
Теперь бот 2 может ходить куда угодно (кроме 38 и 84, конечно). Это продолжается до тех пор, пока кто-то не выиграет 3 из главных досок подряд. Затем идет второй матч, в котором bot2 - это X и он идет первым.
Это повторяется до тех пор, пока каждый бот не сыграет с каждым другим ботом.
счет
Скоринг работает так:
Победитель каждого матча получает 100 + number of open spots
очки. Таким образом, более ценно, если ваш бот быстро побеждает. Каждый раз, когда ваш бот делает неверный ход, он теряет 1 очко. Если после 250 раундов ни один бот не выиграл, каждый бот теряет 10 очков, и мы переходим к следующему раунду.
Все будет помещено в каталог, который содержит
Контроллер бот. Это программа на C ++, которую я написал. Вы можете посмотреть исходный код бота контроллера здесь. Пожалуйста, дайте мне знать, если вы видите что-то не так с контроллером.
Текстовый файл с именем
instructions.txt
Этот файл будет выглядеть примерно так:[Total number of bots that are competing] [bot1Name] [bot1 command to run] [bot2Name] [bot2 command to run] ...
Папка для каждого бота. Эта папка будет содержать вашу программу (будь то скрипт или бинарный файл) и ОДИН текстовый файл с именем,
data.txt
который ваш бот может читать и писать, что хочет.
Технические характеристики и разъяснения правил
Любой бот, который пытается что-то прочитать / написать из любой точки, находящейся вне его папки, будет исключен из игры.
Ваша программа должна быть в состоянии работать на MacBook под управлением Yosemite. В настоящее время поддерживаются следующие языки: Python (2.7.9 и 3.4.2), C / C ++, target-C, perl, ruby, bash, PHP, Java, C #, javascript и Haskell. Их намного больше, но это только те, о которых я могу думать прямо сейчас. Я добавлю больше со временем. Если вы хотите соревноваться на определенном языке, напишите мне или оставьте комментарий, и я добавлю его в список, если это возможно.
Если доска выиграна, но все еще есть место, вы все равно не сможете перейти в одно из открытых мест.
Обратите внимание, что рабочим каталогом вашего представления будет каталог, содержащий контроллер и все остальные боты, а НЕ каталог, содержащий ваш бот.
Пожалуйста, напишите вместе с кодом вашего контроллера бота правильную команду для компиляции (если применимо) и запуска вашего бота. Большая часть этого будет сделана из терминала OS X, который довольно похож на терминал Linux.
Боты должны завершить менее чем за секунду. К сожалению, я не достаточно компетентен, чтобы добавить таймер в бот контроллера. Тем не менее, я буду вручную время ботов.
Полученные результаты!
Ну, я был прав. Я забыл проверить бот контроллера, чтобы проверить, заполнен ли masterBoard. Если masterBoard заполнен, то КАЖДЫЙ ход недействителен, но он продолжает вызывать ботов, поэтому, вероятно, было так много недействительных ходов. Я исправил это сейчас. Вот официальные результаты с самой последней версией всех ботов.
Bot 1, goodRandBot, has 1 wins and made 0 illegal moves, for a total of 133 points.
Bot 2, naiveBot, has 3 wins and made 48 illegal moves, for a total of 361 points.
Bot 3, depthBot, has 5 wins and made 0 illegal moves, for a total of 664 points.
Bot 4, middleBot, has 1 wins and made 20 illegal moves, for a total of 114 points.
With 4 bots, This program took 477.471 seconds to finish.
Depth Bot - действующий чемпион! По крайней мере, прямо сейчас.
источник
XXX000---
получаемой доски ? или это «никто не получает это, несмотря на то, что О выиграл это первым»?Ответы:
Python 2.7, глубина
Реализация обрезки альфа-бета без каких-либо излишеств. Он пытается упорядочить ходы менее наивным способом, чтобы максимизировать устранение альфа-бета. Я, вероятно, постараюсь ускорить его, но, честно говоря, я не знаю, насколько конкурентоспособным может быть Python, если говорить о скорости.
Чтобы запустить его, вы можете просто сделать
python Depth.py <input>
, хотя я бы посоветовал использоватьpypy
его, так как он заметно ускоряется.Также я не знаю, насколько быстро работает ваша система, но вы можете изменить первый аргумент
DepthPlayer
в самом конце, чтобы он был выше, если он все еще может работать в указанное время (в моей системе он завершил почти все вещи очень быстро с глубиной 7 или 8, но было несколько случаев, которые были около или выше секунды, поэтому я установил его на 6, чтобы быть в безопасности).источник
sys.argv
не возвращает разделенную строкой строку. Он дает список строк в этом формате:['Depth.py', 'X', '---------', '---------', ...]
я исправил это, отредактировав последние две строки,command = '\n'.join(sys.argv[1:]) print DepthPlayer(6).run(command)
надеюсь, вы не против.Ява, Наивный
Если возможно, это выигрывает. В противном случае это препятствует победе противника.
источник
Naive.class
в каталоге с именемnaiveBot
внутри основного каталога.java Naive <args>
команду, предполагая, что переменные окружения содержат указатель наC:\Program Files\Java\jdk1.8.0\bin
. Надеюсь, это поможет.java -classpath naiveBot Naive
;)legalAnywhere
это правда, ваша подача не удалась, потому что вы пытаетесь использовать доски, которые уже выиграл игрок.Python 2, MiddleBot
MiddleBot любит середину. До того, как центральная игра (4) выиграна, он попытается захватить центральную клетку как можно большего количества игр, заставляя противника снова и снова возвращаться в среднюю игру.
Как только это сделано, он пытается выиграть все игры, которые может, или просто заполняет первое доступное пространство, если нет (думаю, нужно работать над его поздней игрой)
Чтобы запустить его, мне
python MiddleBot.py <input>
кажется, что он с радостью бежит за секунду, так что, надеюсь, это будет и для вас.источник
С таким же успехом можно добавить своего собственного бота.
Python 2, GoodRandomBot
Этому боту все равно, куда он движется, если он действителен. Выбирает случайным образом из всех допустимых ходов и делает среднее число
0
недействительных ходов.источник