Сейчас июльское Рождество, так что лучший способ отпраздновать, чем обмен подарками виртуальных белых слонов!
Для этого задания «Король горы» вы должны создать бота, который будет играть в симуляцию обмена «Белый слон» , пытаясь получить самый ценный подарок, какой только может.
Правила игры
- Игра будет проходить в течение многих раундов, каждый из которых состоит из переменного числа ходов.
- Настройка раунда : будет столько же подарков, сколько игроков в игре, каждый из которых оценивается случайным образом равномерно в диапазоне [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)
источник
Ответы:
LastMinuteBot
(Большое спасибо @Mnemonic за скелет кода, так как я почти не знаю Python.)
Воспользуйтесь тем фактом, что подарки не могут быть украдены более трех раз, сделайте третье воровство самостоятельно, если найдете дорогой подарок, и большинство подарков было открыто.
источник
Странный тодд
Похищает лучший подарок, который он может, но не хочет быть вторым человеком, который украл подарок, потому что, если он украден у него, он не сможет вернуть его.
источник
==
вместо a=
в вашем понимании списка.SecondPlaceBot
Все будут бороться за самый ценный подарок. Следующий лучший подарок почти так же хорош, но гораздо реже будет украден.
источник
ThresholdBot
Нас не волнует получение лучшего подарка, просто достаточно хорошего . Пока что-то стоит воровать, мы это сделаем.
источник
SampleBot
Запускает 2000 симуляций с каждым жадным игроком и выбирает лучшее действие.
источник
Робин Гуд
Украсть у богатых, которые не заслужили их подарок
источник
Добрый самаритянин
Дайте незадачливым людям еще один шанс на удачу
источник
Азартный игрок
Игрок зависим, он пытается быть последним игроком, а затем разыгрывает новый подарок, чтобы выиграть у всех остальных игроков.
источник
Top3Bot
Этот бот не пытается получить лучший возможный подарок, но пытается получить подарок, который ценится> = (n-3) / n, где n - количество подарков. В большинстве случаев будут цениться подарки, и Top3Bot попытается достать один из них, но ему все равно, кто из них получит.
источник
__init__
отсутствуетself
аргумент