scala - 使用 Scala 在功能上生成游戏 Action

标签 scala functional-programming

我试图理解使用 Scala 在功能上编写策略游戏,但不幸的是我似乎被困在了非常基础的地方。 (这不是家庭作业,而是我尝试学习新东西,即“纯”函数式编程。)

让我们进行以下简单的“游戏”:(唯一)玩家在一排无穷无尽的方格上拥有 x 个相同的棋子。棋子从第 0 格开始,每转一圈,他可以将棋子向前移动一格。

作为数据结构,我将使用 List[Int]每个项目是一件的位置(正方形)。

为了产生我想出的可能的 Action :

def moves(start: List[Int]) = 
    (0 until start.length).map({i => start.updated(i, start(i) + 1)});

val m1 = moves(List(0,0,0))
// m1 then contains Vector(List(1, 0, 0), List(0, 1, 0), List(0, 0, 1))

val m2 = moves(List(1,2,3))
// m1 then contains Vector(List(2, 2, 3), List(1, 3, 3), List(1, 2, 4))

我不喜欢使用索引循环 (0 until start.length) .它对我来说似乎不是很“实用”。这是正确的方法还是有更好的方法?

现在在我的游戏示例中,所有棋子都是相同的,所以在 m1 的情况下所有三个可能的 Action 也是相同的,可以/应该浓缩为一个 Action 。我修改了 moves对每个移动项目进行排序,以便我可以获得不同项目的列表:
def moves(start: List[Int]) = 
    (0 until start.length).map({i => start.updated(i, start(i) + 1).sorted}).distinct;

val m1 = moves(List(0,0,0))
// m1 then contains Vector(List(0, 0, 1))

val m2 = moves(List(1,2,3))
// m1 then contains Vector(List(2, 2, 3), List(1, 3, 3), List(1, 2, 4))

然而,这要求数据结构是可排序的,并且在我的“真实”应用程序中,它很可能不是 List[Int] ,但是一个元组或一个案例类。我想我需要的是一个 distinct方法,它采用一个定义相等的函数。我将如何实现?

最佳答案

如果你的部分是相同的,我认为你有错误的数据结构。您需要一个 Map[Int,Int] ,其中键告诉您正方形的索引,值告诉您有多少块(没有默认计数集,否则会更容易)。然后

def moves(start: Map[Int,Int]) = start.keySet.map(k => {
  val n = start(k)
  val pickup = (if (n == 1) (start - k) else start + (k -> (n-1)))
  pickup + ((k+1) -> (start.getOrElse(k+1, 0) + 1))
})

这解决了您的玩具示例中的所有问题(但可能不是您的真实示例)。它组合得很好:
scala> val firstmoves = moves(Map(0->3))                          
firstmoves: scala.collection.Set[scala.collection.immutable.Map[Int,Int]] =
Set(Map((0,2), (1,1)))

scala> val secondmoves = firstmoves.flatMap(moves)                           
secondmoves: scala.collection.Set[scala.collection.immutable.Map[Int,Int]] =
Set(Map((0,1), (1,2)), Map((0,2), (2,1)))

scala> val thirdmoves = secondmoves.flatMap(moves)
thirdmoves: scala.collection.Set[scala.collection.immutable.Map[Int,Int]] =
Set(Map((1,3)), Map((0,1), (1,1), (2,1)), Map((0,2), (3,1)))

关于scala - 使用 Scala 在功能上生成游戏 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5474423/

相关文章:

javascript - 如何柯里化(Currying)一个以选项对象作为参数而不是几个不同参数的函数?

python - 如何在 python 中以函数方式生成三角形数字列表?

scala - 来自foreach的短路功能

design-patterns - 如何在 Clojure 中构造复杂的 "state updating functions"?

C++ Lambdas : function that returns a function that returns a function . ..?

json - 如何使用Spark Scala读取特定格式的Json文件?

scala - 将 Phantom 2 与现有的 Cassandra session 一起使用

scala - 验证数字序列是否在允许的范围内

scala.tools.nsc.interpreter 内存泄漏

scala - 为什么 Scala 中的高阶统一被认为是部分的?