私はここ数週間、Haskellを独立して学習しようとしています。現在、私はコンピュータが乱数を選択し、ユーザーがそれを推測しようとする、ちょっとした推測ゲームを実装しようとしています。ユーザーが間違っている場合、プログラムはユーザーに答えが高いか低いかを伝え、正しく推測するまでユーザーに推測させます。私はそれが働いているが、私は、ユーザーがすべてのゲームを作ったと推測の数を追跡し、彼らが正しく推測すると、その番号をユーザーに報告する機能を追加したいと思います。簡単な推測ゲーム(Haskell)の推測数を追跡する方法
命令的なバックグラウンドから来る自然なことは、ユーザーが推測するたびに増分されるカウンタを持つことですが、実際にはハスケルではできません(少なくとも無国籍のようですすべての不変性がそれを妨げるだろう)。
getGuess関数とgiveHints関数に、これまでの推測数を表す追加パラメータ(numGuessesと呼ぶ)を渡して、それらのメソッドを呼び出すたびにpass(numGuesses + 1) 。しかし、私はそれを働かせることができませんでした(私はそれが動作するかどうかわからないことは言うまでもありません)。
私のコードは以下の通りです。どんな提案も本当に感謝しています。私は主にアイデアを探していますが、実際のコードを投稿することも自由です。また、私のコードを吸うなら、私に知らせて自由に感じる、あなたが凶悪な何かが気づけば、私はそれを改善できるか
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を使用しています私はラインバッファリングを使用しているので、stdoutと、それなしでは、いくつかの相互作用の順序は期待するものではありません。
あなたのアイデア(すでに推測された推測の数を数えるパラメータを追加する)は完璧です。あなたはそれを試して何が間違っていたのですか –
私は、実際の質問とは無関係なこのコードの奇妙な部分に取り組んでいます(これが別のコメントです)。明示的なシードを使用している場合、 'newStdGen'で完全に再シードするのではなく、' setStdGen'を使って 'randomR'によって返された新しいシードを戻すべきです。 (実際、理想的な世界では、プログラムを別のプログラムに渡ってシードを保存するのではなく、全くシームレスにシードする必要があります。なぜか興味があるのかどうか私に尋ねてください)。代わりに、 'getStdGen/randomR/setStdGen 'シーケンスを' randomRIO'を使用して作成します。これはこのパターンをカプセル化します。 –
私は興味があります。どうして? ;-) –