
1. 一小时挑战用 Claude Code 从零写出可玩贪吃蛇你可能已经在用 Claude Code 补全函数、改 bug但有没有想过让它从零交付一个完整的小项目我给自己定了个挑战只用 Claude Code不手动写一行核心逻辑在一小时内做出一个能跑、能玩、能计分的贪吃蛇。结论是可行的但前提是你得把“需求拆解”和“验证节奏”设计好否则很容易卡在“代码看起来对、跑起来不对”的循环里。贪吃蛇这个题目特别适合做 AI 编程的压力测试。它足够小小到一小时内能完成又足够完整完整到覆盖了状态管理、输入处理、碰撞检测、渲染循环、边界条件这些真实项目里都会遇到的东西。Claude Code 在这里扮演的不是“自动补全”而是“结对工程师”——你负责定义接口和验收标准它负责把实现填出来。这篇文章交付的东西很具体一套可复制的项目结构、四段关键提示词、完整的运行命令以及逐步验证动作。你跟着做一小时内能拿到一个可玩版本。适合谁适合已经装了 Claude Code、想把它从“补全工具”升级成“项目交付工具”的开发者。如果你还没配好 Claude Code 的模型接入第二节会给出前置步骤用 TaoToken 把 Base URL、Key、Model ID 三件套配齐后面所有操作都基于这套配置。先说清楚挑战的边界纯 HTML Canvas 原生 JavaScript不引入任何框架和外部依赖。这样做的原因是减少变量——AI 生成代码最容易出问题的地方就是依赖版本和 API 用法把依赖砍到零调试成本会低很多。项目结构就四个文件index.html入口、game.js核心逻辑、ui.js渲染与循环、test_game.js单元测试。下面按阶段拆。2. 前置把 Claude Code 接到可用模型上Claude Code 本身是个 CLI 工具它需要一个能对话的模型后端。很多人卡在这一步不是因为不会用而是因为配置项散落在不同文件里改错一个就报401或者local proxy failed。我实测下来最省事的做法是用 TaoToken 提供的兼容接口把三件套一次性写进配置。三件套是什么Base URL、API Key、Model ID。这三个必须同时正确缺一个都会失败。Base URL 指向https://taotoken.net/apiAPI Key 在控制台的 API Keys 页面生成Model ID 填你实际要用的模型标识。注意 Base URL 不要带 UTM 参数那是给网页链接用的接口地址保持干净。Claude Code 的配置通常写在用户目录下的 settings 文件里。如果你用的是 Claude Code 的 Anthropic 兼容模式配置片段长这样{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }如果你用的是 Codex 风格的auth.json结构会不一样但三件套的逻辑一致{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: claude-sonnet-4-20250514 }配置写完后别急着开项目。先做一次最小验证在终端里跑一条最简单的对话请求确认模型能回话。这一步能帮你把“配置错误”和“代码错误”彻底分开后面调试会轻松很多。验证通过后再进入贪吃蛇项目。如果你还没生成 Key去控制台的 API Keys 页面建一个然后回到这里继续。3. 可复制配置四段提示词与项目骨架这一节是整篇的核心。我把贪吃蛇拆成四个迭代阶段每个阶段一段提示词对应一个文件。你不需要一次让 Claude Code 生成全部代码那样反而容易乱。分阶段的好处是每生成一块就能立刻验证错了也只错一小块。第一阶段生成核心逻辑game.js。提示词要明确角色、任务、约束、输出格式你是一位资深前端工程师。请用纯 JavaScript 实现贪吃蛇的核心逻辑不包含任何 UI 和事件绑定。 要求 1. 网格 20x20蛇用坐标数组表示头部在前。 2. 实现 move() 方法根据方向更新蛇头吃到食物则长度加一否则移除尾部。 3. 实现碰撞检测撞墙或撞到自身时 gameOver 置为 true。 4. 实现 generateFood()随机生成食物必须避开蛇身若网格被占满则返回 null。 5. 用 class SnakeGame 封装暴露 move()、setDirection(dir)、getState() 三个方法。 6. 禁止方向直接掉头用 nextDirection 缓冲。 7. 添加详细注释。 只输出 game.js 的完整代码。第二阶段生成渲染层ui.js。这里的关键是让 Claude Code 只负责画不碰逻辑基于已有的 SnakeGame 类写一个 ui.js用 Canvas 渲染游戏。 要求 1. 画 20x20 网格蛇身用绿色方块食物用红色方块。 2. 提供 drawCanvas(game) 函数从 game.getState() 读取状态。 3. 提供 gameLoop 函数用 requestAnimationFrame 驱动每 150ms 调用一次 game.move()。 4. 支持暂停和重新开始。 5. 不要修改 game.js 的任何逻辑。 只输出 ui.js 的完整代码。第三阶段生成入口index.html把两个文件串起来绑定键盘事件。第四阶段生成test_game.js用 Node 的 assert 模块测三个关键行为正常移动、吃到食物长度增加、撞墙触发 gameOver。测试文件很重要它是你判断“AI 生成的逻辑到底对不对”的唯一客观标准。项目骨架最终长这样snake-claude/ ├── index.html ├── game.js ├── ui.js ├── test_game.js └── README.md运行方式有两种。浏览器直接打开index.html就能玩跑测试用node test_game.js。如果你想要一个本地静态服务器npx http-server . -o一行搞定。注意index.html里 script 标签的引入顺序必须是game.js在前、ui.js在后否则会报SnakeGame is not defined。4. 验证请求从单元测试到浏览器实跑代码生成完不等于项目完成。我踩过的坑是Claude Code 生成的逻辑在纸面上看没问题但一跑测试就暴露边界错误。所以验证要分两层先单元测试再浏览器实跑。单元测试先跑起来。test_game.js里至少覆盖三个用例。第一个用例测移动初始化一条长度为 3 的蛇方向向右调用一次move()断言蛇头坐标从{x:2,y:2}变成{x:3,y:2}且长度不变。第二个用例测吃食物把食物放在蛇头下一步的位置调用move()断言长度变成 4且食物重新生成。第三个用例测撞墙把蛇头放在边界调用move()断言gameOver为 true。import assert from assert; import { SnakeGame } from ./game.js; const game new SnakeGame(5); game.snake [{x:2,y:2},{x:1,y:2},{x:0,y:2}]; game.direction RIGHT; game.nextDirection RIGHT; game.move(); assert.deepStrictEqual(game.snake[0], {x:3,y:2}); assert.strictEqual(game.snake.length, 3); game.food {x:3,y:2}; game.move(); assert.strictEqual(game.snake.length, 4); game.snake [{x:0,y:0},{x:1,y:0}]; game.direction LEFT; game.nextDirection LEFT; game.move(); assert.strictEqual(game.gameOver, true); console.log(所有测试通过);跑node test_game.js看到“所有测试通过”才算逻辑层过关。如果报错把报错信息和期望行为一起丢回给 Claude Code让它修不要自己猜。单元测试过了之后打开浏览器实跑。重点看四件事蛇能不能动、方向键响应对不对、吃到食物分数有没有加、撞墙后能不能重新开始。我实测下来最容易出问题的是方向键映射——有时候按左键蛇往右走原因是event.key到方向常量的映射写反了。另一个高频问题是食物生成在蛇身上导致蛇一移动就“吃到”自己。这两个问题在测试里不一定能覆盖必须靠实跑发现。5. 常见报错排查401、local proxy failed 与 choices 解析失败调试阶段最耗时的不是游戏逻辑而是环境报错。我把这次挑战里遇到的真实报错和对应解法列出来你对照着查。401 Unauthorized基本只有一个原因Key 不对或者没带上。检查三件事——Key 有没有复制完整、配置里字段名是不是ANTHROPIC_API_KEY、Base URL 有没有多写斜杠。注意 Key 只在生成时显示一次如果丢了就重新建一个。local proxy failed通常出现在你本地起了代理但配置没指向它或者代理端口和配置不一致。如果你用的是直连模式确认配置里没有残留的代理地址。这个报错和网络环境有关排查时先确认配置文件的ANTHROPIC_BASE_URL指向的是https://taotoken.net/api而不是某个本地端口。reading choices这类解析失败多半是模型返回格式和客户端预期不一致。常见于 Model ID 填错或者用了不兼容的模型标识。解决办法是把 Model ID 换成文档里明确支持的型号然后重新发一次请求。如果还不行去模型对话页面单独测一次确认模型本身能正常回话。OAuth 相关报错一般出现在你混用了两种认证方式。Claude Code 支持 API Key 和 OAuth 两种模式配置里只能留一种。如果你之前登录过 OAuth先把相关缓存清掉再用 API Key 模式重配。还有一个隐蔽的坑index.html里 script 顺序错了浏览器控制台报SnakeGame is not defined。这不是模型的问题是文件引入顺序的问题把game.js挪到ui.js前面即可。6. 把挑战变成可复用的工作流一小时做出贪吃蛇真正有价值的不是这个游戏本身而是你验证了一套可复用的流程定义接口 → 分阶段生成 → 单元测试 → 实跑验证 → 定向修复。这套流程换个题目照样能用比如做一个待办清单、一个计算器、一个 Markdown 预览器步骤完全一致。如果你想把 Claude Code 长期用在日常编码里建议把模型接入固定下来别每次重新配。三件套配好之后Base URL 用https://taotoken.net/apiKey 在控制台管理Model ID 按项目需要切换。需要长期跑 Agent 类任务的可以看 Coding Plan只是偶尔验证模型的用模型对话就够了接入过程中卡在配置的直接翻接入文档对照字段名。最后留一个实用技巧每次让 Claude Code 生成代码前先想清楚“我怎么验证它对不对”。验证方式想不出来说明需求还没拆够细。贪吃蛇的验证方式是单元测试加实跑你的下一个项目也一样——先定验收标准再让 AI 动手。