Давайте пограємо в гру Meta tic-tac-toe!
Це турнір короля гірки з мета-тик-нога. Правила 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, це означає центральну плитку дошки зліва.
Переміщуватися вам дозволяється лише на одній з менших дощок.
Якщо ви виграєте одну з менших дощок, ця дошка вважається вашою плиткою.
Якщо одна з дощок заповнюється до того, як виграв будь-який бот, вона вважається плиткою nobodies.
Хто виграє майстер-борд, той і виграє!
Однак є важливий поворот. Скажімо, я заходжу в дошку 7, плитку 2. Це означає, що ти обійдешся, ти можеш зайти тільки в дошку 2. Тоді скажемо, що ви переходите в дошку 2, плитку 5. Тепер на черзі я можу зайти тільки в дошку 5. Скажімо, дошка 1 заповнена. (Більше плям не залишилося, або хтось із нас вже переміг на дошці 1) Тепер, якщо я зайду в дошку 5, плитку 1, ви можете зайти в будь-яку з бажаних дощок.
Ці правила можна розглядати як:
- Ви повинні грати на дошці відповідно до позиції, яку грав попередній гравець.
- Якщо X грає на дошці 2, плитка 5; O повинен грати на дошці 5
- Якщо цільова дошка повна (нічия) або вже має переможця, наступний хід не обмежений.
- Дошка з переможцем не може бути розіграна, навіть без обмеженого руху.
Якщо це трохи заплутано, ви можете спробувати в Інтернеті тут. (переконайтеся, що перейдіть з "виграш першої плитки" на "3 плитки підряд")
Тепер ось правила виклику.
Ви повинні написати бота, який грає в цю гру.
Бот 1 - це Xs, і він повинен бути першим. Він буде викликаний цими аргументами командного рядка (без речей у дужках):
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-й рядок стосується головної дошки. "Xx" - це останній крок. Тепер, bot1 повинен надрукувати два числа від 0 до 8. Число 1 - це табло, на якому рухається ваш бот, а число 2 - плитка на зазначеній дошці. Контролер буде відслідковувати цей хід. Скажімо, бот 1 друкує 38. Тепер рада буде виглядати так:
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | |
і bot2 буде викликано цими аргументами:
O --------- --------- --------- --------X --------- --------- --------- --------- --------- --------- 38
Тепер бот 2 повинен переміститися в дошці 8 (тому що bot1 розмістив х у плитці 3). Скажімо, бот2 друкує 84. Тепер рада виглядає так.
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || |O| ----- || ----- || ----- | | || | | || | |
тепер bot1 буде викликаний цими аргументами:
X --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- 84
Тепер bot1 повинен переміститися в дошці 4. Однак bot1 - це маленький неслухняний бот, і він вирішив перейти на борту 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 ++, aim-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---
? чи це "ніхто не отримує його, незважаючи на те, що O виграв його першим"?