liars-bar-llm游戏主循环代码全解:出牌、质疑、开枪、换轮的完整流程图与源码逐行讲解 liars-bar-llm游戏主循环代码全解出牌、质疑、开枪、换轮的完整流程图与源码逐行讲解【免费下载链接】liars-bar-llm一个由大语言模型驱动的AI版骗子酒馆对战框架项目地址: https://gitcode.com/gh_mirrors/li/liars-bar-llmliars-bar-llm 是一个由大语言模型LLM驱动的 AI 版骗子酒馆对战框架让多个 AI 玩家通过 API 实时对战。本文带你完整看懂它的游戏主循环出牌 → 质疑 → 开枪 → 换轮四大环节如何流转并逐段讲解 game.py 中关键源码的设计思路新手也能轻松上手 什么是 liars-bar-llmAI 玩家如何在酒馆里博弈骗子酒馆是一款经典的博弈卡牌游戏每人每轮发 5 张牌从 Q、K、A 中随机选定一张目标牌玩家按顺序打出 1~3 张牌并宣称它们是目标牌可以撒谎下家决定是否质疑。质疑成功则出牌者输质疑失败则质疑者输输家对自己开一枪——每人手里有一把 6 仓位的左轮手枪其中藏着 1 发实弹 完整规则见 prompt/rule_base.txt。liars-bar-llm 的创新点在于出牌决策、质疑判断、甚至对对手的印象管理全部由 LLM 完成框架只负责规则校验与流程推进。模块文件职责game.py游戏主循环与流程编排player.pyLLM 玩家出牌、质疑、反思game_record.py对局记录与提示词素材提取llm_client.py统一的大模型 API 调用multi_game_runner.py批量跑多局快速上手两条命令跑起 AI 卡牌对战git clone https://gitcode.com/gh_mirrors/li/liars-bar-llm cd liars-bar-llm pip install openai在llm_client.py中配置你的 API 地址与 Key项目默认通过 New API / One API 这类网关统一管理接口并在game.py底部的player_configs中填好玩家名和模型名player_configs [ {name: DeepSeek, model: deepseek-r1}, {name: ChatGPT, model: o3-mini}, {name: Claude, model: claude-3.7-sonnet}, {name: Gemini, model: gemini-2.0-flash-thinking} ]然后单局对战python game.py批量对战python multi_game_runner.py -n 10每局的完整 JSON 记录会自动保存到game_records/目录可用python json_convert.py转成人类可读文本。游戏主循环流程图一张图看懂整个流程主循环入口是game.py的start_game()第 391-397 行逻辑非常简洁def start_game(self) - None: self.deal_cards() # 发牌 self.choose_target_card() # 选定目标牌 self.start_round_record() # 开始记录 while not self.game_over: # 主循环只剩1人时结束 self.play_round()play_round()内部则是出牌 → 质疑 →可能开枪的循环推进完整流转如下start_game() ├─ deal_cards() 洗20张牌每人发5张 ├─ choose_target_card() 随机选定目标牌 Q/K/A └─ while not game_over: play_round() ├─ 其他玩家都打空──是── handle_system_challenge() 系统强制质疑 ├─ handle_play_cards() ① 出牌LLM选1~3张并宣称是目标牌 ├─ handle_challenge() ② 质疑下家LLM决定是否质疑 │ ├─ 不质疑 ── current_player_idx 指向下家继续 play_round() │ └─ 质疑 ── is_valid_play() 校验真牌/假牌 │ ├─ 质疑失败(牌合法) ── 质疑者受罚 │ └─ 质疑成功(有假牌) ── 出牌者受罚 └─ perform_penalty() ③ 开枪 ├─ process_penalty() 弹舱命中实弹死亡 ├─ check_victory() 只剩1人游戏结束 └─ reset_round() ④ 换轮反思→重发牌→新目标牌下面按环节逐段讲解源码。环节一出牌 handle_play_cards——LLM 如何决定打哪张牌handle_play_cards()game.py 第 180-219 行本身不做决策而是做三件事组装信息 → 委托 LLM → 落盘记录。组装提示词素材从GameRecord中取出三部分信息——get_latest_round_info()当前轮次号、目标牌、玩家名单get_latest_round_actions()本轮所有人的出牌历史出过什么牌、剩几张get_play_decision_info()自己和下家的开枪次数、以及当前玩家对下家的印象委托 LLM 决策调用 player.py 的choose_cards_to_play()第 57-126 行。它把 prompt/play_card_prompt_template.txt 模板填充后发给模型要求返回 JSONplayed_cards1~3 张、behavior表现描述如紧张/从容、play_reason理由。防幻觉校验 重试框架会验证返回的牌是否真的在手里、数量是否 1~3 张解析失败最多自动重试 5 次仍失败才抛异常。记录game_record.record_play()把出牌、剩余手牌、理由、LLM 原始思考过程全部存档供后续玩家复盘和分析工具使用。这个LLM 出主意 框架验真伪的分层设计是整个项目最核心的工程模式质疑环节完全复用它。环节二质疑 handle_challenge——下家的心理战出牌完成后handle_challenge()game.py 第 221-281 行让下家决定是否质疑。它的信息组装有一个精妙的不对称出牌者看到的操作历史包含自己刚打出的牌include_latestTrue质疑者看到的操作历史剔除最新一次include_latestFalse——这正是信息迷雾下家只能看到上家宣称打了几张目标牌、剩几张看不到真实牌面player.decide_challenge()player.py 第 128-192 行返回was_challenged布尔值与challenge_reason。若发起质疑is_valid_play()负责裁决def is_valid_play(self, cards: List[str]) - bool: # 每张牌必须为目标牌或 Joker万能牌 return all(card self.target_card or card Joker for card in cards)牌合法→ 质疑失败返回质疑者受罚存在假牌→ 质疑成功返回出牌者受罚注意 Joker 是万能牌即使目标牌是 Q打出 Joker 也算合规这是 LLM 容易忽略的细节prompt/rule_base.txt 中有明确说明。环节三开枪 perform_penalty——左轮手枪的生死一瞬perform_penalty()game.py 第 104-128 行执行惩罚核心委托给 player.py 的process_penalty()第 245-255 行if self.bullet_position self.current_bullet_position: self.alive False # 弹舱正好压中实弹 → 死亡 self.current_bullet_position (self.current_bullet_position 1) % 6规则是开局时实弹随机藏在 6 个弹舱之一bullet_position每开一枪弹舱前进一格并循环。是否死亡完全取决于运气与开枪时机的博弈——玩家会刻意在安全弹舱时逼对手开枪、在自己枪位危险时回避质疑这正是 LLM 策略的深度所在。开枪后流程依次是record_shooting()记录射击结果并触发 JSON 自动落盘防止进程中断丢记录check_victory()若只剩 1 名存活玩家finish_game()宣布胜利主循环退出否则进入reset_round()换轮环节四换轮 reset_round——反思、重发牌与新目标牌reset_round()game.py 第 130-154 行是新小局的开场仪式分四步① 集体反思handle_reflection()第 331-358 行让每位存活玩家调用 player.py 的reflect()第 194-243 行基于本轮完整行动记录与射击结果用 prompt/reflect_prompt_template.txt 更新对每个对手的opinions印象字典。这些印象会作为下一轮出牌/质疑提示词的一部分——AI 玩家会记仇也会改观这是项目最有意思的涌现行为。② 重发牌deal_cards()清空手牌从重新洗匀的 20 张牌6Q6K6A2Joker见_create_deck()第 31-35 行中每人发 5 张。③ 新目标牌choose_target_card()随机从 Q/K/A 中重新抽取。④ 确定起始玩家若因质疑开枪record_shooterTrue由开枪者先出牌若其已死亡则顺延到下一位有手牌者否则随机选一名存活玩家。随后start_round_record()快照记录每位玩家的弹舱位置、手牌与印象矩阵回合计数 1。特殊分支系统自动质疑 handle_system_challenge当某轮中只剩当前玩家还有手牌时无法再形成下家质疑此时play_round()第 360-389 行开头的判断会直接触发handle_system_challenge()第 283-329 行当前玩家剩余手牌视为自动打出系统代替下家发起质疑牌合法 → 记录无人开枪换轮牌违规 → 该玩家被强制开枪这一分支保证了死局必收敛是新手读源码时最容易漏掉的边缘处理。从源码到复盘游戏记录与批量对战每次出牌、质疑、射击、反思都会写入GameRecordgame_record.py数据模型为RoundRecord → PlayAction → ShootingResult三层嵌套射击与终局时自动保存 JSON 到game_records/。项目还内置了完整的分析链路命令作用python json_convert.pyJSON → 可读文本见demo_records/converted_game_records/python player_matchup_analyze.py提取两两 AI 对决记录见demo_records/matchup_records/python game_analyze.py统计全场对局数据仓库的demo_records/目录已附带 DeepSeek-R1、o3-mini、Gemini、Claude 四个模型互打 50 局的完整记录跑不通自己环境的同学可以直接阅读这些对局配合本文的流程图能直观感受 AI 玩家的出牌节奏与心理博弈 ️小结游戏主循环的设计要点主循环极简while not game_over: play_round()所有复杂逻辑都封装在四个环节函数里game.pystart_game()第 391-397 行决策与校验分离LLM 负责策略框架负责规则裁决is_valid_play()与重试兜底信息不对称是灵魂质疑者看不到上家真实牌面GameRecord通过include_latest等参数精确控制每个玩家能看见什么反思机制赋予记忆轮间反思更新玩家印象让 LLM 的对战具备跨轮次的策略性理解了这套出牌 → 质疑 → 开枪 → 换轮的主循环你就可以着手扩展自己的 AI 玩家策略或把它改造成其他博弈游戏的框架了 【免费下载链接】liars-bar-llm一个由大语言模型驱动的AI版骗子酒馆对战框架项目地址: https://gitcode.com/gh_mirrors/li/liars-bar-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考