-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJuego.hs
executable file
·171 lines (155 loc) · 9.72 KB
/
Juego.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
import Chinchon
import System.Random
import System.IO
import Control.Monad
puntajeMaximo = 100
main :: IO ()
main = do
hSetEncoding stdout utf8
hSetBuffering stdin LineBuffering
estadoInicial <- configurar
jugar estadoInicial 1 0
-- configura el juego para iniciar
configurar :: IO (EstadoDeJuego)
configurar = do
-- mezclar cartas
mazo <- shuffleIO nuevoMazo
-- crear jugador
putStrLn "Cual es tu nombre?"
jugador <- nuevoJugador <$> getLine
let computadora = nuevoJugador "Computadora"
-- repartir 7 cartas a todos los jugadores
let (mazo', jugador') = repartirNCartasAJugador 7 mazo jugador
let jugador'' = (Jugador (nombre jugador') (ordenarTodasCartas (mano jugador')) [] [] 0)
let (mazo'', computadora') = repartirNCartasAJugador 7 mazo' computadora
let computadora'' = configurarComputadora computadora'
-- dar vuelta 1 carta y poner en pila de descartadas
let (cartaDescartada, mazoAux) = repartir mazo''
let pilaDescartada = [cartaDescartada]
mostrarPuntajes 0 0
return (jugador'', computadora'', mazoAux, pilaDescartada)
-- Se utiliza para repartir las cartas luego de la primera ronda
reConfigurar :: Jugador -> Jugador -> IO (EstadoDeJuego)
reConfigurar (Jugador nombreJugador _ _ _ puntosJugador) computadoraEst@(Jugador nombreComputadora manoComputadora _ _ puntosComputadora) = do
-- mezclar cartas
mazo <- shuffleIO nuevoMazo
putStrLn $ "Mano de la computadora " ++ mostrarManoCompu computadoraEst
let jugador = (Jugador nombreJugador [] [] [] puntosJugador)
let computadora = (Jugador nombreComputadora [] [] [] puntosComputadora)
-- repartir 7 cartas a todos los jugadores
let (mazo', jugador') = repartirNCartasAJugador 7 mazo jugador
let jugador'' = (Jugador (nombre jugador') (ordenarTodasCartas (mano jugador')) [] [] puntosJugador)
let (mazo'', computadora') = repartirNCartasAJugador 7 mazo' computadora
let computadora'' = configurarComputadora computadora'
-- dar vuelta 1 carta y poner en pila de descartadas
let (cartaDescartada, mazoAux) = repartir mazo''
let pilaDescartada = [cartaDescartada]
mostrarPuntajes puntosJugador puntosComputadora
return (jugador'', computadora'', mazoAux, pilaDescartada)
-- controla si numero es par o impar, se usa para determinar a quien le toca jugar
esPar :: Int -> Bool
esPar 0 = True
esPar n = n `rem` 2 == 0
-- juego
jugar :: EstadoDeJuego -> Int -> Int -> IO ()
jugar estado@(jugador, computadora, mazo, pilaDescartadas) turno corto
| length mazo == 0 = do
let pilaDescartadas' = head pilaDescartadas
mazo' <- shuffleIO (tail pilaDescartadas)
jugar (jugador, computadora, mazo', [pilaDescartadas']) turno corto
| corto == 1 && noPuedeCortar (mano jugador) = do
putStrLn $ "No podés cortar todavia! Intentá cuando tengas combinaciones.\n"
jugar estado (turno+1) 0
| corto == 2 && noPuedeCortar (mano computadora) = jugar estado (turno+1) 0
| (puntos jugador > puntajeMaximo) && (puntos computadora < puntajeMaximo) = putStrLn $ "Perdiste! La computadora ganó el juego! \nTus puntos: " ++ show (puntos jugador) ++ "\nPuntos de la computadora: " ++ show (puntos computadora)
| (puntos jugador < puntajeMaximo) && (puntos computadora > puntajeMaximo) = putStrLn $ "Ganaste! La computadora perdió el juego! \nTus puntos: " ++ show (puntos jugador) ++ "\nPuntos de la computadora: " ++ show (puntos computadora)
| (puntos jugador > puntajeMaximo) && (puntos computadora > puntajeMaximo) && (puntos jugador > puntos computadora) = putStrLn $ "Perdiste! La computadora ganó el juego! \nTus puntos: " ++ show (puntos jugador) ++ "\nPuntos de la computadora: " ++ show (puntos computadora)
| (puntos jugador > puntajeMaximo) && (puntos computadora > puntajeMaximo) && not (puntos jugador > puntos computadora) = putStrLn $ "Ganaste! La computadora perdió el juego! \nTus puntos: " ++ show (puntos jugador) ++ "\nPuntos de la computadora: " ++ show (puntos computadora)
| corto == 1 && esChinchon (mano jugador) = putStrLn $ "Ganaste con Chinchon! La computadora perdió el juego! \nTus puntos: " ++ show (puntos jugador) ++ "\nPuntos de la computadora: " ++ show (puntos computadora + puntajeMaximo)
| corto == 1 && puedeGanarMenosDiez (mano jugador) = do
putStrLn $ "Ganaste la ronda con menos 10! " ++ mostrarMano estado
let puntosComputadora = calcularPuntos computadora
let puntosTotalComputadora = puntos computadora + puntosComputadora
let puntosTotalJugador = puntos jugador - 10
let puntosJugador = calcularPuntos jugador
putStrLn $ "\nLa computadora suma: " ++ show puntosComputadora
putStrLn $ "\n\n\n"
let computadora' = (Jugador (nombre computadora) (mano computadora) (seguras computadora) (semiSeguras computadora) puntosTotalComputadora)
let jugador' = (Jugador (nombre jugador) (mano jugador) (seguras jugador) (semiSeguras jugador) puntosTotalJugador)
estado' <- reConfigurar jugador' computadora'
jugar estado' turno 0
| corto == 1 && puedeGanarSobraUna (mano jugador) = do
let puntosComputadora = calcularPuntos computadora
let puntosTotalComputadora = puntos computadora + puntosComputadora
let puntosJugador = calcularPuntos jugador
let puntosTotalJugador = puntos jugador + puntosJugador
putStrLn $ "Ganaste la ronda! Sumas: " ++ show puntosJugador
putStrLn $ "\nLa computadora suma: " ++ show puntosComputadora
putStrLn $ "\n\n\n"
let computadora' = (Jugador (nombre computadora) (mano computadora) (seguras computadora) (semiSeguras computadora) puntosTotalComputadora)
let jugador' = (Jugador (nombre jugador) (mano jugador) (seguras jugador) (semiSeguras jugador) puntosTotalJugador)
estado' <- reConfigurar jugador' computadora'
jugar estado' turno 0
| corto == 2 && esChinchon (mano computadora) = putStrLn $ "Perdiste! La computadora ganó el juego con Chinchon! \nTus puntos: " ++ show (puntos jugador + puntajeMaximo) ++ "\nPuntos de la computadora: " ++ show (puntos computadora)
| corto == 2 && puedeGanarMenosDiez (mano computadora) = do
putStrLn $ "Computadora gano la ronda, con menos 10! "
let puntosComputadora = calcularPuntos computadora
let puntosTotalComputadora = puntos computadora - 10
let puntosJugador = calcularPuntos jugador
let puntosTotalJugador = puntos jugador + puntosJugador
putStrLn $ "\nVos sumás: " ++ show puntosJugador
putStrLn $ "\n\n\n"
let computadora' = (Jugador (nombre computadora) (mano computadora) (seguras computadora) (semiSeguras computadora) puntosTotalComputadora)
let jugador' = (Jugador (nombre jugador) (mano jugador) (seguras jugador) (semiSeguras jugador) puntosTotalJugador)
estado' <- reConfigurar jugador' computadora'
jugar estado' turno 0
| corto == 2 && puedeGanarSobraUna (mano computadora) = do
let puntosComputadora = calcularPuntos computadora
let puntosTotalComputadora = puntos computadora + puntosComputadora
let puntosJugador = calcularPuntos jugador
let puntosTotalJugador = puntos jugador + puntosJugador
putStrLn $ "Computadora gano la ronda, suma: " ++ show puntosComputadora
putStrLn $ "\nVos sumás: " ++ show puntosJugador
let computadora' = (Jugador (nombre computadora) (mano computadora) (seguras computadora) (semiSeguras computadora) puntosTotalComputadora)
let jugador' = (Jugador (nombre jugador) (mano jugador) (seguras jugador) (semiSeguras jugador) puntosTotalJugador)
estado' <- reConfigurar jugador' computadora'
jugar estado' turno 0
| not (esPar turno) = do
estado' <- levantarCarta estado
putStrLn "Que querés hacer ahora? \n 1) Tirar carta\n 2) Tirar y cortar"
respuesta <- readLn
estado'' <- descartarCarta estado'
if respuesta == 2
then jugar estado'' (turno) 1
else
jugar estado'' (turno+1) 0
| otherwise = do
let estado' = jugadaComputadora estado
let computadoraDespues = devolverComputadoraEstado estado'
if puedeGanarComputadora computadoraDespues
then jugar estado' (turno) 2
else jugar estado' (turno+1) 0
-- le pregunta al usuario que carta quiere levantar
levantarCarta :: EstadoDeJuego -> IO EstadoDeJuego
levantarCarta estado = do
putStrLn $ "\n----------------------------------------------"
putStrLn $ "\nTu mano: " ++ mostrarMano estado
putStrLn $ "Que te gustaría hacer ahora?\n 1) tomar una carta desconocida\n 2) tomar la ultima carta descartada (" ++ (mostrarUltimaCartaDescartada estado) ++ ")"
respuesta <- readLn
return $ (if respuesta == 1 then tomarCartaDesconocida estado else tomarUltimaCartaDescartada estado)
-- le pregunta al usuario que carta quiere descartar
descartarCarta :: EstadoDeJuego -> IO EstadoDeJuego
descartarCarta ((Jugador nombre mano s ss puntos), computadora, mazoRestante, pilaDescartadas) = do
putStrLn $ "\nTu mano: " ++ show mano
putStrLn "Elegí una carta a descartar (1-8)"
n <- readLn
let (mano', pilaDescartadas') = descartar mano n pilaDescartadas
return ((Jugador nombre mano' s ss puntos), computadora, mazoRestante, pilaDescartadas')
-- muestra los puntajes al final de cada ronda
mostrarPuntajes :: Int -> Int -> IO ()
mostrarPuntajes pJugador pComputadora = do
putStrLn $ "\nPuntajes:"
putStrLn $ "------------------------------------------------------------------------------------------"
putStrLn $ "Tu Puntaje: " ++ show pJugador
putStrLn $ "\nPuntaje de la computadora: " ++ show pComputadora
putStrLn $ "==========================================================================================\n"