Salut,
Après avoir mis longtemps à comprendre le principe de pureté en Haskell, je me suis attaqué à un jeu du pendu. Le jeu est fonctionnel (pas fait exprès désolé ) mais comporte des problèmes d'affichages. Lorsque je demande au joueur d'entrer un caractère, j'affiche "Enter a letter: "
et je retourne le résultat de getChar
si il appartient à l'alphabet, autrement je recommence. Cependant, dans tous les cas, que j'entre un bon caractère ou non, le "Enter a letter: "
est affiché en double. Voici le code:
1 2 3 4 5 6 7 8 9 10 11 | askLetter :: IO Char askLetter = do putStr "Enter a letter: "; char <- getChar if (toLower char) `elem` ['a'..'z'] then return (toLower char) else do putStr "\n" rec <- askLetter return rec |
Et voici la fonction dans lequel je l'appelle:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | hangmanGame :: Word -> TryOutInfo -> IO GameStatus hangmanGame word tryOuts = do view <- stateView tryOuts putStrLn view if revealed word then return Won else do if remaining tryOuts == 0 then return Failed else do putStrLn $ show word letter <- askLetter if letter `elem` (actual word) then do status <- hangmanGame (revealChar word letter) tryOuts return status else do status <- hangmanGame word (TryOutInfo (initial tryOuts) ((remaining tryOuts) - 1)) return status |
Voici plus exactement le rendu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | Enter a letter: Enter a letter: e | | | | | | _|___ pe__h Enter a letter: Enter a letter: a | | | | | | _|___ pea_h Enter a letter: Enter a letter: c |
Il est à noter que seul le putStr
est répété, le programme ne me redemande pas le caractère.
Voilà, merci d'avance,
AZ.
PS: J'aimerais aussi savoir comment faire en sorte de ne pas avoir à faire un retour à la ligne, mis que le programme continue dès que la touche est appuyée, j'ai regardé du côté de HSCurses mais une librairie/fonction builtin m'arrangerai. J'ai déjà essayé un truc foireux du genre hSetBuffering stdin NoBuffering
mais j'ai pas eu l'impression que ça marchait. Merci pour tout.