如何遍历叫牌历史嵌套列表自动识别定约对应庄家
回合制卡牌游戏庄家自动识别实现
核心判定规则
- 庄家定义:最终定约方搭档中,*首个叫出最终定约花色(denomination)*的玩家
- 搭档分组:北(N)-南(S)同组,东(E)-西(W)同组
- 叫牌终止条件:连续出现3次pass即结束叫牌,锁定最终定约
- 定约结构:定约字符串索引0为定约阶数(需拿的赢墩数),索引1为花色标识,例如定约
4H取contract[1]即可得到红桃花色标识H
现有已实现代码
叫牌输入与历史记录:
dealer_call = input(dealer + " bids: ") auction.append(dealer + ": " + dealer_call)
叫牌阶段终止逻辑:
if passes == 3: contract = last_bid print("The auction period is ended. The contract is " + contract + " by " + declaring_side)
当前人工指定庄家的临时逻辑:
declarer = input("The Declarer is: ")
简洁高效实现方案
整体逻辑仅需一次顺序遍历即可完成判定,无冗余计算:
target_denomination = contract[1] declarer = None # 按叫牌先后顺序遍历历史记录 for record in auction: # 若auction是你说明的嵌套列表结构(如["N", "1C"]),直接用下一行的解构赋值即可,删掉split行 # player, bid = record # 若auction存的是你append的"玩家: 叫牌"字符串格式,保留这行split player, bid = record.split(": ") # 跳过pass等非实质性叫牌 if bid == "pass": continue # 判断条件:玩家属于最终定约方 + 本次叫牌花色匹配定约花色 # 若你的declaring_side存储为"NS"/"EW"字符串,直接用 player in declaring_side 判断即可 if (player in declaring_side) and (len(bid)>=2 and bid[1] == target_denomination): declarer = player break
逻辑说明
- 正序遍历叫牌历史天然满足「首个叫出」的先后顺序要求,无需额外排序
- 匹配到第一个符合要求的玩家后直接
break终止遍历,不会做多余判断 - 时间复杂度为O(n),n为叫牌总次数,是该场景下的最优效率实现
内容的提问来源于stack exchange,提问作者Jim Perkins
相关产品推荐
相关产品推荐

