
最近不少开发者群里都在讨论 “The Infinite Policeman – A Crookery” 这类对话型恶搞游戏你明明只是开车去看奶奶却被一个彬彬有礼又极其较真的警察反复拦下从车尾灯颜色问到汤盒提手方向只要回答稍有矛盾嫌疑值立刻上涨。很多人以为这种效果靠的是写好的分支剧情实际上它更像一个“大模型实时生成 NPC 反应”的案例警察的每次追问、每轮态度变化都不是提前写在剧情表里的而是由角色提示词在运行时动态生成的。本文不讨论原作品的具体作者、版权或素材来源只从技术拆解和复刻的角度讲解如何用 FastAPI 一个兼容 OpenAI 协议的大模型接口自己实现一款名为 “The Infinite Policeman – A Crookery” 风格的“无限拦截”对话小游戏。即使你还没有申请任何大模型 API我也会提供一个可运行的本地 Mock 模式让代码在没有任何外部依赖的情况下也能玩起来。读完这篇文章你可以掌握怎样设计玩家的核心循环和失败条件、怎样让大模型输出结构化的 JSON 控制游戏状态、怎样用 FastAPI 管理多轮对话会话、怎样用原生 HTML/JS 做一个简单的聊天界面以及这类“对抗性 NPC”游戏在实际工程化时要注意的坑。1. 项目背景一个“永远在拦你”的警察游戏1.1 玩法体验拆解“The Infinite Policeman” 这个名字里有两个关键词Infinite 和 Policeman。Infinite指的并不是游戏地图真的无限大而是玩家面对的追问是近乎无限的。当你解释完一个问题警官不会说“好的我相信你”而是从你的解释里又找到一个新疑点继续往下问。比如你说汤盒是保温的他会继续问保温盒是什么材质你说盒子上没有字他又会问你为什么没有出厂标签。这个连续追问的过程天然适合交给大模型来完成因为手写 if-else 分支根本不可能覆盖玩家输入的无数种解释。Policeman在这里可以理解成一个“高对抗性的 NPC”。在普通剧情游戏里NPC 的目标是配合玩家推进故事在这类游戏里NPC 的目标是让玩家失败但表面上又必须保持礼貌、克制、讲逻辑。这种“外表温和、内心怀疑”的反差就是游戏喜剧效果的来源。副标题里的 Crookery 在英文里有“欺诈、骗局、耍花招”的含义。玩家如果想顺利过关就必须编造一个足够自洽的借口在警察连续质疑下不露馅。所以这本质上是一场“玩家编故事”和“警察拆故事”的攻防对话。1.2 为什么值得用技术手段复刻从技术角度看这个项目非常有代表性因为它同时涉及了好几个在真实 AI 应用中经常遇到的问题角色扮演提示词如何稳定控制大模型的说话风格如何用 JSON 格式约束大模型输出让游戏后端能够读取状态如何管理多轮对话历史避免上下文越来越长导致 token 超限如何设计一个有限的状态机把“无限追问”收敛成可以正常结束的游戏关卡。这些知识点并不只属于“做小游戏”在很多客服机器人、剧本杀生成器、虚拟角色陪伴产品里都会用到。所以这篇文章虽然以一个恶搞游戏为切入点背后的工程方法完全可以用到更正经的场景里。1.3 本文边界与读者对象需要提前说明的是游戏中的警察、规定、罚单全部是架空虚构设定目的是营造幽默和荒诞感与现实中的任何法律、执法程序无关。代码中的系统提示词也会反复强调这一点避免模型生成与现实执法相关的敏感内容。本文适合以下读者会一点 Python想体验大模型应用开发但没做过完整项目熟悉 Python但对提示词工程、结构化输出、对话会话管理感兴趣想给自己的游戏或互动产品加入一个“会怀疑人”的动态 NPC需要一个能离线运行的示例先把代码跑通再接入大模型 API。2. 环境准备与技术选型2.1 运行环境本文示例使用 Python 开发建议使用 Python 3.10 及以上版本。不同系统安装方式有差异本文不对具体小版本做绑定重点演示整体配置思路。推荐环境如下操作系统Windows 10/11、macOS 或 Linux 均可Python 3.10包管理工具pip虚拟环境venv开发工具VS Code 或 PyCharm浏览器Chrome / Edge 等现代浏览器。在项目目录下创建虚拟环境并激活cd infinite-policeman python -m venv .venvWindows 下激活虚拟环境.venv\Scripts\activatemacOS 或 Linux 下激活虚拟环境source .venv/bin/activate2.2 依赖与模型服务安装依赖前先准备 requirements.txtfastapi uvicorn[standard] requests python-dotenv然后执行pip install -r requirements.txt后端选择 FastAPI原因是