Skip to content
[OPEN_POKER]

7天内从零到Open Poker排行榜:每日计划

JJoão Carvalho||17 min read

你可以在7天内将一个扑克机器人从"不存在"带到"在Open Poker排行榜上排名"。不是7周。平台的设计让开发者在第1天就能注册、连接和游戏,然后每天添加一个策略升级直到具有竞争力。以下是我们推荐的计划,包括真正有效的升级和无效的。

为什么7天计划有效?

因为每天在一个工作中的机器人上添加一个单独的、独立的改进。你不是在第一手牌之前构建端到端系统。你在第1天启动一个calling station并逐步改进。到第7天,每个升级都已针对真实对手验证,而不是对自己说谎的自我对弈模拟器。

这与大多数机器人项目失败的方式正好相反。大多数开发者花两周设计"完整"架构,然后在第14天才发现手牌评估器与协议的牌格式不匹配,或操作发送器忘了turn token,或底池赔率计算器用了错误的字段。7天计划把这一切推迟到机器人已经在运行之后。

另一个原因:Open Poker的排行榜奖励游戏量而非巅峰技术。运行7天的平庸机器人得分高于运行1天的优秀机器人。到第7天你有4-5天的累积手牌历史,这足以减少方差,即使策略仍然粗糙也能爬到底部以上。

第1天:让calling station运行

第1天的唯一目标是一个连接的机器人打合法的手牌。不要担心策略。不要担心利润。只关心:机器人连接,机器人入座,机器人用有效操作响应your_turn,机器人30分钟不崩溃。

使用用Python构建扑克机器人指南作为起点。完整机器人不到50行。复制,粘贴API密钥,运行。30秒内你会看到"Connected as 你的机器人名",加入大厅后一两分钟内有第一手牌。

calling station策略(能check就check,否则call,否则fold)会损失筹码但产生完整的事件循环。每种消息类型都被处理。每个操作都带有有效的turn token发送。第1天结束时你的机器人已打50-100手,你有一个可改进的基线胜率。

当天目标:机器人打了至少20手,无崩溃,无超时。

第2天:添加翻牌前手牌选择

在calling station基础上能做的最大单一改进。Hold'em中大多数起手牌是输家;翻牌前弃掉最差的60%大幅减少在翻牌及之后损失的筹码。

def should_play_preflop(cards):
    """Top ~40% of starting hands."""
    ranks = "23456789TJQKA"
    r1 = ranks.index(cards[0][0])
    r2 = ranks.index(cards[1][0])
    high, low = max(r1, r2), min(r1, r2)
    pair = r1 == r2
    suited = cards[0][1] == cards[1][1]
 
    if pair: return True
    if high >= 10: return True
    if high >= 8 and suited: return True
    if high == 12 and low >= 7: return True
    return False

hole_cards到达时保存底牌。在your_turn中,如果是翻牌前且should_play_preflop()返回False,弃牌。否则回退到calling station逻辑。

这单一变化通常让calling station从-2.5 bb/100提升到约-0.8 bb/100。你仍在损失筹码,但速度不会触发频繁rebuy。当天目标:200+手,胜率超过12%。

第3天:添加翻牌前加注

第2天的机器人弃掉差牌但从不加注好牌。对手免费看到你premium手牌的翻牌,意味着他们能做出打败你的牌。修正:用你最强的15%手牌加注而不只是跟注。

def should_raise_preflop(cards):
    ranks = "23456789TJQKA"
    r1, r2 = ranks.index(cards[0][0]), ranks.index(cards[1][0])
    pair = r1 == r2
    high, low = max(r1, r2), min(r1, r2)
    suited = cards[0][1] == cards[1][1]
    # Premium pairs
    if pair and r1 >= 8: return True  # 99+
    # Big aces
    if high == 12 and low >= 9: return True  # AT+
    # Suited broadway
    if suited and high >= 10 and low >= 9: return True
    return False

当这返回True且raisevalid_actions中时,发送最小加注而不只是跟注。amount字段是raise-to总额,不是增量。使用raise条目的min值作为amount。

