module Galgje import StdEnv, SimpleFileIO, RandomGetallen lexicon_file = "lexicon.txt" // From the slides skip_nl :: String -> String skip_nl str = if (size str > 0 && str.[size str-1] == '\n') (str%(0,size str-2)) str // From a String and a List of guesses (Chars), return a String that shows dots for letters that were not guessed yet stripUnknown :: String [Char] -> String stripUnknown s g = toString [if (isMember c g) c '.' \\ c <- (fromString s)] // Get a random word from the lexicon file randomWord :: *env -> (Maybe String, *env) | FileSystem env randomWord env # (ss,env) = readLines lexicon_file env | ss == Nothing = (Nothing, env) # (seed,env) = getNewRandomSeed env | otherwise = (Just (skip_nl ((shuffle (fromJust ss) seed)!!0)), env) // word, guesses, stdio -> (win, new guesses, stdio) round :: String [Char] *File -> (Bool, [Char], *File) round w g io # io = io <<< stripUnknown w g <<< '\n' | stripUnknown w g == w = (True, g, io) # io = io <<< "Guess: " # (ok,g`,io) = freadc io # (_,io) = freadline io // to read until the next \n | not ok = abort "Couldn't get guessed letter" | otherwise = round w [g`:g] io Start :: *World -> *World Start world # (word,world) = randomWord world | word == Nothing = abort "Couldn't get random word" # word = fromJust word # (io,world) = stdio world # (win,g,io) = round word [] io # io = if win (io <<< "You win!\n") io # (ok,world) = fclose io world | not ok = abort "Couldn't close stdio" | otherwise = world