这是一个完全基于 TypeScript 类型系统实现的“推箱子”游戏。它不包含任何运行时的 JavaScript 逻辑,所有的游戏逻辑、地图渲染和胜负判定均在编译期的类型检查阶段完成。
| 符号 | 含义 |
|---|---|
👾 |
主角 (Player) |
👽 |
主角站在目标点上 (Player on Target) |
😃 |
箱子 (Box) |
😎 |
箱子压在目标点上 (Box on Target) |
🕶️ |
目标点 (Target) |
🎇 |
墙壁 (Wall) |
🌑 |
空地 (Floor) |
游戏通过 TypeScript 的属性访问(Dot Notation)进行。在 src/index.ts 中,你可以通过连续的点操作来控制主角移动:
- 选择关卡:使用
.stage1到.stage100。 - 移动控制:
.w: 向上移动.s: 向下移动.a: 向左移动.d: 向右移动
- 查看画面:在移动指令后添加
.over,IDE 的类型提示(Hover)将显示当前地图的字符串渲染结果。 - 通关判定:当关卡内所有箱子都推到目标点上(即地图中不再包含
😃符号)时,类型系统会开放访问.GameClear.WoW.MuchFun。
TypeGame
.stage1 // 进入第一关
.s.d.d.over // 向下走一步,向右走两步,然后观察地图游戏的核心逻辑封装在 Step 类型中。它根据当前格子的类型以及移动方向上前后各两个格子的状态(prev2, prev1, next1, next2),决定当前格子在下一回合应该变成什么。
为了简化逻辑,系统只编写了“向左移动”的判断代码。对于上、下、右移动,系统先通过 MatrixRotateAndScale 类型对二维数组(矩阵)进行旋转/转置,将其转化为向左移动的问题,处理完后再旋转回原位。
Join: 将元组类型的单行符号连接成一个长字符串。Render: 将二维数组转化为嵌套的对象结构,以便在 IDE 的类型预览中以多行字符串的形式展现地图。
- 建议使用 VSCode。
- 确保 TypeScript 版本在 4.1 以上(支持 Template Literal Types)。
- 在
src/index.ts中将鼠标悬停在.over属性上即可看到实时渲染的游戏画面。