我正在构建一个滑动益智游戏:
从这个初始位置开始,我想把这个谜题改组,比如100步.
我希望每次都能以不同方式改组拼图.
这可能意味着Random.initialSeed每次我需要使用不同的号码进行呼叫,这意味着我需要使用类似当前时间的内容.
不幸的是,我找不到如何获得当前时间.
在每个给定的状态中,我都列出了可能的动作.例如,在上面的初始位置:[MoveRight, MoveDown]
所以,基本上,我的问题是:如何在给定的List中获取随机元素?
share-elm的例子将不胜感激.
这是对pdamoc答案的修订.它更紧密地遵循榆树建筑,但更重要的是,它保存了从按压到印刷的随机种子.如果你继续使用初始种子,你就不会得到随机性.我只得到了其他版本的偶数或奇数(得到了均衡,刷新,得分).Random.initialSeed在程序中只调用一次是很重要的,通常是在初始模型的定义中.
还有一个库(我写的)处理Arrays上的随机操作.
import Html exposing (..)
import Html.Events exposing (onClick)
import Random exposing (initialSeed, int, generate, Seed)
type alias Model =
{ list : List Int , currentElement : Maybe Int, seed : Seed}
init : Model
init = {list = [1..10], currentElement = Nothing, seed = initialSeed 42 }
type Action = NoOp | Click
actions : Signal.Mailbox Action
actions = Signal.mailbox NoOp
update : Action -> Model -> Model
update action model =
case action of
NoOp -> model
Click ->
let gen = Random.int 0 (List.length model.list - 1)
-- since we know the list is constant we don't have to
-- redefine the generator every time, but we will anyway
(i, seed) = Random.generate gen model.seed
elem = List.drop i model.list |> List.head
in {model| currentElement <- elem, seed <- seed}
model : Signal Model
model = Signal.foldp update init actions.signal
view : Signal.Address Action -> Model -> Html
view address model =
let
current = model.currentElement
|> Maybe.map toString
|> Maybe.withDefault "NONE"
in
div []
[ text <| toString model.list
, br [] []
, text <| "Current Element: " ++ current
, br [] []
, button [onClick address Click ] [text "Click for Random Element"]
]
main = Signal.map (view actions.address) model
Run Code Online (Sandbox Code Playgroud)