2011-07-22 19 views
7

Soy nuevo en Haskell, así que estoy tratando de hacer un simple juego de dos jugadores basado en texto para ayudarme a aprenderlo.Problema con IO "Looping" en Haskell

Sin embargo, me he encontrado con el problema de realizar IO en un "bucle". Hasta donde yo sé, las variables que se configuran a partir de la entrada del usuario no se pueden usar a menos que estén establecidas dentro de main. Esto es un problema porque una llamada recursiva a main es inútil para mí ya que main no toma ningún argumento. Idealmente, tendría una función llamada desde main que se llama a sí misma hasta que un jugador pierde. Pero esto no parece funcionar, ya que el uso de cualquier variable establecida en esa función por la entrada del usuario da como resultado errores de tipo.

La estructura del programa es el siguiente:

* reproductor de indicativo 1 para el nombre y establecer la variable jugador1.

* Pregunte al reproductor 2 por el nombre y configure la variable player2.

* El "bucle": Alterna entre cada jugador, solicitando comandos hasta que un jugador pierda.

¿Cuál sería la mejor manera de abordar este problema?

Respuesta

22

Idealmente, me gustaría tener una función llamada de la principal que se llama hasta que un jugador pierde. Pero esto no parece funcionar, ya que al usar cualquier variable establecida en esa función por la entrada del usuario da como resultado errores tipo .

Esto es completamente posible. La próxima vez incluye algún código para que podamos ayudarte a través de tu malentendido. aquí hay un fragmento de código de ejemplo:

import System.IO 

Para manejar problemas de almacenamiento en búfer.

main = do 
    hSetBuffering stdin NoBuffering 
    putStrLn "Gimma a name ye skervy dog!" 
    name1 <- getLine 
    putStrLn "Good, Good, now another, and make it snappy!" 
    name2 <- getLine 
    loop name1 name2 10 

Aviso main puede llamar a otra función (loop) que vive en la mónada IO. Esta otra función es perfectamente capaz de obtener y actuar según la entrada del usuario, llamarse a sí misma y/o tomar argumentos.

loop :: String -> String -> Int -> IO() 
loop _ _ 0 = return() 
loop n1 n2 i = do 
    putStrLn $ "Ok Mr. " ++ n1 ++ " and Mrs. " ++ n2 ++ 
       " tis time to roll the dice!" 
    print i 
    putStrLn "Options: (k)eep looping, (i)ncrement loop counter by 10" 
    c <- getChar 
    putStr "\n" 
    case c of 
     'k' -> loop n1 n2 (i-1) 
     _ -> putStrLn "Blood and bloody ashes, we have to keep going?" >> 
       loop n1 n2 (i+10) 

Y bucle sólo hace un trabajo estúpido simple de pedir una entrada binaria (incrementar el contador o no) y, así, los bucles.

Si esto no ayuda, entonces quizás pueda publicar una pregunta y un código un poco más completos. Voy a editar con una respuesta actualizada.

+1

+1 Arrrrrrrrrh! – Landei

6

O podría usar forever.

main = do 
    x <- getLine 
    foo 
    forever $ do 
    y <- getLine 
    baz 

Si eres nuevo en Haskell, te sugiero que vayas a través de LYAH para una buena introducción.

Cuestiones relacionadas