使用Clojure和Gorilla REPL构建更好的棋盘游戏

不久前,我和我六岁的女儿正值我们常规的爸爸女儿约会之夜,当时我们决定创建棋盘游戏。 我们坐在餐厅的桌子旁,桌子上放着纸,蜡笔和一小堆的龙与地下城小饰品。 令我惊讶的是,我们开发了一个有趣的小游戏,我的女儿叫Turtle Burglars

第二天,我决定将游戏打印并装箱作为礼物。 在设计游戏时,我们玩了很多次。 每次我们玩时,我们都会调整数字,划掉一些东西并添加新的规则。 但是,如果我要打印游戏,则需要确定确切的值,这将是公平而有趣的。 因此,我决定建立一个可以运行数千次以验证假设的模型。

在介绍这些内容之前,让我们先看一下Turtle Burglars的规则。

游戏

  • 目标:越过终点线,赢得一些代币。
  • 行动:每个玩家通过掷骰子来移动。
  • 落在一个数字上:丢掉那个数字令牌。
  • 坐牢:掉头。
  • 抢断:摔死并从任何玩家那里抢走那么多代币。
  • 停在捷径上:决定下一轮是否要支付一定数量的代币以采用该路径。

该模型

游戏很简单,但是我想验证一些假设,例如:

  • 失去转弯会导致您输掉比赛吗?
  • 玩家是否需要第二圈?
  • 完成游戏需要多少个代币?
  • 快捷方式应花费多少代币?
  • 快捷方式应绕过多少个正方形?

我首先转向Ruby构建可以玩Turtle Burglars游戏的代码模型。 该代码约为200 LOC,并且没有明确的方法来开始汇总有关游戏的结果。 我当然可以继续前进,但是一位同事(Eric)建议Mark Ba​​stian进行Clojure演讲,这使我的第一种方法脱轨。 如果您不熟悉函数式编程,我强烈建议您观看此演讲。

在演讲中,Mark在描述面向数据的应用程序的面向对象设计与功能编程设计的不同方法方面做得非常出色。 在他的例子中,他实际上在Clojure中建立了一个棋盘游戏! 我认为Turtle Burglars将是Clojure的理想学习场所(确实如此)。

埃里克(Eric)还教了我一个叫做Gorilla REPL的简洁工具。 Gorilla是一个浏览器内REPL,可以进行基本图表绘制。 它还可以存储命令和图表以供以后使用。

滚动到底部以查看建模的Clojure代码。
您还可以通过Gorilla以PDF形式查看我的Turtle Burglars库的示例用法。

结果

现在,使用Clojure模型和Gorilla,我可以在几秒钟内运行10,000场游戏,并快速分析结果。 不出所料,我们最初开始的数字几乎没有造成第二圈,并且强烈强调不要采用捷径。 我们还发现,无论谁先行都有巨大的优势,因此我们为先行者加了一点罚款。 通过调整棋盘数量/筹码数量/获胜条件,我们在打印之前就构建了我们想要的游戏。 谢谢,Clojure /大猩猩!

我强烈建议使用这些工具来建模和验证任何系统,而不仅仅是您的棋盘游戏。 我在下面包括了Turtle Burglars的Clojure库。 这远不是完美的,因为这是我的第一个Clojure项目,但我希望它可以帮助显示在Clojure中对复杂系统进行建模的难易程度,以及使用Gorilla分析该模型的信息量。

 请参阅完整文章中的代码。