PREVIOUS
Chapter
20
La implementación del bucle del juego usa las funcionalidades que hemos definido anteriormente:
def gameLoop(oldState: State): ZIO[Console, IOException, Unit] =
for {
guess <- renderState(oldState) *> getGuess
newState = oldState.addGuess(guess)
guessResult = analyzeNewGuess(oldState, newState, guess)
_ <- guessResult match {
case GuessResult.Won =>
putStrLn(s"Congratulations ${newState.name.name}! You won!") *> renderState(newState)
case GuessResult.Lost =>
putStrLn(s"Sorry ${newState.name.name}! You Lost! Word was: ${newState.word.word}") *>
renderState(newState)
case GuessResult.Correct =>
putStrLn(s"Good guess, ${newState.name.name}!") *> gameLoop(newState)
case GuessResult.Incorrect =>
putStrLn(s"Bad guess, ${newState.name.name}!") *> gameLoop(newState)
case GuessResult.Unchanged =>
putStrLn(s"${newState.name.name}, You've already tried that letter!") *> gameLoop(newState)
}
} yield ()
Como podemos ver, lo que hace la función gameLoop es lo siguiente:
Al final, gameLoop retorna un efecto ZIO que depende del módulo Console (esto es obvio porque necesita leer texto por teclado y escribir por consola), puede fallar con un IOException o terminar exitosamente con un valor Unit.