0votos

Kata TDD. Sokoban (el juego) en Haskell

por josejuan hace 6 años

Representa, controla los movimientos y permite la evolución del juego.

El Sokoban es un juego que consiste en moverte por un almacén y empujar una serie de cajas sobre unas casillas especiales. Desarrolla toda la lógica del juego Sokoban aplicando Test-Driven Development de la manera más estricta posible

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
-- sin contar tu posición, posibles estados para las celdas 
data Cell = Wall | Box | End | BoxEnd | Empty deriving (Show, Eq) 
 
-- un mapa completo (o estado) es tu posición y los estados de las celdas 
type Map = (Int, [Cell]) 
 
-- un juego es el número de columnas y una consecución de estados 
data Game = Game Int [Map] deriving (Show) 
 
-- mover de una posición a otra 
goDelta d (Game r mms@((p, m):ms)) = Game r mms' 
  where p' = p + d 
        p'' = p' + d 
        -- si la celda destino está libre o siendo una caja la siguiente está libre 
        mms' = if m!!p' `elem` [End, Empty] || (m!!p' `elem` [Box, BoxEnd] && m!!p'' `elem` [End, Empty]) 
                 then (p', m'):mms  -- añadimos estado 
                 else []            -- el juego ha terminado, no es posible ese movimiento 
        -- el cambio de estado consiste en que si vamos a una celda vacía 
        m' = if m!!p' `elem` [End, Empty] 
                 then m -- no hay cambio en las celdas 
                 else (tr p'' End BoxEnd Box . tr p' Box Empty End) m -- sino, pivotamos caja 
        tr q a b c w = w1s ++ ((if w2 == a then b else c) : w2s) where (w1s, (w2:w2s)) = splitAt q w 
 
goUp    g@(Game r m) = goDelta (-r) g 
goDown  g@(Game r m) = goDelta   r  g 
goLeft  g@(Game r m) = goDelta (-1) g 
goRight g@(Game r m) = goDelta   1  g 
1 comentario
0votos

Escrito por Javier J. hace 6 años

Gracias !!! La verdad es que soy un ignorante de Haskell pero como conozco bien el Sokoban me voy enterando de cositas. Mucho más compactoque en Java (o yo programo fatal en Java ;) )

Tienes este código en un repositorio ?? si es así me gustaría hacer un submódulo desde el repositorio Git de la kata.

Gracias de nuevo y un saludo.

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.