make starting_player a property of instances, not games

This commit is contained in:
Maximilian Keßler 2023-07-07 14:32:11 +02:00
parent 3ab35eb10d
commit 722838243f
Signed by: max
GPG Key ID: BCC5A619923C0BA5
4 changed files with 18 additions and 11 deletions

View File

@ -116,7 +116,8 @@ class HanabiInstance:
clue_starved: bool = False, # if true, discarding and playing fives only gives back half a clue
fives_give_clue: bool = True, # if false, then playing a five will not change the clue count
deck_plays: bool = False,
all_or_nothing: bool = False
all_or_nothing: bool = False,
starting_player: int = 0 # defines index of player that starts the game
):
# defining properties
self.deck = deck
@ -128,6 +129,7 @@ class HanabiInstance:
self.deck_plays = deck_plays,
self.all_or_nothing = all_or_nothing
assert not self.all_or_nothing, "All or nothing not implemented"
self.starting_player = starting_player
# normalize deck indices
for (idx, card) in enumerate(self.deck):
@ -170,7 +172,7 @@ class HanabiInstance:
class GameState:
def __init__(self, instance: HanabiInstance, starting_player: int = 0):
def __init__(self, instance: HanabiInstance):
# will not be modified
self.instance = instance
@ -181,7 +183,7 @@ class GameState:
self.stacks = [0 for i in range(0, self.instance.num_suits)]
self.strikes = 0
self.clues = 8
self.turn = starting_player
self.turn = self.instance.starting_player
self.pace = self.instance.initial_pace
self.remaining_extra_turns = self.instance.num_players + 1
self.trash = []

View File

@ -19,7 +19,7 @@ from hanabi.solvers import sat
def check_game(game_id: int) -> Tuple[int, hanab_game.GameState]:
logger.debug("Analysing game {}".format(game_id))
with database.conn.cursor() as cur:
cur.execute("SELECT games.num_players, deck, actions, score, games.variant_id FROM games "
cur.execute("SELECT games.num_players, deck, actions, score, games.variant_id, starting_player FROM games "
"INNER JOIN seeds ON seeds.seed = games.seed "
"WHERE games.id = (%s)",
(game_id,)
@ -27,11 +27,16 @@ def check_game(game_id: int) -> Tuple[int, hanab_game.GameState]:
res = cur.fetchone()
if res is None:
raise ValueError("No game associated with id {} in database.".format(game_id))
(num_players, compressed_deck, compressed_actions, score, variant_id) = res
(num_players, compressed_deck, compressed_actions, score, variant_id, starting_player) = res
deck = compress.decompress_deck(compressed_deck)
actions = compress.decompress_actions(compressed_actions)
instance = hanab_live.HanabLiveInstance(deck, num_players, variant_id=variant_id)
instance = hanab_live.HanabLiveInstance(
deck,
num_players,
variant_id=variant_id,
starting_player=starting_player
)
# check if the instance is already won
if instance.max_score == score:

View File

@ -118,9 +118,9 @@ def detailed_export_game(
deck_plays=deck_plays,
one_less_card=one_less_card,
one_extra_card=one_extra_card,
all_or_nothing=all_or_nothing
),
starting_player
all_or_nothing=all_or_nothing,
starting_player=starting_player
)
)
for action in actions:
game.make_action(action)

View File

@ -41,8 +41,8 @@ class HanabLiveInstance(hanab_game.HanabiInstance):
class HanabLiveGameState(hanab_game.GameState):
def __init__(self, instance: HanabLiveInstance, starting_player: int = 0):
super().__init__(instance, starting_player)
def __init__(self, instance: HanabLiveInstance):
super().__init__(instance)
self.instance: HanabLiveInstance = instance
def make_action(self, action):