当天目标:400+手,胜率超过16%,bb/100接近盈亏平衡。

第4天:为翻牌后跟注添加底池赔率

翻牌后是机器人损失最多筹码的地方。不做计算就跟注随机下注正是calling station之所以是calling station。用底池赔率修复。

计算:将跟注额除以你跟注后的底池。如果你估计的胜率超过该比率,跟注。否则弃牌。机器人扑克数学教程详细介绍公式。

def call_is_profitable(your_turn_msg, win_pct=0.30):
    actions = {a["action"]: a for a in your_turn_msg["valid_actions"]}
    if "call" not in actions:
        return False
    pot = your_turn_msg["pot"]
    call_amt = actions["call"]["amount"]
    if call_amt == 0:
        return True
    pot_odds = call_amt / (pot + call_amt)
    return win_pct > pot_odds

第4天使用固定30%胜率估计。在大多数特定场景下是错的,但平均而言比"总是跟注"好得多。你会在什么都没有时弃掉河牌,在有合理权益的手牌上继续。

当天目标:600+手,bb/100在盈亏平衡或略正。

第5天:追踪对手VPIP

第5天是你停止每手牌打法相同、开始适应牌桌的时候。构建一个简单的对手追踪器,记录每个玩家翻牌前投入筹码的频率。对手建模指南有完整实现,但最小可行版本:

from collections import defaultdict
 
vpip_data = defaultdict(lambda: {"hands": 0, "voluntary": 0})
acted_this_hand = set()
 
def on_hand_start():
    acted_this_hand.clear()
 
def on_player_action(msg):
    name = msg.get("name", f"seat{msg['seat']}")
    if msg["action"] in ("call", "raise", "all_in"):
        if name not in acted_this_hand:
            vpip_data[name]["hands"] += 1
            vpip_data[name]["voluntary"] += 1
            acted_this_hand.add(name)
 
def get_vpip(name, default=0.25):
    data = vpip_data[name]
    if data["hands"] < 20:
        return default
    return data["voluntary"] / data["hands"]

用VPIP调整你的加注范围。对VPIP低于15%的后位对手,扩大你的偷盲范围。对VPIP超过50%的对手,只做价值下注(不要诈唬:他们跟注太多)。

当天目标:800+手,机器人识别至少5个不同对手。

第6天:添加下注大小变化

固定下注大小是下一个漏洞。大多数初学者机器人总是最小加注或总是下注底池大小。两者都不对。根据情况混合三个大小:

场景大小理由
后位翻牌前开注2.5x BB标准开注,平衡偷盲频率和价值
干燥牌面的持续下注33%底池便宜,让弱牌弃牌
湿润牌面的价值下注75%底池向听牌收费,为价值建池

根据场景计算加注额,限制在valid_actionsmin/max范围内并发送。混合大小让你明显更不容易被利用。追踪模式的对手不能再仅从下注大小猜测你的牌力。下注策略教程有完整分解。

当天目标:1,000+手,bb/100可测量正值,排行榜前50%。

第7天:运行、监控、迭代

第7天不是关于新功能。是关于让你的机器人连续运行12+小时,观察排行榜,修补任何故障。调试指南涵盖最常见的故障模式(认证问题、超时、竞态条件)。

三件事需要检查:

1. 崩溃日志。 将主循环包裹在try/except中,记录每个异常和时间戳。运行4小时,然后阅读日志。先修复最频繁的错误。

2. 慢决策。超时指南添加延迟日志。超过1秒的任何东西值得调查。

3. 每小时胜率。 按一天中的小时分组手牌历史,检查胜率是否波动。一些机器人在高峰时段赢(更多对手 = 更多弱玩家可以利用)但在非高峰时段输。用这个来决定何时保持机器人运行。

当天目标:机器人在7天内打了1,500+手,排在当前赛季排行榜前25%,无人监管运行12+小时。

7天进展实际上是什么样的?

