如何在这个榆树效果示例中添加第二个骰子?

时间:2016-05-14 13:45:39

标签: elm

我是Elm的新手并且一直在查看以下示例(请注意,这是在较新的0.17架构下,其中Action现在是Command): http://elm-lang.org/examples/random

在示例中添加第二个骰子有一个后续挑战,因此只需单击该按钮就会为每个骰子滚动一个新值。我的想法是改变模型以保存两个单独的值,每个模具一个,ala

type alias Model =
       { dieFace1 : Int
       , dieFace2 : Int
       }

这一切正常,直到我到达更新块。我不知道如何更新随机数生成器来创建两个值。这个功能对我来说有点混乱。

type Msg
  = Roll
  | NewFace Int Int


update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of
    Roll ->
      **(model, Random.generate NewFace (Random.int 1 6))** <-- not sure what to do here

    NewFace newFace1 newFace2 ->
      (Model newFace1 newFace2, Cmd.none)

Random.generate函数的文档有点轻 -

  

生成:(a - &gt; msg) - &gt;发电机a - &gt; Cmd msg

     

创建一个将生成随机值的命令。

这是处理两个骰子的正确方法,还是有更好的方法?我是一个榆树老板,请你好:)

3 个答案:

答案 0 :(得分:17)

Random.int是一个原始生成器,它为您提供单个随机int。你需要一个生成器,它给你两个随机整数。

随机数生成器可以从更原始的生成器构建,以创建更复杂的生成器。幸运的是,Elm只有这样一个函数Random.pair,它允许你为元组的每个部分指定你想要的两个生成器。

让我们将模具生成器拉入自己的功能,以避免重复:

dieGenerator : Random.Generator Int
dieGenerator =
  Random.int 1 6

现在我们可以构建另一个生成器,它为我们提供一对die的随机值:

diePairGenerator : Random.Generator (Int, Int)
diePairGenerator =
  Random.pair dieGenerator dieGenerator

由于我们正在处理一个整数元组,因此我们将Msg NewFace Int Int的定义更新为NewFaces (Int, Int)。这将使您的Roll处理程序变得干净整洁:

Roll ->
  (model, Random.generate NewFaces diePairGenerator)

如果您想尝试超越这一点,请考虑允许任何数量的模具滚动所需的内容。采用从更原始的生成器构建复杂生成器的想法,并使用Random模块的文档作为指南。

答案 1 :(得分:1)

一种方法是使用 // used as limit for ng-repeat limitTo $scope.colCount = 3; $scope.increment = function(dir) { (dir === 'up') ? $scope.colCount++: $scope.colCount--; } $scope.cols = // array of column names $scope.data = // row data arrays ,例如此处https://gist.github.com/davidchase/40c27042bccfb00d786af0360b5bc3ea

如果您需要超过2个,则可以使用batchRandom.pair

Random.list

和另一个https://github.com/jcollard/random-examples/blob/master/src/Dice.elm

答案 2 :(得分:0)

除了@ChadGilbert接受的答案中描述的更改之外,我还必须更改NewFaces更新大小写(使用elm 0.18.0)。

NewFaces newFaces ->
  let
    (newFace1, newFace2) = newFaces
  in
    (Model newFace1 newFace2, Cmd.none)