1

我正在使用 Graphics.gloss 在 Haskell 中制作 Asteroid 游戏。现在我已经为这样的小行星定义了一个数据类型:

data Asteroid = Asteroid {   asteroidPos:: Point, 
                             asteroidVel   :: Vector,
                             asteroidSize  :: Float }

所以它有一个由一个点定义的位置,一个由向量​​定义的速度和它的大小。现在我想知道如何为这种数据类型编写一个 Random 实例,以便一个新的小行星以随机速度出现在随机时间、随机位置。有谁知道我怎么能做到这一点?

4

1 回答 1

1

已经RandomFloat. 假设您还有和的Random实例,您可以使用它们来定义 的实例:VectorPointRandomAsteroid

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实例。是一个随机生成的值,是下一个要使用的随机生成器值。PointrandomRpPointg1

同样,v是一个随机生成的Vector值,由 的基础实例生成Vector

最后,s是由forFloat生成的。randomRFloat

返回值是Asteroid由 、 和 加上最新的生成器组成pvsg3

的实现random遵循相同的模板。

您可以用更漂亮的形式编写此代码,例如使用 using MonadRandom,但对于初学者,我将代码保留为原始形式以显示其工作原理。

于 2017-11-07T20:23:05.373 回答