55 lines
1.7 KiB
Python
55 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
from ..game import GameState
|
|
from ..interfaces import BotInput, Snapshot
|
|
from .base import first_legal, legal_from_obs
|
|
|
|
|
|
class PassiveDiscardBot:
|
|
"""Baseline that avoids opening expeditions whenever discarding is legal."""
|
|
|
|
def act(self, obs_or_state: BotInput) -> int:
|
|
if isinstance(obs_or_state, GameState) or hasattr(obs_or_state, "legal_mask"):
|
|
return self._act_phase_local(
|
|
obs_or_state.phase,
|
|
obs_or_state.legal_mask(),
|
|
obs_or_state.card_action_size,
|
|
)
|
|
if isinstance(obs_or_state, Snapshot):
|
|
return self._act_unified(
|
|
obs_or_state.phase,
|
|
obs_or_state.legal_mask,
|
|
obs_or_state.card_action_size,
|
|
)
|
|
legal = legal_from_obs(obs_or_state)
|
|
return first_legal(legal)
|
|
|
|
def _act_phase_local(
|
|
self,
|
|
phase: str,
|
|
legal: list[bool],
|
|
card_action_size: int,
|
|
) -> int:
|
|
if phase == "card":
|
|
for action in range(1, min(card_action_size, len(legal)), 2):
|
|
if legal[action]:
|
|
return action
|
|
if phase == "draw" and legal and legal[0]:
|
|
return 0
|
|
return first_legal(legal)
|
|
|
|
def _act_unified(
|
|
self,
|
|
phase: str,
|
|
legal: list[bool],
|
|
card_action_size: int,
|
|
) -> int:
|
|
if phase == "card":
|
|
for action in range(1, min(card_action_size, len(legal)), 2):
|
|
if legal[action]:
|
|
return action
|
|
deck_action = card_action_size
|
|
if phase == "draw" and deck_action < len(legal) and legal[deck_action]:
|
|
return deck_action
|
|
return first_legal(legal)
|