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

How to make a tuple give a random new tuple?

提问人:user14807375 提问时间:12/19/2020 最后编辑:Turing85user14807375 更新时间:5/1/2022 访问量:178

问:

我正在尝试采取一个位置(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)位置。 谢谢!

随机 f# 可变

评论

2赞 Scott Hutchinson 12/19/2020
欢迎来到 F# 社区。您需要移出方法,因为每次调用方法时,它可能都在初始化相同的随机序列。此外,和 变量可能没有帮助。let rand = System.Random()InteractWithInteractWithposXposY
0赞 Arshia001 12/19/2020
欢迎来到 F# 社区!这里有一个一般提示:如果你发现自己在编写面向对象的 F# 代码,并且它不是由于与 C# 或现有库的互操作,那么你就做错了。要么使用 F# 的功能子集(并体验启发!),要么使用像 C# 这样的面向对象语言,这样可以省去一些麻烦。
2赞 Bent Tranberg 12/19/2020
@Arshia001,我相信你错了。F# 是一种多范式语言,而不是纯函数式语言。诚然,它首先是功能性的,至少在细节上是这样。尽管如此,在更高层次上,面向对象编程仍然是 F# 的重要组成部分,尤其是在组织代码方面,并使该语言成为在 .NET 平台上进行有效编程的实用解决方案。
1赞 Ganesh Sittampalam 12/20/2020
@BentTranberg评论可能过于笼统,但至少在这种情况下非常适用。
0赞 Myrddin Krustowski 12/20/2020
@Arshia001。引用 F# 的创建者 Don Syme。“F# 是一种”函数优先“语言,其中函数式编程是用于解决大多数编程问题的首选。然而,F#与许多函数式语言的不同之处在于,它既具有高度的互操作性,又在必要时包含命令式和面向对象(OO)编程。除了能够使用 .net 库之外,F#(和 OCaml)的卖点之一是它们不是纯粹的功能,并且在需要时支持命令式(和 OOP)。

答:

2赞 nilekirk 12/20/2020 #1

你的代码不起作用的原因是它永远不会改变 的位置; 只需将位置复制到两个局部变量中,并更新它们。PlayerInteractWith

话虽如此,如果你想学习 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 }

另外,尽量不要把一个类作为每个问题的解决方案,而要伸手去拿一个函数;在上面,只是一个函数。teleportPlayer -> Player

我真心希望你会喜欢 F#;它是在 .NET 上执行 FP 的绝佳语言。