Guest User

Untitled

a guest
Apr 23rd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Control.Concurrent (threadDelay)
  2.  
  3. -- Game spec
  4. width        =  10
  5. height       =  10
  6. glider       =  [(4,2),(2,3),(4,3),(3,4),(4,4)]
  7.  
  8. main = life glider
  9.  
  10. -- ASCII drawing
  11. cls          =  putStr "\ESC[2J"
  12. goto (x,y)   =  putStr ("\ESC[" ++ show y ++ ";" ++ show x ++ "H")
  13. seqn []      =  return()
  14. seqn (a:as)  =  do a; seqn as
  15. writeat p xs =  do goto p; putStr xs
  16. showcells b  =  seqn [writeat p "O" | p <- b]
  17.  
  18. -- Cell-related
  19. isAlive b p  =  elem p b
  20. isEmpty b p  =  not (isAlive b p)
  21. neighbs (x,y)=  map wrap [(x-1,y-1), (x,y-1),
  22.                                            (x+1,y-1), (x-1,y),
  23.                                            (x+1,y)  , (x-1,y+1),
  24.                                            (x,y+1)  , (x+1,y+1)]
  25. liveneighbs b=  length . filter (isAlive b) . neighbs
  26.  
  27. -- Board-related
  28. wrap (x,y)   =  (((x-1) `mod` width) + 1, ((y-1) `mod` height + 1))
  29. survivors b  =  [p | p <- b, elem (liveneighbs b p) [2,3]]
  30. births b     =  [p | p <- rmdups (concat (map neighbs b)), isEmpty b p, liveneighbs b p == 3]
  31. rmdups []    =  []
  32. rmdups (x:xs)=  x : rmdups (filter (/= x) xs)
  33. nextgen b    =  survivors b ++ births b
  34.  
  35. -- Game-related
  36. life b       =  do cls
  37.                    showcells b
  38.                    threadDelay 1000
  39.                    life (nextgen b)
Add Comment
Please, Sign In to add comment