2016-05-06 5 views
-2

Ich mache eine Nummer Ratespiel in Haskell und ich habe 3 Schwierigkeiten.
Ich machte ein Menü, wo der Benutzer wählt, welche Schwierigkeiten, aber sobald ich es implementiert habe, fing es an, mir einen Fehler zu geben, und ich kann nicht herausfinden, was es ist.
Der Fehler:Nummer Erraten Spiel Fehler und halten die Zählung der Vermutungen

finalename.hs:5:10: 
Parse error in pattern: putStrLn 
Possibly caused by a missing 'do'? 

Auch, wie würde ich eine Zählung der Umsetzung gehen über, wo es zählt, wie oft es dauert, bis der Benutzer zu erraten?

import System.Random (randomRIO)  
main :: IO() 
main = do 
    putStrLn "Do you want to play 1) Easy, 2) Medium or 3) Hard" 
    putStrLn "Select your difficulty by entering a number 1, 2 or 3" 
    choice <- readLn 
     | choice == 1 = "You selected easy" >> easy 
     | choice == 2 = "You selected medium" >> medium 
     | choice == 3 = "You selected hard" >> hard 
     | otherwiose = "You did not selected a valid choice" >> main 

easy :: IO() 
easy = do 
    putStrLn "Guess a number between 1 and 13: " 
    rNumber <- randomRIO (1, 10) :: IO Int 
    loop rNumber 

medium :: IO() 
medium = do 
    putStrLn "Guess a number between 1 and 25: " 
    rNumber <- randomRIO (1, 25) :: IO Int 
    loop rNumber 

hard :: IO() 
hard = do 
    putStrLn "Guess a number between 1 and 50: " 
    rNumber <- randomRIO (1, 50) :: IO Int 
    loop rNumber 

loop :: Int -> IO() 
loop rNumber = do 
     userInput <- readLn 
     case compare rNumber userInput of 
     EQ -> putStrLn "Correct!" >> main 
     LT -> putStrLn "Guess is too low, try again please" >> loop rNumber 
     GT -> putStrLn "Guess is too high, try again please" >> loop rNumber 
+0

Verwendung von 'wenn-dann-sonst' wird von einigen als eher * un * haskell angesehen. Bitte benutzen Sie * Wächter *. –

+1

Nein, bitte verwenden Sie _ 'case'_, um eine Variable mit einer Reihe von Werten zu vergleichen! - Bitte klappen Sie das Problem auf [mcve] und geben Sie die _full_ Fehlermeldung. – leftaroundabout

+0

@leftaroundabout: in der Tat Fall ist auch ziemlich hakelisch;) –

Antwort

3

Sie benötigen loop Funktion ändern Spur sowohl der Zahl zu halten, zu erraten, und die Anzahl der Vermutungen:

loop :: Int -> Int -> IO() 
loop rNumber guesses = do 
    putStrLn $ "You have made " ++ show guesses ++ " guesses so far." 
    ... 
    putStrLn "Too low, guess again" 
    loop rNumber (guesses+1) 
    ... 
    putStrLn "To high, guess again" 
    loop rNumber (guesses+1) 

Beachten Sie, wie wenn Sie loop rufen rekursiv Sie die Vermutung Zahl ändern, indem in der alten Rate zählen + 1.

+0

Also was setze ich in die einfachen, mittleren und harten Funktionen, wenn es die Schleifenfunktion aufruft, da ich Schleife rNummer habe? – lukas13x

Verwandte Themen