haskell自身数据类型的随机实例
我正在用Graphics.gloss制作Haskell制作的小行星游戏。现在我为小行星定义了一个数据类型,如下所示:haskell自身数据类型的随机实例,haskell,random,instance,gloss,Haskell,Random,Instance,Gloss,我正在用Graphics.gloss制作Haskell制作的小行星游戏。现在我为小行星定义了一个数据类型,如下所示: data Asteroid = Asteroid { asteroidPos:: Point, asteroidVel :: Vector, asteroidSize :: Float } 所以它有一个由点定义的位置,一个由向量定义的速度和它的大小。现
data Asteroid = Asteroid { asteroidPos:: Point,
asteroidVel :: Vector,
asteroidSize :: Float }
所以它有一个由点定义的位置,一个由向量定义的速度和它的大小。现在我想知道如何为这个数据类型编写一个随机的实例,这样一个新的小行星就会在一个随机的时间,在一个随机的地方以随机的速度出现。有人知道我是如何做到这一点的吗?已经有了
Random
的Float
实例。假设您还有矢量和点的随机实例,您可以使用它们来定义小行星的随机实例:
instance Random Asteroid where
randomR (Asteroid pl vl sl, Asteroid ph vh sh) g =
let (p, g1) = randomR (pl, ph) g
(v, g2) = randomR (vl, vh) g1
(s, g3) = randomR (sl, sh) g2
in (Asteroid p v s, g3)
random g =
let (p, g1) = random g
(v, g2) = random g1
(s, g3) = random g2
in (Asteroid p v s, g3)
randomR
函数取值范围从最小值(低)到最大值(高)。你如何定义一个有意义的复杂值范围,比如小行星,我将留给你;在这里,我只是假设你可以通过一个高低小行星值
第一步通过调用randomR
为点使用基础Random
实例p
是随机生成的点
值,g1
是下一个要使用的随机生成器值
类似地,v
是由Vector
的底层实例生成的随机生成的Vector
值
最后,s
是由randomR
为Float
生成的Float
返回值是一个新的小行星值,由p
、v
和s
组成,加上最近的生成器g3
random
的实现遵循相同的模板
您可以使用更漂亮的形式编写此代码,例如使用MonadRandom
,但对于初学者,我将代码保留为原始形式以显示其工作原理。。您是否尝试编写此实例?你发现了什么问题?你看了吗?你能展示一下你在为你的小行星数据类型实现Random
接口方面所做的努力吗。“在随机时间”不能很好地表示为Random
实例。你是用函数式的反应式编程风格,还是用传统的“命令式循环”来编写游戏?在前一种情况下,您只需生成一个具有相等分布输入时间值的有序列表。否则,每当小行星出现时,你就必须从指数分布中抽出一个时间间隔,然后等待这个时间再生成下一个。