add hanab live instance file
This commit is contained in:
parent
5eac42e5c0
commit
f8eac6a118
1 changed files with 59 additions and 0 deletions
59
hanab_live.py
Normal file
59
hanab_live.py
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
import hanabi
|
||||||
|
import constants
|
||||||
|
from variants import Variant
|
||||||
|
|
||||||
|
|
||||||
|
class HanabLiveInstance(hanabi.HanabiInstance):
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
deck: List[hanabi.DeckCard],
|
||||||
|
num_players: int,
|
||||||
|
variant_id: int
|
||||||
|
):
|
||||||
|
assert(2 <= num_players <= 6)
|
||||||
|
super().__init__(deck, num_players)
|
||||||
|
self.variant_id = variant_id
|
||||||
|
self.variant = Variant.from_db(self.variant_id)
|
||||||
|
|
||||||
|
|
||||||
|
class HanabLiveGameState(hanabi.GameState):
|
||||||
|
def __init__(self, instance: HanabLiveInstance):
|
||||||
|
super().__init__(instance)
|
||||||
|
self.instance: HanabLiveInstance = instance
|
||||||
|
|
||||||
|
def make_action(self, action):
|
||||||
|
match action.type:
|
||||||
|
case hanabi.ActionType.ColorClue | hanabi.ActionType.RankClue:
|
||||||
|
assert(self.clues > 0)
|
||||||
|
self.actions.append(action)
|
||||||
|
self.clues -= self.instance.clue_increment
|
||||||
|
self._make_turn()
|
||||||
|
# TODO: could check that the clue specified is in fact legal
|
||||||
|
case hanabi.ActionType.Play:
|
||||||
|
self.play(action.target)
|
||||||
|
case hanabi.ActionType.Discard:
|
||||||
|
self.discard(action.target)
|
||||||
|
case hanabi.ActionType.EndGame | hanabi.ActionType.VoteTerminate:
|
||||||
|
self.over = True
|
||||||
|
|
||||||
|
def _waste_clue(self) -> hanabi.Action:
|
||||||
|
for player in range(self.turn + 1, self.turn + self.num_players):
|
||||||
|
for card in self.hands[player % self.num_players]:
|
||||||
|
for rank in self.instance.variant.ranks:
|
||||||
|
if self.instance.variant.rank_touches(card, rank):
|
||||||
|
return hanabi.Action(
|
||||||
|
hanabi.ActionType.RankClue,
|
||||||
|
player % self.num_players,
|
||||||
|
rank
|
||||||
|
)
|
||||||
|
for color in range(self.instance.variant.num_colors):
|
||||||
|
if self.instance.variant.color_touches(card, color):
|
||||||
|
return hanabi.Action(
|
||||||
|
hanabi.ActionType.ColorClue,
|
||||||
|
player % self.num_players,
|
||||||
|
color
|
||||||
|
)
|
||||||
|
raise RuntimeError("Current game state did not permit any legal clue."
|
||||||
|
"This case is incredibly rare and currently not handled.")
|
Loading…
Reference in a new issue