扑克动作分析函数Bug排查:误判非初始下注者的Call行为
扑克动作分析函数逻辑修复
问题背景
有一个分析翻牌圈扑克动作的Python函数,输入为动作列表(唯一下注轮次)。针对测试用例test1,函数错误输出no_calls_other_than_original_bettor = True,但实际上Robert3已经跟注了Brittney2的下注,该值应为False。
当前函数输出:('FLOP', True, True, False, False, 6, 1)
正确输出:('FLOP', True, False, False, False, 6, 1)
测试用例test1:
test1= [{'street': 'FLOP', 'player': 'John4', 'position': 4, 'action': 'checks'}, {'street': 'FLOP', 'player': 'Jane0', 'position': 0, 'action': 'checks'}, {'street': 'FLOP', 'player': 'Brittney2', 'position': 2, 'action': 'bets', 'amount': 18.0}, {'street': 'FLOP', 'player': 'Robert3', 'position': 3, 'action': 'calls', 'amount': 18.0}, {'street': 'FLOP', 'player': 'John4', 'position': 4, 'action': 'raises', 'amount': 94.0}, {'street': 'FLOP', 'player': 'Jane0', 'position': 0, 'action': 'folds'}, {'street': 'FLOP', 'player': 'Brittney2', 'position': 2, 'action': 'folds'}, {'street': 'FLOP', 'player': 'Robert3', 'position': 3, 'action': 'folds'}]
错误原因分析
问题出在no_calls_other_than_original_bettor的判断逻辑上:
原代码逻辑:
no_calls_other_than_original_bettor = all(player != bettor and player != raiser for player in call_players)
该逻辑的含义是“所有跟注玩家都不是原始下注者、也不是加注者”时返回True,完全与需求相反。我们需要的是“除原始下注者外没有其他玩家跟注”——即当存在非原始下注者的跟注玩家时,该值应为False。
修复后的代码
def analyse_poker_actions(actions): players = set() bettor = None raiser = None call_players = [] raise_players = [] betting_street = None raise_players_excluding_bettor = [] fold_actions = [] bettor_actions = [] for action in actions: players.add(action['player']) if action['action'] == 'bets': bettor = action['player'] if betting_street is None: betting_street = action['street'] if action['player'] == bettor: bettor_actions.append(action['action']) if action['action'] == 'calls': call_players.append(action['player']) if action['action'] == 'raises': raise_players.append(action['player']) if action['player'] != bettor: raise_players_excluding_bettor.append(action['player']) if raiser is None: raiser = action['player'] if action['action'] == 'folds': fold_actions.append(action['player']) player_bet_and_folded = bettor in fold_actions # 修复逻辑:判断所有跟注玩家是否都是原始下注者,无跟注时默认True no_calls_other_than_original_bettor = all(player == bettor for player in call_players) if call_players else True cold4bet = len(set(raise_players_excluding_bettor)) > 1 if 'raises' in bettor_actions and 'folds' in bettor_actions: bettor_reraised = bettor_actions.index('raises') < bettor_actions.index('folds') else: bettor_reraised = False return betting_street, player_bet_and_folded,no_calls_other_than_original_bettor,cold4bet, bettor_reraised, len(players),len(raise_players_excluding_bettor)
验证结果
用test1测试修复后的函数,输出为('FLOP', True, False, False, False, 6, 1),与预期正确结果一致。
内容的提问来源于stack exchange,提问作者Carol Owens
相关产品推荐
相关产品推荐

