Camel Up Cup: турнір настільних ігор AI


11

Кубок верблюдів 2k18

У цьому виклику ми будемо грати в напівпопулярну настільну гру Camel Up.

Верблюд вгору! це настільна гра, в якій гравці роблять ставку на верблюдів, щоб виграти раунди, виграти гру або програти гру, встановити пастки для впливу на рух або переміщення верблюда. Кожне з цих рішень нагороджує вас шансом отримати трохи грошей, саме це визначає переможця. Для прийняття своїх рішень гравці повинні використовувати ймовірність, умови гри та стан оренди суперника. Ось коротке відео, яке показує гравцям, як грати .

Як грати

Ось приблизне уявлення про те, як грати. Перегляд одного з відео може бути кориснішим, оскільки вони мають візуальні зображення :)

На черзі у вас є 4 варіанти.

  1. Перемістіть верблюда. Це вибирає верблюда з тих, хто не перемістився, і переміщує його між 1-3 пробілами. Ви отримуєте 1 монету. Раунди закінчуються, коли всі п’ять верблюдів перемістилися, вони потім можуть усі рухатися
  2. Поставте пастку. Це залишається на дошці до кінця раунду. Ви обираєте + 1 / -1 пастка. Якщо верблюд чи стек верблюда приземлиться на ньому, вони рухаються + 1 / -1, і ви отримуєте монету. Ви не можете розмістити пастку на площі 0. Можна поставити пастку там, де є верблюди, хоча це вплине лише на верблюдів, які висаджуються на неї після.
  3. Ставка на перемогу в турі. Ви приймаєте ставку на переможця туру. Вони виграють, ви отримуєте 5/3/2/1 залежно від того, чи був ви 1/2/3-й, який зробив ставку на цього верблюда.
  4. Переможець / програв гра. Ви робите ставку на того, хто буде першим чи останнім наприкінці гри. ви отримуєте 8/5/3/1/1 (я думаю) на основі, якщо ви були 1/2/3 / і т. д., щоб зробити ставку на цього верблюда

Примітки:

  • Є 5 верблюдів. Вони починаються на позиції випадковим чином від 0-2.
  • При переміщенні верблюда (див. Вище, що викликає це) вони переміщують 1-3 квадрати. Якщо їх розміщуватимуть на площі з іншим верблюдом, їх кладуть «зверху» на іншого, створюючи верблюжий стек. Якщо верблюд повинен рухатися, він переміщує всіх верблюдів над ним на верблюдовій стеці. Верблюд у верхній частині штабеля вважається веденим
  • Якщо ви посадите на пастку +1 (див. Вище, що викликає це), ви рухаєтеся на один квадрат далі. Діють стандартні правила укладання.
  • Однак якщо ви потрапили в пастку -1, ви перемістите один квадрат назад. Ви йдете під стоп верблюдів, що на тій площі, якщо такі є.
  • Гра закінчується, коли верблюд потрапляє в квадрат 16. Це негайно викликає триггери в кінці та кінці гри
  • Ставки на переможець гри / програш можна робити лише один раз на верблюда. Тобто ви не можете зробити ставку на верблюда, щоб виграти і програти гру

Виклик

У цьому виклику ви напишете програму Python 3, щоб грати чотирьох гравців, переможець приймає всю гру слави Camel Up

Ваша програма отримає іграму, що містить:

  • camel_track : з розташуванням верблюдів
  • trap_track : з розташуванням пасток (запис форми [trap_type (-1,1), гравець])
  • player_has_placed_trap : масив, який повідомляє вам, чи гравці поставили пастку в цей раунд
  • round_bets : масив ставок, розміщених у цьому раунді. З форми [верблюд, гравець]
  • game_winner_bets / game_loser_bets : масиви гравців, які роблять ставку на верблюдів, щоб виграти чи програти гру. Ви зможете побачити лише вартість гравців, які зробили ставки, а не на кого вони роблять ставку. Ви можете знати, на кого ставите. # форми (верблюд, гравець)
  • player_game_bets : ще одне представлення гри_winner_bets / game_loser_bets. Знову ж таки, подивіться лише на ставки, які зробив ваш бот.
  • player_money_values : масив, який показує кількість грошей, які має кожен гравець.
  • camel_yet_to_move : масив, що показує, чи верблюд перемістився в цей раунд.

Крім ігор, ви також отримаєте:

  • Гравець : ціле число, яке повідомляє, який ви номер гравця (0-3).

Синтаксис того, що гравці повинні повернути:

  • [0]: Переміщення верблюда
  • [1, trap_type, trap_location]: Поставити пастку
  • [2, проектований_round_winner]: зробіть ставку переможця в турі
  • [3, projected_game_winner]: Зробіть ставку на переможця гри
  • [4, projected_game_loser]: Зробіть гру в програші

Це має бути завершено методом ходу (гравця, ігор)

Наприклад, ось гравець, який зробить ставку на перемогу в раунді, якщо він буде на останньому місці. Якщо їх немає, вони поставлять пастку на випадковий квадрат.

class Player1(PlayerInterface):
     def move(player,g):
         if min(g.player_money_values) == g.player_money_values[player]:
            return [2,random.randint(0,len(g.camels)-1)]
        return [1,math.floor(2*random.random())*2-1,random.randint(1,10)]

Гра була обрана з кількох причин: у неї є порівняно невеликий набір варіантів для вибору (приблизно 20 варіантів за поворот, легко звужується до зазвичай приблизно 3-4), ігри короткі і є елемент удачі (робить це тому навіть «погані» боти можуть виграти).

Ігровий процес

Турнір-турнір можна знайти тут: Кубок верблюда . Виконати camelup.pyдля запуску турніру або функції PlayGame для запуску ігор. Я буду постійно оновлювати це сховище новими поданнями. Приклади програм можна знайти в players.py.

