2017-12-12 2 views
0
import System.IO 

makeGrid :: Int -> Int -> a -> [[a]] 
makeGrid x y = replicate y . replicate x 

startGame = do 
putStrLn "Select a difficulty (1,2): " 
difficulty <- getLine 
|difficulty == '1' = makeGrid 3 3 False 
|difficulty == '2' = makeGrid 5 5 False 
|otherwise = putStrln "Wrong thing" 
      some function   --start from beginning again 

Wie Sie sehen, habe ich eine Funktion makeGrid. Ich möchte Benutzereingaben in startGame nehmen und makeGrid basierend auf der Benutzereingabe aufrufen. Mach auch wenn möglich eine while-Schleife, wie soll ich das machen?Wie akzeptiere ich Benutzereingaben und Anruffunktionen basierend auf diesen?

+0

'| Schwierigkeit == '1' =' ist nicht die richtige Syntax hier. Versuchen Sie 'if ... then ... else' oder' case'. –

+0

In Haskell teilt man normalerweise Dinge in Funktionen auf. Sie könnten also eine 'parseDifficulty'-Funktion haben, die von einer Zeichenfolge (doppelte Anführungszeichen für Zeichenfolgen und einfache Anführungszeichen für Zeichen) wie" 1 "' zu einer "Vielleicht schwierig" wie "Einfach einfach" geht. Dies könnte durch eine 'readDifficulty :: IO-Schwierigkeits-Funktion wie' readDifficulty = putStrLn "Schwierigkeit?" >> (fmap parseDifficulty getLine) >> = \ d -> Fall d von Just d -> return d; Nichts -> readDifficulty'. Beachten Sie, dass dies auch zeigt, wie eine IO-Aktion wiederholt werden kann. Wenn Sie Fälle in einem 'do' machen wollen, brauchen Sie einen' case'. –

+0

Sie müssen auch den Inhalt des do-Blocks einrücken. – kuoytfouy

Antwort

3
{-# LANGUAGE LambdaCase #-} 

import System.IO 

playGame = do 
    grid <- initializeGrid 
    -- game code goes here 

initializeGrid = do 
    putStrLn "Select a difficulty (1,2): " 
    getLine >>= \case -- "difficulty <- getLine" <newline> "case difficulty of" also ok 
    "1" -> return $ makeGrid 3 3 False 
    "2" -> return $ makeGrid 5 5 False 
    _ -> do 
     putStrln "Wrong thing" 
     initializeGrid 

makeGrid :: Int -> Int -> a -> [[a]] 
makeGrid x y = replicate y . replicate x 
+0

Es macht viel Sinn, gibt aber einen Fehler: "Die letzte Anweisung in einem 'tun' Block muss ein Ausdruck sein" at grid <- initializeGrid, wenn ich versuche, es in Plattform – xsx

+1

auszuführen Ja, Sie haben keinen Spielcode Wo geht es. Es beschwert sich, dass Sie nicht "Grid" verwenden. Zum Testen können Sie 'print grid' dort verwenden. – Gurkenglas

Verwandte Themen