Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Control.Concurrent (threadDelay)
- -- Game spec
- width = 10
- height = 10
- glider = [(4,2),(2,3),(4,3),(3,4),(4,4)]
- main = life glider
- -- ASCII drawing
- cls = putStr "\ESC[2J"
- goto (x,y) = putStr ("\ESC[" ++ show y ++ ";" ++ show x ++ "H")
- seqn [] = return()
- seqn (a:as) = do a; seqn as
- writeat p xs = do goto p; putStr xs
- showcells b = seqn [writeat p "O" | p <- b]
- -- Cell-related
- isAlive b p = elem p b
- isEmpty b p = not (isAlive b p)
- neighbs (x,y)= map wrap [(x-1,y-1), (x,y-1),
- (x+1,y-1), (x-1,y),
- (x+1,y) , (x-1,y+1),
- (x,y+1) , (x+1,y+1)]
- liveneighbs b= length . filter (isAlive b) . neighbs
- -- Board-related
- wrap (x,y) = (((x-1) `mod` width) + 1, ((y-1) `mod` height + 1))
- survivors b = [p | p <- b, elem (liveneighbs b p) [2,3]]
- births b = [p | p <- rmdups (concat (map neighbs b)), isEmpty b p, liveneighbs b p == 3]
- rmdups [] = []
- rmdups (x:xs)= x : rmdups (filter (/= x) xs)
- nextgen b = survivors b ++ births b
- -- Game-related
- life b = do cls
- showcells b
- threadDelay 1000
- life (nextgen b)
Add Comment
Please, Sign In to add comment