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

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 метода, которы нужно реализовать пользователю:
on_state_change— оповещает агент, о начале нового раунда. В качестве GameStates всегда передаётсяNEXT_BID, этот параметр можно проигнорироватьmake_stepтребует от агента выполнить одно из двух действий:handle.set_bid(bid_value)— сделать ставку стоимостью bid_valuehandle.opt_out()— выйти из ставок для текущего раунда- Словарь
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)
Запуск игры
- Для запуска необходимо положить скрип агента (или пайтон пакет) в папку
stand/agents - При запуске
main.pyв графе игры выбратьBID, в строке агентов выбрать вашего + Human Bot для отладки