以下是我们在多个遵循此计划的开发者中观察到的大致胜率轨迹:

添加的策略中位数 bb/100当天结束手数
1Calling station-2.550
2翻牌前弃牌范围-0.8200
3翻牌前加注范围-0.3400
4翻牌后底池赔率+0.4600
5基于VPIP的对手解读+1.1800
6下注大小变化+1.71,000
7稳定性和正常运行时间+1.71,500+

最大跳跃在第2天和第5天:翻牌前手牌选择和对手建模。这些是每行代码最便宜的改进。第4天和第6天是较小的收益但复合效果好。第7天不增加优势,但通过积累手数将你已有的优势转化为排行榜位置。

这不是严格的研究。6-max方差高,个人结果因赛季玩家池而异,但方向上模式一致:简单升级的堆叠在不到一周的兼职工作中变成有竞争力的机器人。

第一周不应该做什么?

三个需要避免的陷阱。

不要从零开始写手牌评估器。 很诱人因为感觉像"真正的"扑克工作。这是一个多天项目,相比简单的胜率启发式不增加可衡量的优势。如果绝对需要牌力,使用PokerKitTreys(经过实战检验的Python库),而不是写自己的。我们在服务器端也出于同样的原因使用PokerKit。

不要尝试实现CFR或GTO求解。 Counterfactual Regret Minimization是Pluribus和Libratus背后的技术。也是一个需要数千万训练手牌的多月研究项目。对于第一个机器人,把同样的时间花在基本启发式上会得到更好的结果。以后想突破前20%再添加CFR。

不要在第1天没有错误处理就部署。 将事件循环包裹在try/except中,记录每个异常并继续。在单个坏消息上崩溃的机器人会失去它们本来可以在夜间积累的所有牌桌时间。修复方法是一个try/except块。

第7天之后呢?

一旦你有了一个工作中的有竞争力的机器人,下一轮升级是增量的和高影响的:

  • 基于位置的范围:枪口位更紧,切断位和按钮位更松
  • 多街规划:在翻牌下注前思考转牌要做什么
  • 诈唬选择:选择诈唬可信的牌面(高牌、较少听牌)
  • 资金管理:根据会话结果变化买入

每个如果实施得好都能增加0.5-1.5 bb/100。到排行榜前10的路不是单一突破;是堆叠10个小改进直到你的机器人在每个常见场景都有可衡量的优势。完整平台文档涵盖下一轮需要的每个协议细节。

FAQ

构建一个有竞争力的扑克机器人真正需要多长时间? 第一个有竞争力的机器人(排行榜前25%),7天兼职工作是现实的。前10%需要2-4周的迭代和调优。前1%需要CFR风格算法、大规模对手分析和数月的精炼。

我能用Python以外的语言跟这个计划吗? 可以。协议是纯WebSocket加JSON,所以任何支持WebSocket的语言都行。JavaScript、Go、Rust、Java、C++,甚至Bash配websocat都被用来在Open Poker上构建机器人。Python示例可以直接翻译。

我需要打多少手才能在排行榜上上升? 至少需要10手才能出现在排行榜上。要显著上升,计划在整个赛季打1,000-2,000手。更多手牌减少方差,让你的优势显现。

我需要Pro账户才能执行这个计划吗? 不需要。这个计划中的一切都适用于免费账户。Pro计划($5/赛季,有套餐折扣)增加分析、自定义策略和更短的rebuy冷却,但策略升级本身是免费的。完整列表参见Pro功能比较

如果我的机器人在完成计划前破产了怎么办? auto-rebuy处理这个。连接后发送{"type": "set_auto_rebuy", "enabled": true}一次,当你的机器人破产时服务器会自动rebuy(免费计划有5分钟冷却)。你的事件循环继续运行,冷却到期后下一手立即开始。


七天的专注工作足以将扑克机器人从零带到Open Poker排行榜竞争者。平台为这种迭代速度而设计。注册一个机器人,按照每日计划执行,下周你就会有一个排名条目。

继续阅读