<!-- title: 《battle-city》1985年的坦克，装进TypeScript -->
<!-- domain: games -->
<!-- repo: shinima/battle-city -->

**仓库档案**

- 仓库：[shinima/battle-city](https://github.com/shinima/battle-city)
- 作者：shinima，个人开发者，前端的正职，做这个项目属于典型的工作之外造玩具
- 语言：TypeScript，界面壳子用了 React，游戏本体是 Canvas 手绘，全程没有游戏引擎
- ⭐Star：数千量级（据仓库页面）
- 形态：FC 经典《坦克大战》的开源复刻，关卡、道具、基地玩法完整还原，代码量小、依赖极少，一个下午能把源码通读一遍
- 在线试玩：shinima.pw/battle-city（据仓库 README），打开浏览器就能玩

**这游戏是什么**

一句话说清：你开一辆小坦克，在一张布满砖墙的战场上，一边消灭所有敌方坦克，一边守住自己基地里那只老鹰——老鹰中一发炮弹，直接GameOver。这就是1985年南梦宫在红白机上出的《坦克大战》（Battle City），而 battle-city 这个仓库，是它的一次忠实开源复刻。

它的规则简单到用一分钟就能讲完：坦克会开炮，砖墙能被轰碎，钢墙打不穿（除非你满级），水挡车不挡子弹，草丛藏车身，冰面会打滑。敌人从地图上方三个口刷新，一波接一波，全灭敌坦克过关；地图下方基地被击中，全局失败。就这么点东西，1985年卖了几百万份卡带，2026年放在浏览器里照样让人一坐一下午。

它的核心循环长这样：

```mermaid
flowchart LR
    A[进入关卡] --> B[侦察地形与敌人刷新口]
    B --> C[开火 拆墙 击毁坦克]
    C --> D{掉落道具?}
    D -- 是 --> E[拾取: 手雷 计时 铁锹 头盔 五角星]
    D -- 否 --> F[回防基地老鹰]
    E --> F
    F --> G{敌坦克清空?}
    G -- 否 --> B
    G -- 是 --> H[过关结算 进入下一关]
    H --> I[敌人更快更硬 阵型更刁]
    I --> A
    F -- 老鹰被毁或命尽 --> J[失败 从当前进度重来]
    J --> A
```

这个循环最妙的地方在于“攻”和“守”是两条互相拉扯的线：你想冲出去拆坦克，就得离开基地；你一离开，家里那只一动不动的老鹰就暴露在火力之下。玩家每一秒都在做取舍，这就是它四十年不过时的根。

**为什么上头**

第一，即时反馈密到没有空隙。开炮有弹道、命中砖墙有碎块、击毁敌坦克有爆炸动画加原地残骸，短促的音效每一发都跟着。 FC 时代的游戏早就把“操作后0.1秒内给反馈”这条刻进了骨头里，复刻版原样继承。你在屏幕上做的任何一次输入，都会立刻看到一个可见结果，大脑不需要等，自然不愿意停。

第二，双线目标制造持续张力。纯打枪的游戏会腻，纯塔防的游戏会困，坦克大战把两者焊在一起：出门是进攻游戏，回防是防守游戏。敌人刷新口固定在上方，但刷出来的时机和路线有随机性，你永远不能把注意力完全放在一件事上。这种“两头都要顾”的轻度焦虑感，正是心流最舒服的区间——比玩家水平高半档，又不至于绝望。

第三，随机道具掉落，一局里塞进抽奖。敌坦克被击毁时有概率掉出闪烁的道具：手雷把全屏敌人清空，计时让所有敌人定住几秒，铁锹把基地围墙升级成钢墙，头盔给你套一层无敌，五角星给坦克升级——吃一颗能发双弹，吃满能把钢墙都轰穿。掉什么、什么时候掉，全凭随机。于是每一局都有“这把能不能出个手雷翻盘”的期待感，这就是最原始的随机奖励设计，和今天所有roguelite里“三选一”的爽点是同一个东西。

第四，死亡成本低，重开成本更低。死了不是回菜单，是原地补一辆新车，命条扣一格；只要老鹰还活着，局势就还有救。失败不产生挫败堆积，只产生“就差一点”的不甘——再来一局的钩子全挂在这里。对个人开发者来说这是最值得抄的一条：别惩罚失败，让失败变得便宜。

第五，进度感落在关卡数字上。经典版三十五关，敌人型号四种、随关卡数变强，过关有结算画面。玩家对“我打到第几关了”有清晰的坐标，社交场合还能比一句“你打到哪了”。简单，但缺了它留存会掉一半。

**技术拆解**

这个仓库对开发者最友好的地方，是它证明了“做游戏不需要先学引擎”。

技术栈是 TypeScript + React + Canvas，没有引入任何游戏引擎。游戏世界里的每一个东西——玩家坦克、敌坦克、子弹、砖块、道具——都是一个带类型的实体对象，游戏主循环就是固定节奏地跑一遍“更新逻辑、重绘画面”。UI 层（菜单、选关、结算）交给 React，游戏画面本身由 Canvas 逐帧绘制，两层互不打架。这个“React 管壳、Canvas 管芯”的分层，是今天几乎所有 H5 小游戏的标准架构，在这里能看到一个最小可用的范本。

几个可以直接抄走的组件思路：

1. **关卡即配置**。地图不是一个画死的数组，而是一份数据文件：哪里摆砖、哪里摆钢、敌人几种各几个、从哪个口刷。想加一关就是加一份配置，想换皮就是换一份贴图。做任何关卡制小游戏，先把这个骨架搭出来，内容生产就变成了填表。
2. **地形瓦片与破坏系统**。砖墙按小块瓦片组织，炮弹命中就扣掉对应瓦片，墙会被一发一发轰出豁口。这套“可破坏瓦片地图”的实现不到几百行，直接能搬去任何射击、爆炸类游戏。
3. **敌人AI是最小状态机**。敌坦克的行为就是简单的状态切换：朝随机方向走、撞墙换向、视野里出现玩家或基地就朝那个方向开炮。没有寻路算法，没有行为树，效果已经足够“像有智能”。个人开发者的AI对手，起步阶段用状态机就够了，别一上来就A*。
4. **碰撞检测是矩形相交**。坦克、子弹、墙体全是矩形，碰撞就是判断两个矩形是否重叠，子弹打中砖块再细分到瓦片。没有任何物理库。绝大多数2D小游戏需要的物理就这么点。

读源码的顺序建议：先看关卡配置文件，搞懂一关是怎么被描述的；再找游戏主循环，看实体如何被更新和绘制；最后看敌坦克的状态机。一天就能读完，读完你就拥有了一个能改的2D游戏骨架。

**变现观察**

仓库本身没有任何变现痕迹，作者做它是练手加怀旧，License 开放，代码随便看随便学。但这个选题背后的赛道，变现路径其实早就被验证过了，只是有两条红线要认清。

第一条红线是IP。坦克大战这个名称和原版美术素材属于南梦宫，复刻仓库用来学习、演示、写教程没有任何问题，但要拿去赚钱，直接商用名称和原版素材是有法律风险的。实操里的通行做法是“换皮改名”：玩法机制不受版权保护，把坦克换成机甲、扫地机器人、太空车，把贴图全部重画，名字别带“坦克大战”四个字，它就是一个可以上架的新游戏。小游戏平台上那一大批坦克类变体，走的全是这条路。

第二条是渠道选择。这类游戏的量级，适合的变现方式按优先级排：

1. **微信小游戏/H5平台广告**：这是最匹配的渠道。单机、短局、随手玩，插屏和Banner广告的填充场景天然多，开发成本几乎为零。坦克品类在小游戏平台经久不衰，用户教育是四十年前完成的，你不需要教玩家怎么玩。
2. **itch.io 付费或打赏**：像素复古风在这有稳定受众，定1-3美元或免费加打赏，赚不了大钱但能验证完成度。
3. **Steam 复古合集**：把复刻玩法做厚——更多关卡、编辑器、联机——再考虑，工作量会翻几倍，属于后期选项。

另外别忘了教程变现这条路。这类“引擎-free复刻经典”的仓库本身就是极好的教学内容，源码导读、TypeScript游戏开发实战，都是能吸引技术流读者的题目。游戏不赚钱的时候，讲解游戏的文章和课程可能先赚钱。

**给我的灵感**

1. **换皮直出，两周上小游戏平台。** Fork 他的状态机和瓦片碰撞骨架，只换三样东西：美术（机甲风或动物风）、关卡（先做15关）、音效。加一个接入广告SDK的壳。MVP工作量约1-2周，全职做可压缩到一周。变现走小游戏平台广告，这是投入产出比最稳的一条。适合人群：会前端、想快速跑通“上架-放量-看广告收益”全流程的人。
2. **给坦克大战加一个肉鸽钩子。** 在过关结算处加“三选一道具”——比如三张牌：穿甲弹、双倍射速、基地护盾，选一张带入下一关；再把35关的线性结构改成无尽模式，每5关难度上台阶。这是把1985年的关卡制，嫁接到《吸血鬼幸存者》之后的build构筑潮流上，玩家每一局的发展路线都不一样。额外工作量约一周，变现方式不变，但留存和分享率会明显变好——构筑组合是玩家最爱晒图的东西。
3. **每日一关挑战版。** 每天固定一个关卡种子，全服玩家打同一张图，比通关用时或击毁数，做一张好友排行榜。开发量很小（种子固定+一张榜），但把单机游戏变成了社交货币，“今天这关好阴间”就是天然的转发文案。适合和小游戏广告搭配，靠传播拉量。

三个点子可以叠加，但别一次全做：先换皮上线验证基本盘，再加三选一看留存，最后上每日挑战拉传播。

**上手**

- 仓库：<https://github.com/shinima/battle-city>
- 在线试玩：shinima.pw/battle-city（据仓库 README）
- 本地跑：克隆仓库后 `npm install`、`npm start`（以 README 为准），任意现代浏览器打开即可
- 改造路径：先读关卡配置，再读主循环与渲染，最后改敌坦克AI——改完这三个地方，它就不再是一个复刻，而是你的游戏了

> [!tip] 51学通信知识星球
> **星主：爱卫生**（微信：gprshome201101）——公众号「51学通信」创办者，19 年通信行业运维与讲师经验，著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书（各大电商平台有售）。
> **星球定位**：深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域，主打运维岗位与信令分析。
> **当前规模**：5200 篇主题 / 990 个回答，198 元/年。
> **加入福利**：加入星球后请加爱卫生微信，拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题，另有群内分享。
> **AI 加持**：51学通信知识星球已作为 skill 接入 WorkBuddy，使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例，做总结、找文档和 PPT 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
