elm - tienen - ¿Cómo agrego un segundo dado a este ejemplo de efectos de olmo?
seo meta tags (3)
Además de los cambios descritos en la respuesta aceptada por @ChadGilbert, también tuve que cambiar el caso de actualización de NewFaces
(usando elm 0.18.0
).
NewFaces newFaces ->
let
(newFace1, newFace2) = newFaces
in
(Model newFace1 newFace2, Cmd.none)
Soy nuevo en Elm y he estado observando el siguiente ejemplo (tenga en cuenta que esto se encuentra en la nueva arquitectura 0.17, donde Action ahora es Command): http://elm-lang.org/examples/random
Hay un desafío de seguimiento para agregar un segundo dado al ejemplo, de modo que un solo clic del botón arroje un nuevo valor para cada dado. Mi idea es cambiar el modelo para mantener dos valores separados, uno para cada dado, ala
type alias Model =
{ dieFace1 : Int
, dieFace2 : Int
}
Esto funciona bien hasta que llegue al bloque de actualización. No estoy seguro de cómo actualizar el generador de números aleatorios para crear dos valores. La función es un poco confusa para mí.
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)
La documentación para la función Random.generate es un poco ligera -
generar: (a -> msg) -> Generador a -> Cmd msg
Crea un comando que genere valores aleatorios.
¿Es este incluso el enfoque correcto para manejar dos dados, o hay una mejor manera? Soy un olmo noob, por favor se bueno :)
Un enfoque es usar batch
como aquí https://gist.github.com/davidchase/40c27042bccfb00d786af0360b5bc3ea .
Otra es usar Random.pair
o Random.list
si necesita más de 2:
import Html exposing (..)
import Html.App as Html
import Html.Events exposing (..)
import Html.Attributes exposing (..)
import Random
main : Program Never
main =
Html.program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
-- MODEL
type alias Model =
{ dieFaces : (List Int)
}
-- http://.com/questions/23199398/how-do-i-get-a-list-item-by-index-in-elm#comment56252508_23201661
get : Int -> List a -> Maybe a
get n xs = List.head (List.drop n xs)
-- http://rundis.github.io/blog/2016/elm_maybe.html
getOrOne : Int -> List Int -> Int
getOrOne n xs = Maybe.withDefault 1 (get n xs)
init : (Model, Cmd Msg)
init =
(Model [1, 1], Cmd.none)
-- UPDATE
type Msg
= Roll
| NewFace (List Int)
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Roll ->
(model, Random.generate NewFace (Random.list 2 (Random.int 1 6)))
NewFace newFace ->
(Model newFace, Cmd.none)
-- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.none
-- VIEW
view : Model -> Html Msg
view model =
div []
[ img [ src ("/img/Alea_" ++ toString (getOrOne 0 model.dieFaces) ++ ".png")] []
, img [ src ("/img/Alea_" ++ toString (getOrOne 1 model.dieFaces) ++ ".png")] []
, button [ onClick Roll ] [ text "Roll" ]
]
y otro https://github.com/jcollard/random-examples/blob/master/src/Dice.elm
Random.int
es un generador primitivo que le da un solo int aleatorio. Necesita un generador que le dé exactamente dos enteros aleatorios.
Se pueden construir generadores de números aleatorios a partir de generadores más primitivos para crear generadores más complejos. Afortunadamente, Elm tiene una función de este tipo, Random.pair
, que le permite especificar qué dos generadores desea para cada parte de la tupla.
Vamos a jalar el generador de troquel a su propia función para evitar que nos repitamos:
dieGenerator : Random.Generator Int
dieGenerator =
Random.int 1 6
Ahora podemos construir otro generador que nos dé el valor aleatorio de un par de dados:
diePairGenerator : Random.Generator (Int, Int)
diePairGenerator =
Random.pair dieGenerator dieGenerator
Ya que estamos lidiando con una tupla de entradas, actualicemos su definición de Msg
de NewFace Int Int
a NewFaces (Int, Int)
. Eso permitirá que su controlador de Roll
sea agradable y limpio:
Roll ->
(model, Random.generate NewFaces diePairGenerator)
Si quiere intentar ir más allá de esto, piense en lo que se necesitaría para permitir que se lanzara cualquier número de dados. Tome esta idea de construir generadores complejos a partir de generadores más primitivos y use la documentación para el módulo Random
con una guía.