我正在使用Graphics.gloss开发一款在Haskell中制作的小行星游戏。现在我已经为这样的小行星定义了一个数据类型:
data Asteroid = Asteroid { asteroidPos:: Point,
asteroidVel :: Vector,
asteroidSize :: Float }
因此它有一个由一个点定义的位置,一个由矢量定义的速度和它的大小。现在我想知道如何为这个数据类型编写一个Random实例,以便随机时间出现一个新的小行星,在一个随机速度的随机位置。有谁知道我怎么能做到这一点?
答案 0 :(得分:1)
Random
已经有Float
个实例。假设您还有Random
和Vector
的{{1}}个实例,您可以使用它们为Point
定义Random
个实例:
Asteroid
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
这样复杂值的有意义范围,我会留给您;在这里,我只是假设你可以传递一个低和高Asteroid
值。
第一步是通过调用Asteroid
使用Random
的基础Point
实例。 randomR
是随机生成的p
值,Point
是要使用的下一个随机生成器值。
同样,g1
是一个随机生成的v
值,由Vector
的基础实例生成。
最后,Vector
是由s
为Float
生成的randomR
。
返回值是由Float
,Asteroid
和p
以及最新生成器v
组成的新s
值。
g3
的实施遵循相同的模板。
您可以使用更好的形式编写此代码。使用random
,但对于初学者,我将代码保留为原始格式以显示其工作原理。