我一直試圖在過去幾週中獨立學習Haskell。目前,我正試圖實施一個愚蠢的小猜謎遊戲,其中計算機選擇一個隨機數並且用戶試圖猜測它。如果用戶錯了,程序會告訴用戶答案是更高或更低,並允許用戶猜測,直到他們猜測正確。我已經掌握了它的工作原理,但是我想增加跟蹤用戶每場比賽的猜測次數的能力,並且一旦他們猜測正確,就向用戶報告這個數字。如何跟蹤一個簡單的猜謎遊戲中的猜測次數(Haskell)
從勢在必行的背景來看,自然要做的事情就是每次用戶猜測時都會增加一個計數器,但在Haskell中你不能這麼做(至少看起來像無狀態和一切的不變性會阻止)。 (我們把它稱爲numGuesses),並且在每次調用這些方法時,都會傳遞(numGuesses + 1),這會導致getGuess和giveHints函數需要額外的參數, 。但我無法讓它工作(更不用說我甚至不知道這是否會奏效)。
我的代碼如下。任何建議將非常感激。我主要在尋找想法,但也可以隨時發佈實際的代碼。此外,隨時讓我知道,如果我的代碼很爛,我怎麼能改善它,如果你注意到有什麼十惡不赦
import System.Random
import System.IO
import Control.Monad
main = do
gen <- getStdGen
let (ans,_) = randomR (1,100) gen :: (Int,StdGen)
putStrLn $ "I'm thinking of a number between 1 and 100..."
getGuess ans
putStrLn "You guessed it in __ guesses!"
putStr "Play again? "
hFlush stdout
desire <- getLine
when ((desire !! 0) `elem` ['y','Y']) $ do
putStrLn ""
newStdGen
main
getGuess ans = do
putStr "Your guess? "
hFlush stdout
guessStr <- getLine
giveHints ans (read guessStr)
giveHints ans guess = do
when (ans /= guess) $ do
if ans > guess
then putStrLn "It's higher."
else putStrLn "It's lower."
getGuess ans
注(我只是一直在功能上編程的幾個星期!):我使用hFlush標準輸出,因爲我使用線緩衝,沒有它,一些交互的順序不是人們所期望的。
你的想法(添加一個參數,已經計算了多少次猜測)是完美的。當你嘗試時出了什麼問題? – 2012-08-08 01:44:03
我想解決這個代碼中與實際問題無關的一個奇怪的位(這就是爲什麼這是一個單獨的註釋)。如果使用的是明確的種子,則應該使用'setStdGen'將'randomR'返回的新種子放回,而不是使用'newStdGen'完全重新放入。 (事實上,在一個理想的世界裏,你根本就不會再種下種子,而是在節目的不同運行中保存種子,如果你有興趣,可以問我爲什麼。)或者,你可以跳過'getStdGen/randomR/setStdGen通過使用'randomRIO'來封裝這個模式。 – 2012-08-08 01:48:15
我很感興趣。爲什麼? ;-) – 2012-08-08 02:21:43