Сейчас июльское Рождество, так что лучший способ отпраздновать, чем обмен подарками виртуальных белых слонов!
Для этого задания «Король горы» вы должны создать бота, который будет играть в симуляцию обмена «Белый слон» , пытаясь получить самый ценный подарок, какой только может.
Правила игры
- Игра будет проходить в течение многих раундов, каждый из которых состоит из переменного числа ходов.
- Настройка раунда : будет столько же подарков, сколько игроков в игре, каждый из которых оценивается случайным образом равномерно в диапазоне [0 ... 1), причем это значение остается неизвестным до тех пор, пока подарок не будет «открыт». Игроки будут выставлены в случайном порядке в очереди. Первый игрок будет выталкиваться из передней части очереди.
- Когда наступает ход игрока, они могут либо открыть подарок, либо украсть подарок другого игрока, передав ход игроку, чей подарок был украден.
- Каждый подарок может быть украден до 3 раз.
- Вы не можете украсть у игрока, который только что украл у вас.
- Каждый игрок может иметь только один подарок за раз.
- После того, как подарок открыт, игра переходит к следующему игроку, выскочившему из передней части очереди. Это будет следующий игрок в очереди, который еще не имел хода.
- Конец раунда : когда все подарки открыты, раунд заканчивается, и ценность подарка каждого игрока прибавляется к счету этого игрока. Начинается новый раунд, каждый игрок теперь не имеет подарка, а порядок игроков перетасовывается.
- Конец игры : игра заканчивается, когда хотя бы один игрок набрал
100500 очков, победа присуждается игроку с наибольшей общей суммой подарков.
кодирование
Все материалы должны быть совместимы с Python 3.7. Вы должны написать класс, который напрямую наследует от WhiteElephantBot
. Например:
class FooBot(WhiteElephantBot):
# Your implementation here
Вы можете предоставить __init__
метод (который принимает один аргумент name
) в своем классе бота, который должен вызвать super().__init__(name)
. Ваш класс должен иметь take_turn
метод, ожидающий следующие аргументы в следующем порядке:
players
: Список имен игроков, в порядке очереди, всех игроков, у которых еще нет подарков.presents
: Словарь, который отображает имена игроков в 2 кортежа, в которых содержится текущая стоимость, удерживаемая этим игроком, и количество раз, когда он был украден. Это будет включать только других игроков, которые в настоящее время держат подарки.just_stole
: Если последним предпринятым действием была кража, это будет имя игрока, который только что украл. Если нет, то будетNone
.
Каждый аргумент будет неизменным или новым объектом, так что изменение любого из них не повлияет на игру. Вы можете оставить копию любого из аргументов, если пожелаете.
Пример значения для presents
:
{
'Alice': (0.35, 0),
'Bob': (0.81, 2),
'Charlie': (0.57, 1)
}
Ваш take_turn
метод должен вернуть имя игрока, у которого вы хотите украсть или None
открыть подарок. Если оно вызывает исключение, возвращает что-то, отличное от str
или или None
, или имя игрока, у которого вы не можете украсть, вы по умолчанию откроете подарок.
Ваш конструктор будет вызываться в начале каждого раунда, поэтому вы не сможете запомнить состояние от раунда к раунду.
Унаследовав от WhiteElephantBot
, вы получите доступ к steal_targets
методу, который будет принимать настоящие подарки just_stole
и возвращать список имен игроков, у которых вы можете украсть.
Любые модули, которые нужны вашему скрипту, должны быть импортированы вверху вашей записи.
Тест Драйвер
Тестовый драйвер можно найти здесь . Вам не нужно включать from white_elephant import WhiteElephantBot
в свой опубликованный ответ, однако для этого потребуется локальный модуль.
Базовые конкуренты
- Случайно : случайным образом выбирает, открывать ли новый подарок или красть, при этом цель по краже выбирается случайным образом.
- Жадность : укради самый ценный подарок, который можно украсть. Если подарки не могут быть украдены, откройте подарок.
- Приятно : всегда открывает новый подарок. Никогда не крадет.
Дополнительные правила
- Это ваша ответственность, чтобы поймать все исключения. Если вашему классу не удается поймать исключение, оно будет дисквалифицировано. Кроме того, пожалуйста, не ловите KeyboardInterrupts.
- Не используйте файлы или другие методы, чтобы обойти невозможность сохранения состояния между играми. Вы не можете, например, сохранить состояние нейронной сети в файл промежуточного уровня.
- Ваш бот должен быть автономным в коде класса и связанных с ним констант.
- Вы можете использовать только стандартные библиотеки импорта.
- Нет строгих требований к производительности. Будьте разумны и разумны. Если производительность становится проблемой, я оставляю за собой право добавлять ограничения по времени.
Одна запись на человека.Если вы отправите более одной записи, ваши боты могут не работать вместе. Я собираюсь разрешить несколько записей на человека на данный момент, хотя я могу отобрать его позже, если это станет проблемой.- Это открытый конкурс без определенной даты окончания. Он будет перезапущен всякий раз, когда я смогу, когда произошли значительные изменения.
РЕДАКТИРОВАТЬ1: победный счет изменен со 100 до 500, чтобы рейтинг был более последовательным. Тестовый драйвер имеет новое исправление, а также отражает изменения в счете победителя.
РЕДАКТИРОВАТЬ 2: Пояснительная записка о необходимом импорте.
Таблица лидеров (по состоянию на 8 августа 2018 г.)
- SampleBot (500.093)
- LastMinuteBot (486,163)
- РобинХуд (463.160)
- OddTodd (448,825)
- GreedyBot (438,520)
- SecondPlaceBot (430.598)
- ThresholdBot (390,480)
- Игрок (313.362)
- NiceBot (275,536)
- RandomBot (256.172)
- Добрый Самаритянин (136.298)