加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用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)))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读