You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历叫牌历史嵌套列表自动识别定约对应庄家

回合制卡牌游戏庄家自动识别实现

核心判定规则

  • 庄家定义:最终定约方搭档中,*首个叫出最终定约花色(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:36:24