如何让一个元组给出一个随机的新元组?

问题描述

我正在尝试占据一个位置 (a,b) 并通过代码接收一个随机的新位置 (a,b)。我在实现代码时遇到了很大的麻烦,我得到的是迄今为止我最好的尝试。 .

type Teleport (a,b) = 
    inherit Item (a,b,' ',Color.White,Color.White)
    override this.FullyOccupy() = true
    override this.InteractWith (p: Player) =
        let mutable posX = p.X
        let mutable posY = p.Y
        let rand = System.Random()
        posX <- rand.Next()
        posY <- rand.Next()

有人可以解释为什么它不起作用吗?

它应该在游戏中用作传送器,如果玩家移动到第一个 (a,b) 应该被传送到一个新的(随机)(a,b) 位置。 谢谢!

解决方法

您的代码不起作用的原因是它永远不会改变 Player 的位置; InteractWith 只是将位置复制到两个局部变量中,然后更新它们。

这就是说,如果您想学习 F#,我强烈建议您不要以 OO 风格进行编程 - 您会更喜欢采用函数式风格。

函数式编程 (FP) 的标志之一是不变性。对于你的传送对象,这意味着不要改变 Player 的位置,而是用新位置创建一个新玩家。

尝试以下行

type Player = { X: int; Y: int; Name: string }

let teleport player =
    let rand = System.Random()
    { player with X = rand.Next 100
                  Y = rand.Next 100 }

另外,尽量不要用一个类来解决每一个问题,而是用一个函数;在上面,teleport 只是一个函数 Player -> Player

我真的希望你会喜欢 F#;这是一种在 .NET 上进行 FP 的绝佳语言。