Advertisement
Guest User

Untitled

a guest
Dec 19th, 2014
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.17 KB | None | 0 0
  1. {-
  2. Curso Haskell para iniciantes
  3.  
  4. Jogo da Velha
  5. -}
  6.  
  7. import Control.Exception
  8. import System.IO
  9. import System.IO.Error
  10. import System.Process
  11.  
  12.  
  13. -- definição dos tipos dos dados
  14. type Jogadores = [Jogador]
  15. type Nome = String
  16. type Pontuacao = Int
  17. type Vez = Int
  18. type Tabela = [Char]
  19. data Jogador = Jogador Nome Pontuacao
  20. deriving (Show, Read)
  21.  
  22.  
  23. -- função que recebe uma String e retorna uma IO String
  24. getString :: String -> IO String
  25. getString str = do
  26. putStr str
  27. res <- getLine
  28. return res
  29.  
  30.  
  31. -- função que inicia o programa
  32. inicio :: IO ()
  33. inicio = do
  34. {catch (ler_arquivo) tratar_erro;}
  35. where
  36. -- tenta ler o arquivo
  37. ler_arquivo = do
  38. {
  39. arq <- openFile "dados.txt" ReadMode; -- abre o arquivo para leitura
  40. dados <- hGetLine arq; -- ler o conteúdo do arquivo
  41. hClose arq; -- fecha o arquivo
  42. menu (read dados); -- passa os dados para a função menu
  43. return ()
  44. }
  45. tratar_erro erro = if isDoesNotExistError erro then do
  46. {
  47. -- se o arquivo NÃO existir, então cria o arquivo
  48. arq <- openFile "dados.txt" WriteMode; -- abre o arquivo para escrita
  49. hPutStrLn arq "[]"; -- escreve uma lista vazia no arquivo
  50. hClose arq; -- fecha o arquivo
  51. menu []; -- passa uma lista vazia para o menu
  52. return ()
  53. }
  54. else
  55. ioError erro
  56.  
  57.  
  58. -- função que exibe o Menu
  59. menu :: Jogadores -> IO Jogadores
  60. menu dados = do
  61. system "cls" -- limpa a tela (windows somente)
  62. putStrLn "-------------------------------- Jogo da Velha --------------------------------"
  63. putStrLn "\nDigite 1 para cadastrar jogador"
  64. putStrLn "Digite 2 para jogar"
  65. putStrLn "Digite 3 para visualizar o ranking"
  66. putStrLn "Digite 0 para sair"
  67. putStr "Opção: "
  68. op <- getChar
  69. getChar -- descarta o Enter
  70. executarOpcao dados op
  71.  
  72.  
  73. -- função para manipular a opção escolhida pelo usuário
  74. executarOpcao :: Jogadores -> Char -> IO Jogadores
  75. executarOpcao dados '1' = cadastrarJogador dados
  76. executarOpcao dados '2' = prepararJogo dados
  77. executarOpcao dados '0' = do
  78. putStrLn ("\nBye! Visite: www.GeeksBR.com ;-)\n")
  79. return dados
  80. executarOpcao dados _ = do
  81. putStrLn ("\nOpção inválida! Tente novamente...")
  82. putStr "\nPressione <Enter> para voltar ao menu..."
  83. getChar
  84. menu dados
  85.  
  86.  
  87. -- função responsável pelo cadastro de jogadores
  88. cadastrarJogador :: Jogadores -> IO Jogadores
  89. cadastrarJogador dados = do
  90. nome <- getString "\nDigite um nome de usuário: "
  91. if (existeJogador dados nome) then do
  92. putStrLn "\nEsse nome já existe, escolha outro."
  93. putStr "\nPressione <Enter> para continuar..."
  94. getChar
  95. menu dados
  96. else do
  97. arq <- openFile "dados.txt" WriteMode -- abre o arquivo para escrita
  98. hPutStrLn arq (show ((Jogador nome 0):dados))
  99. hClose arq -- fecha o arquivo
  100. putStrLn ("\nUsuário " ++ nome ++ " cadastrado com sucesso.")
  101. putStr "\nPressione <Enter> para continuar..."
  102. getChar
  103. menu ((Jogador nome 0):dados) -- retorna a nova lista para o menu
  104.  
  105.  
  106. -- função que verifica se um jogador existe (o nome do jogador é único)
  107. existeJogador :: Jogadores -> Nome -> Bool
  108. existeJogador [] _ = False
  109. existeJogador ((Jogador n p):xs) nome
  110. | (n == nome) = True
  111. | otherwise = existeJogador xs nome
  112.  
  113.  
  114. -- função que prepara o início do jogo
  115. prepararJogo :: Jogadores -> IO Jogadores
  116. prepararJogo dados = do
  117. jogador1 <- getString "\nDigite o nome do primeiro jogador: "
  118. -- testa se o jogador1 existe
  119. if not (existeJogador dados jogador1) then do
  120. putStrLn "\nEsse jogador não existe!"
  121. putStr "\nPressione <Enter> para continuar..."
  122. getChar -- descarta o Enter
  123. menu dados
  124. else do
  125. jogador2 <- getString "\nDigite o nome do segundo jogador: "
  126. if not (existeJogador dados jogador2) then do
  127. putStrLn "\nEsse jogador não existe!"
  128. putStr "\nPressione <Enter> para continuar..."
  129. getChar -- descarta o Enter
  130. menu dados
  131. else do
  132. -- se chegou aqui, é porque os dois jogadores existem
  133. novoJogo dados jogador1 jogador2
  134.  
  135.  
  136. -- função que inicia um novo jogo
  137. novoJogo :: Jogadores -> Nome -> Nome -> IO Jogadores
  138. novoJogo dados jogador1 jogador2 = do
  139. putStrLn ("\nIniciando o jogo \"" ++
  140. jogador1 ++ " vs " ++ jogador2 ++ "\" ... ")
  141. putStrLn ("\nOs quadrados que possuem números NÃO estão marcados.")
  142. putStrLn ("\n" ++ jogador1 ++ " será o \'X\' e " ++ jogador2 ++ " será o \'O\'. Vamos lá!!")
  143. getChar
  144. {-
  145. A configuração inicial do tabuleiro é
  146. ['1', '2', '3', '4', '5', '6', '7', '8', '9']
  147. Numeração da esquerda para direita e de cima para baixo
  148. Exemplo:
  149. 1 | 2 | 3
  150. -----------
  151. 4 | 5 | 6
  152. -----------
  153. 7 | 8 | 9
  154. -}
  155. -- passa os dados, a configuração inicial, os jogadores e uma flag que indica de quem é
  156. -- a vez: 0 quer dizer que a vez é do jogador1 e 1 quer dizer que a vez é do jogador2
  157. rodarJogo dados ['1', '2', '3', '4', '5', '6', '7', '8', '9'] jogador1 jogador2 0
  158.  
  159.  
  160. -- função que exibe o tabuleiro do jogo da velha
  161. -- recebe a lista de jogadores, a tabela, o nome do jogador1, do jogador2 e um inteiro indicando de quem é a vez
  162. rodarJogo :: Jogadores -> Tabela -> Nome -> Nome -> Vez -> IO Jogadores
  163. rodarJogo dados tabela jogador1 jogador2 vez = menu dados
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement