module Hangman where
import qualified Data.Set as S
import Data.List (intercalate)
import Types
-- | Representation of hangman game
displayGame :: Hangman -> String
displayGame hg = intercalate ";"
$ map (\ fn -> fn hg) [ guessedSoFar , show . gameScore , show . gameStatus ]
-- | A dummy hangman game
dummyHG = Hangman "" defaultMaxWrongGuess "" (S.fromList []) (S.fromList []) (S.fromList [])
initHG :: SecretWord -> Hangman
initHG sw = Hangman sw defaultMaxWrongGuess (replicate (length sw) ml) (S.fromList []) (S.fromList []) (S.fromList [])
-- | Game score calculation
gameScore :: Hangman -> Int
gameScore hg
| gameStatus hg == GAME_LOST = 25
| otherwise = gameWrongGuessesMade hg + S.size (correctGuessedLetters hg)
-- | Number of wrong guess made so far
gameWrongGuessesMade :: Hangman -> Int
gameWrongGuessesMade hg = S.size (incorrectGuessedLetters hg)
+ S.size (incorrectGuessedWords hg)
-- | Current game status
gameStatus :: Hangman -> GameStatus
gameStatus hg
| guessedSoFar hg == secretWord hg = GAME_WON
| gameWrongGuessesMade hg > maxWrongGuesses hg = GAME_LOST
| otherwise = KEEP_GUESSING
ml :: Letter
ml = '-'
defaultMaxWrongGuess :: Int
defaultMaxWrongGuess = 5