Турнір складається з 100 ігор на 10 гравців (округлюються, тому 14 гравців означають 200 ігор). У кожній грі будуть чотири випадкові гравці, вибрані з пулу гравців, щоб заповнити чотири позиції. Гравці не зможуть двічі бути в грі.

Оцінка балів

Переможець кожної гри - гравець, який в кінці гри отримає найбільше грошей. У разі вирівнювання гри в кінці гри всім гравцям з максимальною грошовою сумою присуджується бал. Гравець з найбільшою кількістю очок в кінці турніру виграє. Я буду публікувати результати, коли я запускаю ігри.

Представлені гравці будуть додані до пулу. Я додав три справді німі боти і одну, яку я запустив для початку.

Коваджі

Не змінюйте входи. Не намагайтеся вплинути на виконання будь-якої іншої програми, за винятком співпраці чи дефектів. Не робіть жертвоприношення, яке намагається визнати інше підпорядкування та виграти цього опонента за власні кошти. Стандартні лазівки заборонені.

Обмежте час, який зайняв ваш бот, - 10 секунд за оборот.

Подання можуть не дублювати попередні подання.

Не переглядайте ставки game_winner або game_loser від інших гравців. Це досить просто зробити, але все ж обман.

Якщо у вас є якісь питання, не соромтеся задавати питання.

Перемога

Конкурс залишатиметься відкритим нескінченно, оскільки публікуються нові матеріали. Однак я оголошу переможця (прийму відповідь) за результатами через місяць після опублікування цього питання (20 липня).

Результати

Player0: 12
Player1: 0
Player2: 1
Sir_Humpfree_Bogart: 87

Можливо, я читав минуле, але скільки верблюдів там у грі? Крім того, скільки квадратів їм потрібно подорожувати, щоб дістатися до іншої сторони? Виходячи з вашого коду GitHub, я впевнений, що це 5 верблюдів і 25 квадратів, але я не бачив цього в описі завдання. Що стосується розміщення ставок, чи можемо ми зробити ставку на будь-яку суму, або вона ставить 1 за замовчуванням? Чи є у нас ліміт витрат, чи можна робити ставки кожен раунд на невизначений час? Що стосується гравців, що рухаються верблюдом, який верблюд переміщений? Верблюд з вашим відповідним гравцем-nr? Якщо так, то чому там 4 гравці, але 5 верблюдів?
Кевін Круїссен

1
Було б ідеально мати відповіді на Perl
Випадковий хлопець

Ласкаво просимо до PPCG!
AdmBorkBork

100 ігор на 10 гравців здається досить низьким IMO, особливо з грою з такою кількістю випадковості
Nathan Merrill

1
@AdmBorkBork Дякую! Я новачок у цьому, тому вітаю всіх покажчиків. Це спрацювало добре в реальному житті - з метою побачити, як воно тут грає
Тайлер Баррон

Відповіді:


1

Sir_Humpfree_Bogart.py

Це бот, який я створив для турніру Кубка верблюдів .

По-перше, вони розглядають усі можливі конфігурації, які верблюди могли закінчитись в кінці раунду. Потім вони визначають очікуване значення ставок на верблюда, який виграє раунд, використовуючи

EV_roundwin = (chance_1st)*(payout) + (chance_2nd)*(payout) - (chance_3rd_or_worse)*(cost)

Потім вони переміщають верблюдів випадковим чином, поки верблюд не виграє. Зробивши це кілька тисяч разів, ви можете оцінити шанс кожного верблюда виграти і програти. Знову ми отримуємо очікувану цінність із використанням

EV_gamewin = (chance_1st)*(payout) - (chance_2nd_or_worse)*(cost)

Єдиними іншими варіантами є переміщення верблюда (який завжди дає одну монету, тому очікуване значення - одне) та розміщення пастки. Обидві команди вважали, що розміщення пастки було досить слабким варіантом, щоб цілком її ігнорувати. З цією інформацією боти обрали варіант з найвищим очікуваним значенням.

Оскільки турнір вважав, що друге місце закінчилося так само, як і фініш останнього місця, є сенс, якщо ви позаду, щоб ризикнути вийти на перше місце. SBH використовував distance_from_first_place і nearness_to_end, щоб визначити, наскільки ризикованим повинен бути бот, де, якщо ви далеко не перші та близькі до кінця, тоді ризикованість буде високою, і якщо ви знаходитесь в першій чи далекій частині кінця гри, ризикованість буде низькою . При низькій небезпеці бот вирішить дію з варіантом із великим очікуваним значенням та високою ризиковістю, що дасть варіант із великим результатом. Точне рівняння було

Functional_EV = EV + (upshot-EV) * riskiness

де результатом є найвища виплата, яку можна отримати за рішення, а ризикованість становить від 0 до 1.


0

players.py

Це неймовірно німі боти, щоб розпочати турнір. Вони майже не мають логіки, але виступають як рамки, якими користуються люди

import random
import math
from playerinterface import PlayerInterface

class Player0(PlayerInterface):
    def move(player,g):
        #This dumb player always moves a camel
        return [0]

class Player1(PlayerInterface):
    def move(player,g):
        #This player is less dumb. If they have the least amount of money they'll make a round winner bet
        #If they aren't in last then they'll place a trap on a random square. Still p dumb though
        if min(g.player_money_values) == g.player_money_values[player]:
            return [2,random.randint(0,len(g.camels)-1)]
        return [1,math.floor(2*random.random())*2-1,random.randint(1,10)]

class Player2(PlayerInterface):
    def move(player,g):
        #This dumb player always makes a round winner bet
        return [2,random.randint(0,len(g.camels)-1)]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.