0votos

Snake en Other

por josejuan hace 4 años

En `Elm`, una variante de Haskell que compila a JavaScript y basado en programación funcional "reactiva".

Fernando de Genbetadev dice que si haces un Snake en un lenguaje, entonces, ese lenguaje ya casi no tiene secretos para tí.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import Keyboard 
import Random 
import Set 
 
type Input = { arr : {x : Int, y : Int}, rnd : Int } 
 
tick = inSeconds <~ fps 10 
input = sampleOn tick (Input <~ Keyboard.arrows ~ Random.range 0 2499 tick) 
 
type Game = {dir : Int, food : (Int, Int), body : [(Int, Int)]} 
 
display : Game -> Element 
display {dir, body, food} = 
  let coord c = 10 * (toFloat c) - 245 
      box (x, y) = rect 10 10 |> filled black |> move (coord x, coord y) 
  in  collage 500 500 <| (rect 500 500 |> filled green)::map box (food :: body) 
 
stepGame {arr, rnd} {dir, food, body} = 
  let dct k = head <| drop k [1, 0, 0, 1, -1, 0, 0, -1] 
      p = (\(x, y) -> ((50 + x + dct (2 * dir)) `mod` 50, (50 + y + dct (2 * dir + 1)) `mod` 50)) (head body) 
      free = let f (x, y) = if (x, y) `Set.member` (Set.fromList (p::body)) 
                                then (if x == 50 then (0, (y + 1) `mod` 50) else (x + 1, y)) else (x, y) 
             in  f (rnd `mod` 50, rnd `div` 50) 
      dir' = case (arr.x, arr.y) of {(1, _) -> 0; (-1, _) -> 2; (_, 1) -> 1; (_, -1) -> 3; otherwise -> dir} 
  in  if p `Set.member` (Set.fromList body) then Game dir food body 
      else if p == food                     then Game dir' free (p::body) 
      else                                       Game dir' food (p::(reverse <| tail <| reverse body)) 
 
gameState = foldp stepGame (Game 0 (5, 0) [(0, 0)]) input 
 
main = lift display gameState 
1 comentario
0votos

Escrito por josejuan hace 4 años

(Página oficial de Elm)

Ejemplo de mi Snake:
Ejemplo de mi Snake

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.