analyze game loss reasons

This commit is contained in:
Maximilian Keßler 2023-11-10 12:00:40 +01:00
parent 2fda0d0524
commit b65c4fe43f
Signed by: max
GPG key ID: BCC5A619923C0BA5

29
bdr.py
View file

@ -1,28 +1,45 @@
from typing import List, Dict from typing import List, Dict, Tuple
from hanabi.hanab_game import Action, ActionType from hanabi.hanab_game import Action, ActionType
from hanabi.live.hanab_live import HanabLiveInstance, parse_json_game, HanabLiveGameState from hanabi.live.hanab_live import HanabLiveInstance, parse_json_game, HanabLiveGameState
def get_bdrs(instance: HanabLiveInstance, actions: List[Action]) -> List[int]: def analyze_game(instance: HanabLiveInstance, actions: List[Action]) -> Tuple[List[int], str]:
bdrs = [] bdrs = []
termination = ''
game = HanabLiveGameState(instance) game = HanabLiveGameState(instance)
for action in actions: for action in actions:
if action.type == ActionType.Discard: if action.type == ActionType.Discard:
discard = instance.deck[action.target] discard = instance.deck[action.target]
if not game.is_trash(discard): if not game.is_trash(discard):
if game.is_critical(discard):
termination = 'Discard crit'
break
if discard.rank != 1: if discard.rank != 1:
if discard in game.deck[game.progress:]: if discard in game.deck[game.progress:]:
bdrs.append(game.draw_pile_size) bdrs.append(game.draw_pile_size)
else: else:
if game.deck[game.progress:].count(discard) == 2: if game.deck[game.progress:].count(discard) == 2:
bdrs.append(game.draw_pile_size) bdrs.append(game.draw_pile_size)
if action.type == ActionType.Play:
play = instance.deck[action.target]
if (not game.is_playable(play)) and game.is_critical(play):
termination = 'Bomb crit'
print('Bombed crit {}'.format(play))
print(game.deck[game.progress:], game.stacks)
game.make_action(action) game.make_action(action)
return bdrs if termination == '':
if game.strikes == 3:
termination = 'Strikeout'
elif actions[-1].type in [ActionType.EndGame, ActionType.VoteTerminate]:
termination = 'VTK'
elif game.score < 25:
termination = 'Lost Endgame'
return bdrs, termination
def describe_game(game_json: Dict): def describe_game(game_json: Dict) -> Tuple[List[int], str]:
instance, actions = parse_json_game(game_json) instance, actions = parse_json_game(game_json)
bdrs = get_bdrs(instance, actions) bdrs, termination = analyze_game(instance, actions)
return bdrs return bdrs, termination