Skip to content

fc01/TypeGame

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TypeSokoban

English | 日本語 | 한국어

这是一个完全基于 TypeScript 类型系统实现的“推箱子”游戏。它不包含任何运行时的 JavaScript 逻辑,所有的游戏逻辑、地图渲染和胜负判定均在编译期的类型检查阶段完成。

游戏符号说明

符号 含义
👾 主角 (Player)
👽 主角站在目标点上 (Player on Target)
😃 箱子 (Box)
😎 箱子压在目标点上 (Box on Target)
🕶️ 目标点 (Target)
🎇 墙壁 (Wall)
🌑 空地 (Floor)

如何玩游戏

游戏通过 TypeScript 的属性访问(Dot Notation)进行。在 src/index.ts 中,你可以通过连续的点操作来控制主角移动:

  1. 选择关卡:使用 .stage1.stage100
  2. 移动控制
    • .w: 向上移动
    • .s: 向下移动
    • .a: 向左移动
    • .d: 向右移动
  3. 查看画面:在移动指令后添加 .over,IDE 的类型提示(Hover)将显示当前地图的字符串渲染结果。
  4. 通关判定:当关卡内所有箱子都推到目标点上(即地图中不再包含 😃 符号)时,类型系统会开放访问 .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 属性上即可看到实时渲染的游戏画面。

Releases

No releases published

Packages

 
 
 

Contributors