我正在尝试使用Scala函数式编写策略游戏,但不幸的是,我好像卡在了非常基础的部分。(这不是家庭作业,而是我尝试学习一些新东西,即“纯”函数式编程。)
让我们来看一个简单的“游戏”:(唯一的)玩家在一排无限的方格上有x个相同的棋子。棋子从第0个方格开始,每次可以将一个棋子向前移动一个方格。
作为数据结构,我将使用一个List[Int],其中每个项都是一个棋子的位置(方格)。
为了生成可能的移动,我想到了以下方法:
我不喜欢使用索引循环
现在在我的游戏示例中,所有棋子都是相同的,因此在情况
让我们来看一个简单的“游戏”:(唯一的)玩家在一排无限的方格上有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,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
中,所有三个可能的移动也是相同的,可以/应该被压缩成一个移动。我修改了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
方法,它接受定义相等性的函数。我该如何实现呢?