一个可视化的军棋对战与演示程序,支持四方(南/西/北/东)对战、铁路规则、行营/大本营、即时淘汰等核心机制。
- 依赖安装:
- Python 3.10+
pip install -r requirements.txt
- 启动程序:
python main.py
标准军棋四暗模式的规则。地雷只能工兵挖,其他子撞地雷地雷不会消失。司令阵亡会翻开军旗。当军旗被扛或没有可以移动的子时玩家立即阵亡。对轴为一队,当一队玩家全部阵亡,游戏结束。
接入豆包/ARK API,支持多个 AI 玩家轮流发言与分析。走法由本地算法决定(LLM 不再负责选择走法)。
- 复制根目录
.env.example为.env,按注释填写:ARK_API_KEY与可选的ARK_MODEL(默认doubao-seed-1.6-250615)。- Doubao TTS 凭据(可选):
DOUBAO_TTS_APPID、DOUBAO_TTS_ACCESS_TOKEN、DOUBAO_TTS_SECRET_KEY、DOUBAO_TTS_CLUSTER、DOUBAO_TTS_VOICE_TYPE。
- 提示:若配置
ARK_API_KEY,将调用模型生成分析与发言(走法仍由本地算法选出并执行)。未配置时,启用“无模型回退”:AI 玩家仍按本地算法走棋,并广播兜底发言。
- 删除了原本的 WebSocket 接口与服务器:改为单进程本地模式,
main.py直接挂接GameProcess与GameWindow。通过set_ai_action_consumer执行走子、set_broadcast_consumer广播聊天/TTS。 - 决策功能分离:LLM 仅负责生成分析(
rationale)与简短发言(utterance),不再选择走法;最佳走法由本地算法提供并作为planned_move注入提示词。 - 引入深度搜索遍历决策树:新增模块
server/strategies/search.py,实现联盟式 Alpha-Beta 剪枝、Beam 排序以及首层风格过滤;并在server/strategies/scoring.py::choose_best_move_styled中集成,替代原先的单步打分选择。 - 反击优先与风格驱动:首层优先考虑“反击位”候选,其次依据玩家风格(防守/进攻/试探)过滤首层候选,再在候选池内进行深度搜索。
- 广播与日志:模型发言在回合结束后后台合成 TTS 并广播到 UI;完整走子与聊天历史写入
logs/biz.log(JSON快照)。
-
原评分机制(单步打分):
- 对每个合法走法计算静态评分(吃子收益、旗安全、推进、风险等),只选择当前步的最高分;不模拟后续回合,不考虑队友/对手的响应链。
- 优点:极快,稳定可用;缺点:短视,容易被对手“反扑”或陷入交换劣势。
-
深度搜索机制(多步前瞻):
- 联盟式 Alpha-Beta:以“起手方所在阵营”为最大化阵营,同轴队友都走“Max”,另轴对手走“Min”,按实际回合顺序轮替并剪枝。
- Beam 排序与限宽:每层对候选走法打分排序,只保留前
beam_width(默认 8),提高搜索深度下的效率与稳定性。 - 首层风格过滤:首层可按“防守/进攻/试探”类别过滤候选(默认启用),保持不同玩家偏好;与“反击优先”结合先压制敌方入侵。
- 叶节点评分:以静态局面评估
_evaluate_state(队友最佳即时得分 − 敌方最佳即时得分),并对每层评分应用衰减discount(默认 0.95)。
-
时间预算:
time_limit_ms(默认 5000ms)用于控制搜索时长;若在预算内深度搜索无法产生任何走法,则本回合执行“跳过回合”。 -
参数与默认值:
-
SearchConfig(depth=3, beam_width=8, discount=0.95, time_limit_ms=5000, use_alpha_beta=True, apply_style_filter_first_ply=True)。- 可在集成点
choose_best_move_styled中调整搜索深度与时间预算;若需要更强对局前瞻,可适度提升depth(如 4),并相应增大time_limit_ms。
- 可在集成点
-
效果对比:
- 深度搜索在“交换与反击链条”“多方协同封线”“旗位安全滚动评估”等场景明显更稳健;但计算成本更高,需用
beam_width / time_limit_ms控制延迟。 - 单步评分适合超低延迟与资源受限环境;现仅作为分析与解释的轻量打分,不再充当兜底回退路径。
- 深度搜索在“交换与反击链条”“多方协同封线”“旗位安全滚动评估”等场景明显更稳健;但计算成本更高,需用
- 累计击杀数:每个棋子都记录自身的
击杀数(kill_count)。战斗时,胜者会继承败者的战绩并再加 1:- 攻击方胜利:攻击方
kill_count += 防守方.kill_count + 1。 - 防守方胜利:防守方
kill_count += 攻击方.kill_count + 1。
- 攻击方胜利:攻击方
- 显示规则:在棋子右下角绘制战绩标记(洋红色),随棋子移动;棋子死亡则不显示。
- 1/2 杀:显示"^"形标记(较小号、细线)。
- 3 杀及以上:显示小五角星(整体缩小一号,贴近右下角)。
- 右键已有棋子弹出标记菜单,可为该棋子设置一个简短标记,例如:
司、军、师、旅、团、营、连、排、工、炸、雷、旗,或选择"清除"删除标记。 - 允许对自己的棋子使用标记,以记录假炸弹、假令等伪装设定。
- 标记会跟随棋子移动;当棋子死亡时,其标记会自动清除。
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议(CC BY-NC 4.0)进行许可。
您可以自由地复制、分发、展示和演绎本作品,但必须遵守以下条件:
- 署名(BY):您必须适当署名,注明原作者,并提供本许可证的链接。
- 非商业性使用(NC):您不得将本作品用于任何商业目的,包括但不限于:
- 以盈利为目的的直播活动(如带货直播、付费直播等)
- 用于商业性质的视频制作(如广告视频、付费课程视频、企业宣传视频等)
- 其他任何形式的商业盈利行为
完整许可文本请参见:https://creativecommons.org/licenses/by-nc/4.0/legalcode
- 欢迎 Fork 本仓库用于学习、研究与非商业交流。
- 在 Fork 基础上进行修改、增加功能、二次开发是允许的,但必须遵守 CC BY-NC 4.0:保留署名、提供许可证链接、不得用于任何商业目的。
- 发布派生版本时,请在 README 中注明来源链接与原作者;保留本仓库的许可证段落或以醒目位置链接至完整许可文本。
- 欢迎通过 Pull Request 贡献改进;提交前请确保不包含任何敏感凭据或密钥。
- 若用于公开演示/教学,请附上协议与来源说明。