# 如何用 Qwen 3.8-27B 做一个能玩的小游戏

> 一台 Mac、一个跑在本机的 Qwen3.8-27B、一句话提示词，79 分钟做出 737 行能玩、有音效的 RPG 俄罗斯方块。不联网、不花钱。附选题策略、模型自己写测试的全过程、三个必踩的坑和 llama.cpp 配置速查。

- 原文链接: https://laojin.blog/blog/20260903_local_qwen_playable_game
- 作者: 老金
- 发布日期: 2026-09-03
- 标签: 本地大模型, Qwen3, llama.cpp, AI 编程, 小游戏

---

![如何用 Qwen 3.8-27B 做一个能玩的小游戏](https://pic-1258874139.cos.ap-hongkong.myqcloud.com/laojinblog/posts/20260903/00_cover.png)

> 一台 Mac、一个跑在本机的开源模型、一句话提示词,80 分钟后得到一个 737 行、能玩、有音效的 RPG 俄罗斯方块。
> 全程不联网、不花钱、代码不上传。

---

## 先看成果

![方块勇者游戏演示](https://pic-1258874139.cos.ap-hongkong.myqcloud.com/laojinblog/posts/20260903/04_demo.gif)

这是《方块勇者》,一个单文件 HTML 游戏。左边是勇者状态(血量、等级、经验条),中间是棋盘,右边是冒险记录和三个魔法道具。消行能升级、打怪、攒连击,怪物会从左边爬过来扣你血。

几个数字:

| 项目 | 值 |
|---|---|
| 代码量 | 737 行 / 31.5 KB,单个 `.html` 文件 |
| 外部依赖 | 0 —— 没有图片、没有音频文件、没有 CDN |
| 音效 | 全部用浏览器自带的 WebAudio 实时合成 |
| 耗时 | 79 分钟 |
| 花费 | ¥0 |

演示视频里的操作是脚本自动打的(一个简单的方块 AI),不是我手玩的 —— 40 秒拿到 21,264 分、消 39 行、升到 6 级、打死 12 只怪。

---

## 要准备的三样东西

你在自己电脑上跑一个开源大模型,再给它装一副手脚:一个能让它读文件、写文件、执行命令的程序。然后你用大白话告诉它要做什么,它自己写代码、自己跑测试、自己改 bug。

- 模型:Qwen3.8-27B,开源,量化后约 17 GB
- 推理引擎:llama.cpp,负责让模型在你的显卡/芯片上跑起来
- harness:pi,一个命令行工具,把只会说话的模型变成会干活的助手

装这套东西本身是另一个话题(参见[另一篇部署文章](/posts/20260826_local_qwen38_27b_pi_llamacpp))。这篇只讲装好之后怎么让它真的给你做出一个游戏。

---

## 这次用的提示词,就一句话

```
开发一个有rpg玩法元素的俄罗斯方块游戏，html格式输出，丰富的动效，游戏可正常运行
```

没有了。没有分点要求,没有技术规格,没有配色说明。

网上教你写提示词的文章通常让你写得越详细越好,所以这可能和你预期的不一样。但我手上正好有一组对照。

几天前失败的那次,我写得详细得多:

```
开发一个有rpg玩法元素的泡泡龙游戏，html格式输出，
要有完整的音乐和音效，丰富的动效，游戏可正常运行
```

结果输出到 33,000 个字的时候被强行截断,前功尽弃。

区别在哪?我认为是三点,按重要性排。

### 选模型"最熟"的题材

俄罗斯方块是编程界被写过最多次的游戏之一。模型在训练时见过成千上万个实现,它知道标准做法:10×20 的棋盘、七种方块、旋转要带"踢墙"、消行要检查整行填满。这些它不用想,直接就能写对。

泡泡龙冷门得多。六边形蜂窝网格的坐标换算、同色连通判定、悬空气泡掉落,每一样它都得现推。同样一句"写个小游戏",难度差了一个数量级。

第一次尝试,选贪吃蛇、俄罗斯方块、打砖块、2048、扫雷这类教科书级的游戏。摸清模型的脾气之后再挑战原创玩法。

### 只加"一层"新东西

"俄罗斯方块 + RPG 元素" 的结构是一个模型闭着眼睛都能写的内核,外面套一层薄薄的新东西。血量、经验、等级这些 RPG 概念本身也很常见,只是拼在一起没见过。

"泡泡龙 + RPG + 完整音乐音效"是三样都要现做。每多一层不确定的东西,一次成功的概率就乘上一个小于 1 的数。


### "游戏可正常运行"这六个字

这不是废话。它给了模型一个可以自己检验的目标。

后面你会看到,正是这句话让它主动去写了测试脚本 —— 只说"做个游戏",模型把代码交出来就算完成了,加上"可正常运行",它就得想办法证明这一点。

---

## 一个诚实的补充

上面的对比不完全公平。两次之间我还改了配置:

| | 失败那次 | 成功这次 |
|---|---|---|
| 思考模式 | 开(而且是最高档) | 关 |
| 可用上下文 | 32,768 | 73,728 |
| 单次输出上限 | 32,768 | 40,960 |

所以成功既有提示词更聪明的功劳,也有配置终于对了的功劳,我没法把两者的贡献分开。文末附了配置速查表。

其中思考模式关掉这条影响特别大。模型的"思考过程"和"正式回答"共用同一个输出额度,思考得越久,留给代码的空间就越少。失败那次的三万多字里有很大一部分是思考,真正的代码没写完就没额度了。

---

## 最有意思的部分:它自己写了个测试

这是整个过程里我最没想到的一幕。

写完游戏文件之后,模型没有直接说"做完了"。它做了这么一串事:

1. 想了想怎么验证 —— 游戏要在浏览器里跑,可命令行里没有浏览器
2. 于是它自己写了一个 Node.js 脚本,手工造了一套假的 DOM(`document.getElementById` 之类的函数全部自己实现)
3. 把游戏的 JS 代码抠出来,塞进这个假环境里跑
4. 模拟按键,检查方块有没有正确下落、行有没有正确消除、分数有没有正确增加
5. 发现问题 → 回去改游戏文件 → 再跑一遍

它前后写了三版测试脚本(`tetris_test.js` / `test2` / `test3`),因为第一版的假 DOM 造得不够全,游戏代码跑不起来,它又回去补。

```
→ write  tetris_rpg.html            (一次性写出整个游戏)
→ bash   node /tmp/tetris_test.js   (跑自己写的测试)
→ edit   tetris_rpg.html            (根据测试结果改)
→ bash   node /tmp/tetris_test.js   (再跑)
   ...如此往复 40 多轮
```

**这是"手脚"的功劳,不是模型的。** 同一个模型放在普通聊天框里,只能吐给你一段代码,对错全靠你自己试。给了它执行命令的能力之后,它才会开始自我验证。

---

## 完整过程长什么样

```
00:00   我发出那一句话
00:0x   它先看了一眼目录里有什么(ls)
        ↓
        一次性写出完整游戏文件(输出 11,746 个 token)
        ↓
        改粒子特效的小 bug(edit)
        ↓
        写第一版测试脚本 → 跑 → 假 DOM 不够用 → 补
        ↓
        第二、三版测试脚本,逐个验证:
        方块下落 / 碰撞 / 消行 / 计分 / 怪物生成 / 技能冷却
        ↓
        [中途上下文满了,自动压缩了一次:32,129 → 8,430]
        ↓
        最后跑一次整体检查
01:19   完成
```

一共约 45 轮工具调用。绝大多数是小改动,只有第一次是"整个文件写出来",之后都是精确替换某几行。

这个模式很重要。本地模型每秒只能吐十几个字,重写整个文件要 20 分钟,改几行只要几十秒 —— 让它"改"而不是"重写",效率差几十倍。

中间那次自动压缩是上下文管理插件干的活:聊天记录太长时,它把早期内容压成摘要,腾出空间继续干。

---

## 会踩到的三个坑

### 写着写着突然断了,提示 "Response was truncated"

单次回答有长度上限,游戏代码超了。

**关掉思考模式**,立刻释放出一大半额度,这是性价比最高的一招。然后在提示词里给出体量预算,直接写"全文控制在 800 行以内"——模型不知道自己的上限,你不说它就当自己有无限空间。


还有一条:要求它用工具写文件,不要把代码贴在回复里。贴在回复里,一截断就全丢;写进文件,至少还剩个半成品能接着改。

### 提示 "exceeds the available context size"

聊天记录 + 新回答超过了模型能记住的总量。把可用上下文调大就行,但要注意一个容易忽略的算式:

```
历史记录上限  +  单次输出上限  ≤  模型总上下文
```

这三个数必须自洽。我第一次踩坑就是因为把单次输出调大了,却没同步调整"什么时候开始压缩历史",结果压缩程序自己的请求都塞不下,压缩也失败了。

### 等了很久,结果不能玩

模型没有验证过自己的代码。

在提示词里明确写"游戏可正常运行",并确保你的工具允许它执行命令。它会自己想办法验证,就像上面那个自造 DOM 的例子。

---

## 想自己试的话

如果你已经装好了本地模型和 harness,直接试这一句:

```
开发一个有rpg玩法元素的俄罗斯方块游戏，html格式输出，丰富的动效，游戏可正常运行
```

想换个题材,套这个模板:

```
开发一个 [经典游戏名] 游戏，加入 [一层新元素]，
html 格式输出，丰富的动效,游戏可正常运行。
全文控制在 800 行以内。
```

把 `[经典游戏名]` 换成贪吃蛇、打砖块、2048、扫雷;`[一层新元素]` 换成 RPG 升级、无尽模式、道具系统。**一次只换一样。**

然后去泡杯咖啡。回来的时候,大概率已经能玩了。

---
