module Main where import World import Cell import Graphics.Gloss import qualified Data.Vector as Vec main :: IO () main = do let width = 150 let height = 100 world <- randomWorld (width, height) simulate (InWindow "John Conway's Game of Life" (windowSizeOfWorld world) (5, 5)) white 10 world drawWorld simulateWorld -- | Convert a world to a picture. drawWorld :: World -> Picture drawWorld world = let (windowWidth, windowHeight) = windowSizeOfWorld world offsetX = - fromIntegral windowWidth / 2 offsetY = - fromIntegral windowHeight / 2 in Translate offsetX offsetY $ Pictures $ Vec.toList $ Vec.imap (drawCell world) (worldCells world) -- | Convert a cell at a particular coordinate to a picture. drawCell :: World -> Index -> Cell -> Picture drawCell world index cell = let cs = fromIntegral (worldCellSize world) cp = fromIntegral (worldCellSpace world) (x, y) = coordOfIndex world index fx = fromIntegral x * (cs + cp) + 1 fy = fromIntegral y * (cs + cp) + 1 in pictureOfCell (worldCellOldAge world) (worldCellSize world) fx fy cell -- | Get the size of the window needed to display a world. windowSizeOfWorld :: World -> (Int, Int) windowSizeOfWorld world = let cellSize = worldCellSize world cellSpace = worldCellSpace world cellPad = cellSize + cellSpace height = cellPad * (worldHeight world) + cellSpace width = cellPad * (worldWidth world) + cellSpace in (width, height)