Ставки

Правила игры

  1. В начале игры у каждого участника есть баланс в размере 1000 золотых
  2. Игра состоит из 5 раундов
  3. В каждом раунде начинаются ставки на текущий лот, стоимостью 100 < T < 500 золотых
    Стоимость T не известна до окончания ставок в раунде.
  4. У каждого игрока в его ход есть 2 варианта — сделать ставку стоимостью K или выйти
  5. Лот получает тот, игрок, который последним остался в раунде (остальные вышли)
  6. Игрок получивший лот добавляет к своему балансу сумму K - T (может быть отрицательным)

Правила ставок:

  1. Ставка игрока не может быть меньше или равна наибольшей ставке в раунде
  2. Ставка не может быть больше, чем баланс игрока
  3. Ставка не может быть отрицательной

Если игрок выходит из ставок в раунде, то он больше не может претендовать на лот

Блок схема раунда

раунд

API Агента

class BidAgent(AbstractGameAgent):
    GAME_NAME = 'BID'

    def __init__(self, inpt: AbstractInput):
        super().__init__(inpt)

    @abstractmethod
    def on_state_change(self, state: GameStates):
        pass

    @abstractmethod
    def make_step(self, handle: Handle, info: dict):
        pass

В интерфейсе агента присутствует 2 метода, которы нужно реализовать пользователю:

  1. on_state_change — оповещает агент, о начале нового раунда. В качестве GameStates всегда передаётся NEXT_BID, этот параметр можно проигнорировать
  2. make_step требует от агента выполнить одно из двух действий:
  3. handle.set_bid(bid_value) — сделать ставку стоимостью bid_value
  4. handle.opt_out() — выйти из ставок для текущего раунда
  5. Словарь info имеет следующую структуру:
{
    "current_round": 0, # текущий раунд
    "total_rounds": 5, # Максимальное кол-во раундов
    "last_bid": 0, # Текущая максимальная ставка
    "prizes": [],  # История стоимости лотов (T_i) в предыдущих раундах
    "agents": {},  # agent_id -> {"total": int, "last_bid": int}
        # total — баланс игрока i
        # last_bid — последняя ставка игрока i
}

Реализация интерфейса

Для реализации интерфейса в начало пайтон файла необходимо импортировать:

from stand.games.bid_game.bid_agent import BidAgent, Handle
from stand.games.bid_game.states import GameStates
from stand.server.server_api import agent, AbstractInput

В реализации интерфейса ОБЯЗАТЕЛЬНО нужно вызвать конструктор, если агент использует человеческий ввод

def __init__(self, inpt: AbstractInput):
    super().__init__(inpt)

Реализация ОБЯЗАТЕЛЬНО должна быть помечена декоратором @agent, иначе сервер её не найдёт

Для опознавания агента настоятельно рекомендуется добавить параметры класса

AGENT_NAME = "<ИМЯ ВАШЕГО АГЕНТА>"
GAME_VERSION = "<ВЕРСИЯ ИГРЫ, ДЛЯ КОТОРОЙ АГЕНТ НАПИСАН>"

Пример реализации

Пример для игры человека:

from stand.games.bid_game.bid_agent import BidAgent, Handle
from stand.games.bid_game.states import GameStates
from stand.server.server_api import agent, AbstractInput


@agent
class BidAgentHuman(BidAgent):
    AGENT_NAME = "BID Human 1"
    GAME_VERSION = "1"

    def __init__(self, inpt: AbstractInput):
        super().__init__(inpt)

    def on_state_change(self, state: GameStates):
        pass

    def make_step(self, handle: Handle, info: dict):
        data = int(self.input.read_line("-1 — opt out, n — bet:"))

        if data == -1:
            handle.opt_out()
        else:
            handle.set_bid(data)

Запуск игры

  1. Для запуска необходимо положить скрип агента (или пайтон пакет) в папку stand/agents
  2. При запуске main.py в графе игры выбрать BID, в строке агентов выбрать вашего + Human Bot для отладки