函数式编程实践
游戏逻辑使用 PureScript 编写,充分利用了函数式编程的类型系统和组合能力。变换器本身就是函数,玩家在游戏过程中实际上是在进行函数组合。
cube-composer · sharkdp/cube-composer
一款受函数式编程启发的浏览器解谜游戏,使用 PureScript 编写。玩家通过组合变换器(transformer,类似函数)来改变立方体图案并通关;关卡按章节组织,每个章节在 src/Levels/ 下对应一个文件,并提供该章可用的变换器列表,例如 "map...
Cube Composer(立方体合成器)是一款以函数式编程思想为灵感的浏览器解谜游戏,使用 PureScript 编写。玩家需要组合各种变换器(transformer,类似函数)来改变立方体图案,使其与目标图案一致,从而通过关卡。游戏将函数式编程中的映射、替换等概念具象化为可操作的变换器,让玩家在解谜过程中直观感受函数组合的威力。
README 提供了在线游玩链接,也可以按照本地安装步骤在浏览器中运行。
游戏的核心机制围绕“变换器”展开。每个章节会提供一组特定的变换器,例如 map {Yellow}↦{Red} 表示将所有黄色立方体替换为红色。玩家需要从初始图案出发,通过按顺序应用变换器,最终得到目标图案。
关卡按章节组织,每个章节在 src/Levels/ 目录下对应一个文件,并在 Levels.purs 的 allChapters 列表中注册。每个关卡包含以下信息:
name:关卡标题help:右侧面板显示的帮助文本difficulty:难度等级(Easy、Medium 或 Hard)initial:初始立方体二维数组(Wall 类型)target:目标立方体二维数组变换器在章节文件中定义,例如:
"replaceYbyR" :> {
name: "map {Yellow}↦{Red}",
function: replaceSingle Yellow Red
}
其中 replaceYbyR 是内部 ID,name 是显示名称({x} 会替换为对应颜色的小立方体图标),function 是类型为 Transformer 的函数。Transformer 的定义为:
type Stack = List Cube
type Wall = List Stack
type Transformer = Wall -> Wall
即变换器是一个将 Wall(立方体的二维数组)映射为新 Wall 的函数。一些基础变换器在 Transformer.purs 中提供。
游戏逻辑使用 PureScript 编写,充分利用了函数式编程的类型系统和组合能力。变换器本身就是函数,玩家在游戏过程中实际上是在进行函数组合。
关卡和变换器以记录(record)形式定义,结构清晰,便于扩展和修改。
项目提供了命令行工具,可以列出所有关卡及其最短解法,方便验证新关卡的可解性和唯一性。
按照 README 的步骤,可以在本地运行游戏:
git clone https://github.com/sharkdp/cube-composer.git
cd cube-composer
npm install
bower install
gulp
如果没有错误发生,用浏览器打开 index.html 即可开始游戏。
如果你想为游戏添加新谜题,可以按照以下流程:
src/Levels/ 下复制一个现有章节文件,修改章节编号,并将其添加到 Levels.purs 的 allChapters 列表中。gulp prod
node dist/cli.js
欢迎通过 Pull Request 提交你的谜题。
README 中包含 Travis CI 的构建状态徽章,表明项目使用持续集成进行自动化构建。
《Dead Ascend》是一款手绘风格的 2D 点击式(point-and-click)冒险解谜游戏...
micropolisJS 是把 Micropolis(开源版《模拟城市》类城市模拟游戏)移植到 J...
NBlood 是用 EDuke32 引擎技术与开发思路对 Build 引擎游戏所做的逆向工程移...
CatacombGL 是 Catacomb 3D 与 Catacomb 冒险三部曲(Abyss、Armageddon、Apo...