Идея этой задачи проста: создать бота для игры в карточную игру Euchre.
Для тех из вас , кто уже не знает их, я выписал правило к Euchre здесь , как они относятся к этой проблеме.
Я рекомендую использовать python или что-то подобное, но единственное реальное ограничение - это то, что он должен быть совместим с кодом контроллера
Входные данные:
Ваш euchre бот будет получать различные виды ввода в зависимости от текущей фазы игры или раунда. Вообще говоря, вы получите фазу игры в первой строке, за которой следуют запятая и количество очков, которые имеет ваша команда, а затем соответствующие данные в следующих строках.
Хронологически ваш бот получит информацию в следующем порядке:
Ordering Trump:
js,ah,qc,ts,jc // the cards in your hand
2 // number of points your team has
0 // number of tricks your team has taken
ordering // the phase of the game
th // the turned up card
p,p // each previous player’s decision
Naming Trump:
js,ah,qc,ts,jc // the cards in your hand
2 // number of points your team has
0 // number of tricks your team has taken
naming // the phase of the game
p // each previous player’s decision
Dealer Discarding:
js,ah,qc,ts,jc // the cards in your hand
2 // number of points your team has
0 // number of tricks your team has taken
discard // the phase of the game
th // the card you will pick up
Going alone:
js,ah,qc,ts,jc // the cards in your hand
2 // number of points your team has
0 // number of tricks your team has taken
alone // the phase of the game
h // the trump suit
n,n // each previous player’s decision
Your turn:
js,ah,qc,ts,jc // the cards in your hand
2 // number of points your team has
0 // number of tricks your team has taken
turn // the phase of the game
h // the trump suit
td,8h,p // each previous player’s card
Trick data:
// the cards in your hand (none, since this happens at the end of a trick)
2 // number of points your team has
1 // number of tricks your team has taken
trick // the phase of the game
0 // the index of the following list that is your card
js,tc,4d,js // the cards played during the trick in the order they were played
Вывод:
Ваш бот euchre будет иметь разные результаты в зависимости от текущей фазы игры или раунда.
Ordering Trump:
p //for pass
OR
o //for order up
Naming Trump:
p //for pass
OR ANY OF
c,s,h,d //the suit you want to name
Going alone:
n // no
OR
y // yes
Your turn:
js //the card you want to play
Подсчет очков:
Оценка вашего бота - это общее количество игр, в которых он выиграл.
Ваш бот будет играть против любого другого бота, и он всегда будет сотрудничать с собственной копией.
Ноты:
Вот простой шаблон в python2.7:
#!/usr/bin/python2.7
import sys
data = sys.stdin.readlines()
hand = data[0].strip().split(',') # Hand as a list of strings
points = int(data[1]) # Number of points
tricks = int(data[2]) # Number of tricks
out = ''
if data[3] == 'ordering':
card = data[4] # The upturn card
prev = data[5].strip().split(',') # The previous player's decisions as a list
# Ordering logic
out = # 'o' or 'p'
elif data[3] == 'naming':
prev = data[4].strip().split(',') # The previous player's decisions as a list
# Naming logic
out = # 'p', 'h', 's', 'c', or 'd'
elif data[3] == 'discard':
card = data[4] # The card you'll take
# Discarding logic
out = # The card you want to discard
elif data[3] == 'alone':
trump = data[4] # The trump suit
prev = data[5].strip().split(',') # The previous player's decisions as a list
# Alone logic
out = # 'y' for yes, 'n' for no
elif data[3] == 'turn':
trump = data[4] # The trump suit
prev = data[5].strip().split(',')
# Turn logic
out = # The card you want to play
elif data[3] == 'trick':
trump = data[5]
cards = data[6].strip().split(',')
my_card = cards[int(data[4])]
# Data logic
print(out)
Там всегда будет 4 полных ответов. Если кто-то пойдет один, то ответ его партнера будет «р» на их ходу.
Я попытался сократить количество избыточных входных данных, чтобы быть более ясным:
2а. Ваша позиция относительно дилера / лидера и карта, которую сыграл ваш партнер, могут быть определены по количеству предыдущих выходов. Между вами и вашим партнером есть 1 игрок. Например, если в качестве последней строки на вашем ходу вы выбрали «td, 8h, p», вы можете увидеть, что ваш партнер сыграл 8h, а у другой команды есть игрок, который едет один.
Если вам интересно, сделка совершается традиционным способом (в два раунда чередующихся пакетов по 2 и 3 карты), но это не очень важно для вашего бота, так что ...
Если второй игрок решит сделать заказ в фазе козыря, эта фаза продолжится, но его результаты будут в значительной степени проигнорированы. Другими словами, тот, кто заказывает первым, входит в команду Namers, независимо от других результатов.
Ниже приведены значения по умолчанию для различных этапов игры. Если вы не выводите правильный ответ для этого раунда, то ваш ответ будет изменен на следующий.
Заказ Трампа: р
Нейминг Трамп: р
Сбрасывание: (первая карта в вашей руке)
Одинокий: n
Ваш ход: (первая легальная карта в вашей руке)
Вот код контроллера для ваших целей тестирования.
6а. Обратите внимание, что вы можете передать либо 2, либо 4 имени бота, если вы дадите ему 4 бота, то они будут случайным образом сотрудничать, а с 2 они будут иметь свои копии.
6b. Вам нужен каталог 'bots' в том же каталоге, что и код контроллера, а код вашего бота должен находиться в каталоге bots.
Для тех, кто хочет, чтобы их бот запомнил, какие карты были разыграны, вам предоставляется возможность во время фазы «трюка», которая сообщает вашему боту, какие карты были разыграны. Вы можете записать в файл в каталоге ботов, если этот файл не превышает 1 КБ.
Табло:
Old Stager: 2
Marius: 1
Random 8020: 0
источник
Ответы:
Marius
Я написал этого бота в R. Я провел несколько тестов с вашим контроллером, и они, кажется, общаются правильно.
Я, вероятно, изменю это позже, так как я не реализовал логику «поворота», когда бот защищается, но я публикую это сейчас, чтобы у людей был еще один бот для тестирования.
На данный момент он реализует только очень простые стратегии, такие как ведение с тузом, козырем или любой другой старшей картой; следуя по возможности более высокой карте или разыгрывая карту с наименьшей ценностью, если нет; упорядочение, когда рука имеет высокое значение, и наименование цвета, в котором рука имела бы наибольшее значение; идти одному, когда рука имеет очень высокую ценность. «Значение» каждой карты вычисляется очень просто: значение козырей начинается с 7 для первого валета и уменьшается вдоль масти козыря.
источник
Старый Stager
Этот бот следует некоторым простым правилам, которые долгое время служили ему хорошо:
Я увеличил целевой показатель с 10 до 100 для тестирования в контроллере. Результаты все еще очень случайные, но более стабильные, чем раньше.
источник
Случайный 8020
Простой случайный бот, который пройдет 80% времени. Раскомментируйте последнюю строку, чтобы увидеть (очищенный) ввод и вывод.
источник