import System.Cmd import Control.Monad(when) import DataTypes import Board gameOver :: Board -> Bool gameOver b = not (hasMovesFor b X || hasMovesFor b O) count :: Board -> State -> Int count b s = sum [ 1 | (i,j) <- indexes b , value b (i,j) == s ] winner :: Board -> State winner b | gameOver b && ( count b X > count b O ) = X | gameOver b && ( count b O > count b X ) = O loop :: Board -> IO () loop board = do system "clear" showBoard board if gameOver board then do putStrLn ( "Game over! Winner: " ++ show (winner board) ) return () else do command <- getLine when (not $ null command) $ do let m = read command :: Move -- debug -- putStrLn (show (allChains (move board m) (fst m))) -- putStrLn (show (map hasChain (allChains (move board m) (fst m)))) if check board m then do let new = flipChains (move board m) (fst m) loop new else loop board main = do let board = makeBoard loop board