
Hi Ronald, Ronald Guida wrote:
I'm interested in learning how to program games. Since I have to start somewhere, I decided to write a simple Hangman game. I'm wondering if anyone can look at my code and give me some feedback.
Lots of fun, thanks! And nicely written. One point is that while it's OK to do your random calculation directly in IO for this simple case, in general you will have many random calculations and you will want to avoid forcing them all into IO. You can add one more field to GameState that holds a random generator. Let's say you call it gsRandGen. Make sure that gsRandGen gets initialized somewhere. Define this utility function: rand :: MonadState GameState m => (StdGen -> (a, StdGen)) -> m a rand f = do gs <- get let (x, g) = f $ gsRandGen gs put $ gs {gsRandGen = g} return x Now, instead of:
nWord <- liftIO $ getStdRandom (randomR (0,length wordList - 1))
you can write:
nWord <- rand $ randomR (0,length wordList - 1)
If you want, you can even remove the dependence on StdGen by making some of your function types polymorphic, qualified where necessary by RandomGen g => ... Regards, Yitz