Це Різдво в липні, тож який кращий спосіб відсвяткувати, ніж віртуальний обмін подарунками білого слона!
Для цього завдання King of the Hill ви повинні створити бота, який грає в симуляцію білого слона , намагаючись отримати найцінніший подарунок, який він може.
Правила гри
- Гра буде проводитися протягом багатьох раундів, кожен з яких складається зі змінною кількістю оборотів.
- Кругла настройка : Буде стільки подарунків, скільки гравців у грі, кожен оцінюється випадковим чином рівномірно в діапазоні [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.
- Не використовуйте файли чи інші методи, щоб обійти неможливість збереження стану між іграми. Наприклад, ви не можете зберігати стан нейронної мережі у файл середнього періоду.
- Ваш бот повинен бути самостійним у коді класу та пов'язаних константах.
- Ви можете використовувати лише стандартний імпорт бібліотеки.
- Суворих вимог до виконання не існує. Будьте розумними та розважливими. Якщо продуктивність стає проблемою, я залишаю за собою право додавати часові межі.
Один запис на людину.Якщо ви подаєте більше одного запису, ваші боти можуть не працювати разом. Я зараз дозволю кілька записів на людину, хоча я можу позбавити її згодом, якщо це стане проблемою.- Це відкритий конкурс без чіткої дати закінчення. Це буде повторене будь-коли, коли я зможу, коли відбулися суттєві зміни.
EDIT1: Змінено виграшний бал від 100 до 500, щоб рейтинги були більш узгодженими. Тестовий драйвер має новий виправлення, а також відображає зміни в оцінці виграшу.
EDIT2: Уточнююча записка про необхідний імпорт.
Табло (станом на 8 серпня 2018 р.)
- SampleBot (500.093)
- LastMinuteBot (486.163)
- RobinHood (463.160)
- OddTodd (448.825)
- GreedyBot (438.520)
- SecondPlaceBot (430.598)
- Поріг порогу (390.480)
- Азартний гравець (313.362)
- NiceBot (275.536)
- RandomBot (256.172)
- GoodSamaritan (136.298)