Files
coorl-lost-cities/src/coolrl_lost_cities/games/classic/bots/passive.py
T

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)