fork download
  1. import Data.Monoid
  2. import Data.Array
  3. import Data.List (intercalate)
  4. import Data.Char (isDigit, digitToInt)
  5.  
  6. data Player = None | One | Two | Unknown
  7. deriving Eq
  8.  
  9. instance Show Player where
  10. show None = " "
  11. show One = "X"
  12. show Two = "O"
  13.  
  14. data Board = Board (Array Int Player)
  15.  
  16. emptyBoard = Board (listArray (1, 9) (repeat None))
  17.  
  18. isFree (Board a) pos =
  19. a ! pos == None
  20.  
  21. isFull (Board a) =
  22. all (/= None) $ elems a
  23.  
  24. makeMove (Board a) player pos =
  25. Board (a // [(pos, player)])
  26.  
  27. instance Show Board where
  28. show (Board a) = embed' "+---+---+---+\n" (map line [7, 4, 1]) where
  29. line y = embed "| " " | " " |\n" (map col [0, 1, 2]) where
  30. col x = show $ a!(y+x)
  31.  
  32. embed front middle back xs =
  33. front ++ intercalate middle xs ++ back
  34.  
  35. embed' sep = embed sep sep sep
  36.  
  37. winners board =
  38. [(player, line) | line <- boardLines,
  39. let player = owner board line,
  40. player /= None]
  41.  
  42. boardLines = [
  43.  
  44. [1, 2, 3], [4, 5, 6], [7, 8, 9], -- horizontal
  45.  
  46. [1, 4, 7], [2, 5, 8], [3, 6, 9], -- vertical
  47.  
  48. [3, 5, 7], [1, 5, 9] ] -- diagonal
  49.  
  50. instance Monoid Player where
  51. mempty = Unknown
  52.  
  53. x `mappend` Unknown = x
  54. One `mappend` One = One
  55. Two `mappend` Two = Two
  56. _ `mappend` _ = None
  57.  
  58. owner :: Board -> [Int] -> Player
  59. owner (Board a) = mconcat . map (a !)
  60.  
  61. hasWinner :: Board -> Bool
  62. hasWinner = not . null . winners
  63.  
  64. main = do
  65. print emptyBoard
  66. gameloop emptyBoard One Two
  67.  
  68. gameloop board player enemy = do
  69. pos <- getFreePosition board
  70. if (pos == 0)
  71. then putStrLn "goodbye!"
  72. else evaluate (makeMove board player pos) player enemy
  73.  
  74. evaluate board player enemy = do
  75. print board
  76. if (hasWinner board)
  77. then putStrLn ("player " ++ show player ++ " wins!")
  78. else if (isFull board)
  79. then putStrLn "It's a tie!"
  80. else gameloop board enemy player
  81.  
  82. getFreePosition board = do
  83. pos <- getPosition
  84. if (pos == 0 || isFree board pos)
  85. then return pos
  86. else getFreePosition board
  87.  
  88. getPosition = do
  89. c <- getCharacter
  90. if (isDigit c)
  91. then return (digitToInt c)
  92. else getPosition
  93.  
  94. getCharacter = do
  95. putStr "> "
  96. line <- getLine
  97. if (null line)
  98. then getCharacter
  99. else return (head line)
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:28:27: warning: missing terminating ' character
prog.cpp:28: error: missing terminating ' character
prog.cpp:35:6: warning: missing terminating ' character
prog.cpp:35: error: missing terminating ' character
prog.cpp:53: error: stray ‘`’ in program
prog.cpp:53: error: stray ‘`’ in program
prog.cpp:54: error: stray ‘`’ in program
prog.cpp:54: error: stray ‘`’ in program
prog.cpp:55: error: stray ‘`’ in program
prog.cpp:55: error: stray ‘`’ in program
prog.cpp:56: error: stray ‘`’ in program
prog.cpp:56: error: stray ‘`’ in program
prog.cpp:1: error: ‘import’ does not name a type
stdout
Standard output is empty