TypeGame
👾 Sokoban Game in Pure TypeScript Type System
Install / Use
/learn @fc01/TypeGameAbout this skill
Quality Score
0/100
Category
Development & EngineeringSupported Platforms
GitHub Copilot
README
TypeSokoban
这是一个完全基于 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 // 向下走一步,向右走两步,然后观察地图
核心实现原理
1. 状态机 (src/TypeGame.ts)
游戏的核心逻辑封装在 Step 类型中。它根据当前格子的类型以及移动方向上前后各两个格子的状态(prev2, prev1, next1, next2),决定当前格子在下一回合应该变成什么。
2. 坐标变换 (src/utils.ts)
为了简化逻辑,系统只编写了“向左移动”的判断代码。对于上、下、右移动,系统先通过 MatrixRotateAndScale 类型对二维数组(矩阵)进行旋转/转置,将其转化为向左移动的问题,处理完后再旋转回原位。
3. 递归渲染 (src/utils.ts)
Join: 将元组类型的单行符号连接成一个长字符串。Render: 将二维数组转化为嵌套的对象结构,以便在 IDE 的类型预览中以多行字符串的形式展现地图。
开发环境
- 建议使用 VSCode。
- 确保 TypeScript 版本在 4.1 以上(支持 Template Literal Types)。
- 在
src/index.ts中将鼠标悬停在.over属性上即可看到实时渲染的游戏画面。
