使用Scala在功能上生成游戏移动
发布时间:2020-12-16 09:57:09 所属栏目:安全 来源:网络整理
导读:我试图理解在功能上使用 Scala编写策略游戏,但不幸的是我似乎陷入了基础. (这不是家庭作业,而是我尝试学习新东西,即“纯粹的”功能编程.) 让我们采取以下简单的“游戏”:(唯一)玩家在无穷无尽的方块上有x个相同的棋子.棋子从方块0开始,每转一圈,他可以向前
我试图理解在功能上使用
Scala编写策略游戏,但不幸的是我似乎陷入了基础. (这不是家庭作业,而是我尝试学习新东西,即“纯粹的”功能编程.)
让我们采取以下简单的“游戏”:(唯一)玩家在无穷无尽的方块上有x个相同的棋子.棋子从方块0开始,每转一圈,他可以向前移动一个方格. 作为数据结构,我将使用List [Int],每个项目是一件的位置(正方形). 为了产生可能的动作,我提出了: def moves(start: List[Int]) = (0 until start.length).map({i => start.updated(i,start(i) + 1)}); val m1 = moves(List(0,0)) // m1 then contains Vector(List(1,0),List(0,1,1)) val m2 = moves(List(1,2,3)) // m1 then contains Vector(List(2,3),List(1,3,4)) 我不喜欢的是使用索引循环(0直到start.length).它对我来说似乎不太“功能”.这是正确的方法吗?还是有更好的方法? 现在在我的游戏示例中,所有部分都是相同的,因此在m1的情况下,所有三个可能的移动也是相同的,并且可以/应该被压缩成一个移动.我修改了移动来对每个移动项进行排序,这样我就可以获得不同项的列表: 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)) // m1 then contains Vector(List(0,4)) 然而,这要求数据结构是可排序的,并且在我的“真实”应用程序中,它很可能不是List [Int],而是元组或案例类.我想我需要的是一个独特的方法,它采用定义相等的函数.我该如何实现? 解决方法
如果你的作品相同,我认为你的数据结构错误了.你想要一个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,1),2)),Map((0,(2,1))) scala> val thirdmoves = secondmoves.flatMap(moves) thirdmoves: scala.collection.Set[scala.collection.immutable.Map[Int,Int]] = Set(Map((1,3)),1)),(3,1))) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |