3

我试图占据一个位置(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) 位置。谢谢!

4

1 回答 1

2

您的代码不起作用的原因是它永远不会改变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 的绝佳语言。

于 2020-12-20T14:14:09.947 回答