-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprincipal.hs
424 lines (376 loc) · 25.8 KB
/
principal.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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
module Principal where
import Control.Concurrent
import System.Process
import DeckFunctions
import CartaFunctions
import JogadorFunctions
import Bot
import Util
import MethodShuffle
import System.IO.Unsafe
type Vez = Int
allCards = [(30,"PRETA","+4"),(30,"PRETA","+4"),(30,"PRETA","+4"),(30,"PRETA","+4"),(40,"PRETA","newColor"),(40,"PRETA","newColor"),(40,"PRETA","newColor"),(40,"PRETA","newColor"), (0,"AMARELA"," "),(1,"AMARELA"," "),(2,"AMARELA"," "),(3,"AMARELA"," "),(4,"AMARELA"," "),(5,"AMARELA"," "),(6,"AMARELA"," "),(7,"AMARELA"," "),(8,"AMARELA"," "),(9,"AMARELA"," "),(70,"AMARELA","BLOCK"),(50,"AMARELA","REVERSE"),(60,"AMARELA","+2"), (70,"AMARELA","BLOCK"),(50,"AMARELA","REVERSE"),(60,"AMARELA","+2"), (0,"VERDE"," "),(1,"VERDE"," "),(2,"VERDE"," "),(3,"VERDE"," "),(4,"VERDE"," "),(5,"VERDE"," "),(6,"VERDE"," "),(7,"VERDE"," "),(8,"VERDE"," "),(9,"VERDE"," "),(70,"VERDE","BLOCK"),(50,"VERDE","REVERSE"),(60,"VERDE","+2"), (70,"VERDE","BLOCK"),(50,"VERDE","REVERSE"),(60,"VERDE","+2"), (0,"AZUL"," "),(1,"AZUL"," "),(2,"AZUL"," "),(3,"AZUL"," "),(4,"AZUL"," "),(5,"AZUL"," "),(6,"AZUL"," "),(7,"AZUL"," "),(8,"AZUL"," "),(9,"AZUL"," "),(70,"AZUL","BLOCK"),(50,"AZUL","REVERSE"),(60,"AZUL","+2"), (70,"AZUL","BLOCK"),(50,"AZUL","REVERSE"),(60,"AZUL","+2"), (0,"VERMELHA"," "),(1,"VERMELHA"," "),(2,"VERMELHA"," "),(3,"VERMELHA"," "),(4,"VERMELHA"," "),(5,"VERMELHA"," "),(6,"VERMELHA"," "),(7,"VERMELHA"," "),(8,"VERMELHA"," "),(9,"VERMELHA"," "),(70,"VERMELHA","BLOCK"),(50,"VERMELHA","REVERSE"),(60,"VERMELHA","+2"), (70,"VERMELHA","BLOCK"),(50,"VERMELHA","REVERSE"),(60,"VERMELHA","+2")]
getString :: String -> IO String
getString str = do
putStr str
res <- getLine
return res
inicio :: IO ()
inicio = do
menu
menu :: IO ()
menu = do
system "cls"
tela_principal
op <- getChar
getChar
executarOpcao op
executarOpcao :: Char -> IO ()
executarOpcao '1' = prepararJogo allCards
executarOpcao '0' = do
putStrLn ("\nAté breve \n")
executarOpcao '2' = do
showRules
getChar
menu
executarOpcao _ = do
putStrLn ("\nOpção inválida! Tente novamente...")
getChar
menu
prepararJogo :: Deck -> IO ()
prepararJogo allCards = do
let pilha = unsafePerformIO $ (shuffle allCards)
let deck1 = pegaSete pilha
let deck2 = pegaSete (tiraSete pilha)
let deck3 = pegaSete (tiraSete (tiraSete pilha))
putStrLn "Pressione qualquer tecla para iniciar"
getChar
novoJogo pilha deck1 deck2 deck3
novoJogo :: Deck -> Deck -> Deck -> Deck -> IO ()
novoJogo pilha deck1 deck2 deck3 = do
putStrLn ("\nIniciando o jogo: Você vs Bozonaro vs Guedes" ++ "\" ... ")
putStrLn ("lets do this!!\n")
rodarJogo (0,"first card","none") (tiraSete (tiraSete ( tiraSete pilha))) deck1 deck2 deck3 1 False
rodarJogo :: Carta -> Deck -> Deck -> Deck -> Deck -> Vez -> Bool -> IO ()
rodarJogo topo pilha deck1 deck2 deck3 vez reversed = do
putStr ("--------------------------------------------------------------------\n")
if(emptyDeck pilha) then do
putStrLn("O deck foi esgotado! O jogador com menos cartas venceu!")
putStrLn(vencedor deck1 deck2 deck3)
else do
if (venceu deck1) then do
putStrLn ("Você venceu, parabéns!!")
else if (venceu deck2) then do
putStrLn ("Bozonaro destruiu o Brasil, você perdeu!!")
else if (venceu deck3) then do
putStrLn ("Guedes conseguiu a reforma da previdência, você perdeu!!")
else if (vez == 1) then do
showTopo topo
gerenciaPlayer topo pilha deck1 deck2 deck3 reversed
else if (vez == 2) then do
showTopo topo
gerenciaBot1 topo pilha deck1 deck2 deck3 reversed
else do
showTopo topo
gerenciaBot2 topo pilha deck1 deck2 deck3 reversed
gerenciaPlayer :: Carta -> Deck -> Deck -> Deck -> Deck -> Bool -> IO ()
gerenciaPlayer topo pilha deck1 deck2 deck3 reversed = do
if (podeJogar deck1 topo) then do -- SE TEM CARTA QUE DA MATCH
putStrLn (" Sua vez - " ++ (next reversed))
status deck2 deck3
showCards deck1 topo 0
putStrLn ("\nEscolha uma carta: ")
opcao <- getLine
if (checkInput opcao) then do
let op = read opcao
if (op >= 0 && op < size deck1 && cartaValida (getCarta deck1 op) topo) then do -- SE A CARTA FOR VÁLIDA
if (reversed == True) then do -- SE JOGO ESTÁ INVERTIDO
if (getEffect(getCarta deck1 op) == "REVERSE") then do -- carta reverse
rodarJogo (getCarta deck1 op) pilha (pickPlay deck1 op) deck2 deck3 2 False
else if (getEffect(getCarta deck1 op) == "BLOCK") then do -- carta block
msgBlock 1 reversed
rodarJogo (getCarta deck1 op) pilha (pickPlay deck1 op) deck2 deck3 2 reversed
else if (getEffect(getCarta deck1 op) == "+2") then do -- carta +2
rodarJogo (getCarta deck1 op) (tiraDuas pilha) (pickPlay deck1 op) deck2 (deck3++(pegaDuas pilha)) 3 reversed
else if (getEffect(getCarta deck1 op) == "+4") then do -- carta +4
putStrLn("Selecione uma cor entre AZUL, VERDE, AMARELA ou VERMELHA")
novaCor <- getLine
if(novaCor == "AZUL" || novaCor == "VERDE" || novaCor == "AMARELA" || novaCor == "VERMELHA") then do
rodarJogo (setColor novaCor (getCarta deck1 op)) (tiraQuatro pilha) (pickPlay deck1 op) deck2 (deck3++(pegaQuatro pilha)) 3 reversed
else do
putStrLn("Cor inválida! Escolha a carta novamente.")
gerenciaPlayer topo pilha deck1 deck2 deck3 reversed
else if (getEffect(getCarta deck1 op) == "newColor") then do -- carta nova Cor
putStrLn("Selecione uma cor entre AZUL, VERDE, AMARELA ou VERMELHA")
novaCor <- getLine
if(novaCor == "AZUL" || novaCor == "VERDE" || novaCor == "AMARELA" || novaCor == "VERMELHA") then do
rodarJogo (setColor novaCor (getCarta deck1 op)) pilha (pickPlay deck1 op) deck2 deck3 3 reversed
else do
putStrLn("Cor inválida! Escolha a carta novamente.")
gerenciaPlayer topo pilha deck1 deck2 deck3 reversed
else do rodarJogo (getCarta deck1 op) pilha (pickPlay deck1 op) deck2 deck3 3 reversed -- carta simples
else do -- SE JOGO NÃO ESTÁ INVERTIDO
if (getEffect(getCarta deck1 op) == "REVERSE") then do
rodarJogo (getCarta deck1 op) pilha (pickPlay deck1 op) deck2 deck3 3 True
else if (getEffect(getCarta deck1 op) == "BLOCK") then do -- carta block
msgBlock 1 reversed
rodarJogo (getCarta deck1 op) pilha (pickPlay deck1 op) deck2 deck3 3 reversed
else if (getEffect(getCarta deck1 op) == "+2") then do -- carta +2
rodarJogo (getCarta deck1 op) (tiraDuas pilha) (pickPlay deck1 op) (deck2++(pegaDuas pilha)) deck3 2 reversed
else if (getEffect(getCarta deck1 op) == "+4") then do -- carta +4
putStrLn("Selecione uma cor entre AZUL, VERDE, AMARELA ou VERMELHA")
novaCor <- getLine
if(novaCor == "AZUL" || novaCor == "VERDE" || novaCor == "AMARELA" || novaCor == "VERMELHA") then do
rodarJogo (setColor novaCor (getCarta deck1 op)) (tiraQuatro pilha) (pickPlay deck1 op) (deck2++(pegaQuatro pilha)) deck3 2 reversed
else do
putStrLn("Cor inválida! Escolha a carta novamente.")
gerenciaPlayer topo pilha deck1 deck2 deck3 reversed
else if (getEffect(getCarta deck1 op) == "newColor") then do -- carta nova Cor
putStrLn("Selecione uma cor entre AZUL, VERDE, AMARELA ou VERMELHA")
novaCor <- getLine
if(novaCor == "AZUL" || novaCor == "VERDE" || novaCor == "AMARELA" || novaCor == "VERMELHA") then do
rodarJogo (setColor novaCor (getCarta deck1 op)) pilha (pickPlay deck1 op) deck2 deck3 2 reversed
else do
putStrLn("Cor inválida! Escolha a carta novamente.")
gerenciaPlayer topo pilha deck1 deck2 deck3 reversed
else do rodarJogo (getCarta deck1 op) pilha (pickPlay deck1 op) deck2 deck3 2 reversed -- carta simples
else do
putStrLn ("Carta inválida, tente outra carta!!\n")
rodarJogo topo pilha deck1 deck2 deck3 1 reversed
else do
putStrLn("Entrada inválida!\n")
gerenciaPlayer topo pilha deck1 deck2 deck3 reversed
else do -- SE NAO TEM CARTA QUE DA MATCH
status deck2 deck3
showCards deck1 topo 0
putStrLn "\nVoce nao possui carta valida, pegue uma da pilha pressionando <Enter>"
getChar
if (cartaValida (pegaUma pilha) topo) then do
putStrLn (showCard (pegaUma pilha) ++ "jogada\n")
if (reversed == True) then do
if (getEffect(pegaUma pilha) == "BLOCK") then do
msgBlock 1 reversed
rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 2 reversed
else if (getEffect(pegaUma pilha) == "REVERSE") then do
rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 2 False
else if (getEffect(pegaUma pilha) == "+2") then do
let pilla = tiraUma pilha
rodarJogo (pegaUma pilha) (tiraDuas pilla) deck1 deck2 (deck3++(pegaDuas pilla)) 3 reversed
else if (getEffect(pegaUma pilha) == "+4") then do -- carta +4
let pilla = tiraUma pilha
putStrLn("Selecione uma cor entre AZUL, VERDE, AMARELA ou VERMELHA")
novaCor <- getLine
if(novaCor == "AZUL" || novaCor == "VERDE" || novaCor == "AMARELA" || novaCor == "VERMELHA") then do
rodarJogo (setColor novaCor (pegaUma pilha)) (tiraQuatro pilla) deck1 deck2 (deck3++(pegaQuatro pilla)) 3 reversed
else do
putStrLn("Cor inválida! Escolha a carta novamente.")
gerenciaPlayer topo pilla (deck1++[pegaUma pilha]) deck2 deck3 reversed
else if (getEffect(pegaUma pilha) == "newColor") then do -- carta nova Cor
let pilla = tiraUma pilha
putStrLn("Selecione uma cor entre AZUL, VERDE, AMARELA ou VERMELHA")
novaCor <- getLine
if(novaCor == "AZUL" || novaCor == "VERDE" || novaCor == "AMARELA" || novaCor == "VERMELHA") then do
rodarJogo (setColor novaCor (pegaUma pilha)) pilla deck1 deck2 deck3 3 reversed
else do
putStrLn("Cor inválida! Escolha a carta novamente.")
gerenciaPlayer topo pilla (deck1++[pegaUma pilha]) deck2 deck3 reversed
else do rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 3 reversed
else do -- Se nao estiver invertido
if (getEffect(pegaUma pilha) == "BLOCK") then do
msgBlock 1 reversed
rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 3 reversed
else if (getEffect(pegaUma pilha) == "REVERSE") then do
rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 3 True
else if (getEffect(pegaUma pilha) == "+2") then do
let pilla = tiraUma pilha
rodarJogo (pegaUma pilha) (tiraDuas pilla) deck1 (deck2++(pegaDuas pilla)) deck3 2 reversed
else if (getEffect(pegaUma pilha) == "+4") then do -- carta +4
let pilla = tiraUma pilha
putStrLn("Selecione uma cor entre AZUL, VERDE, AMARELA ou VERMELHA")
novaCor <- getLine
if(novaCor == "AZUL" || novaCor == "VERDE" || novaCor == "AMARELA" || novaCor == "VERMELHA") then do
rodarJogo (setColor novaCor (pegaUma pilha)) (tiraQuatro pilla) deck1 (deck2++(pegaQuatro pilla)) deck3 2 reversed
else do
putStrLn("Cor inválida! Escolha a carta novamente.")
gerenciaPlayer topo pilla (deck1++[pegaUma pilha]) deck2 deck3 reversed
else if (getEffect(pegaUma pilha) == "newColor") then do -- carta nova Cor
let pilla = tiraUma pilha
putStrLn("Selecione uma cor entre AZUL, VERDE, AMARELA ou VERMELHA")
novaCor <- getLine
if(novaCor == "AZUL" || novaCor == "VERDE" || novaCor == "AMARELA" || novaCor == "VERMELHA") then do
rodarJogo (setColor novaCor (pegaUma pilha)) pilla deck1 deck2 deck3 2 reversed
else do
putStrLn("Cor inválida! Escolha a carta novamente.")
gerenciaPlayer topo pilla (deck1++[pegaUma pilha]) deck2 deck3 reversed
else do rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 2 reversed
else do
putStrLn (showCard (pegaUma pilha) ++ "adicionada em sua mão\n")
if (reversed == True) then do
rodarJogo topo (tiraUma pilha) (deck1 ++ [pegaUma pilha]) deck2 deck3 3 reversed
else do rodarJogo topo (tiraUma pilha) (deck1 ++ [pegaUma pilha]) deck2 deck3 2 reversed
gerenciaBot1 :: Carta -> Deck -> Deck -> Deck -> Deck -> Bool -> IO ()
gerenciaBot1 topo pilha deck1 deck2 deck3 reversed = do
putStrLn (" Bozonaro está jogando...\n")
threadDelay 2000000
if (podeJogar deck2 topo) then do
if (reversed == True) then do
let op = escolheJogada deck2 deck1 topo
if (getEffect(getCarta deck2 op) == "REVERSE") then do
rodarJogo (getCarta deck2 op) pilha deck1 (pickPlay deck2 op) deck3 3 False
else if (getEffect(getCarta deck2 op) == "BLOCK") then do
msgBlock 2 reversed
rodarJogo (getCarta deck2 op) pilha deck1 (pickPlay deck2 op) deck3 3 reversed
else if (getEffect(getCarta deck2 op) == "+2") then do
rodarJogo (getCarta deck2 op) (tiraDuas pilha) (deck1++(pegaDuas pilha)) (pickPlay deck2 op) deck3 1 reversed
else if (getEffect(getCarta deck2 op) == "+4") then do -- carta +4
let newColor = selecionaCor deck2
rodarJogo (setColor newColor (getCarta deck2 op)) (tiraQuatro pilha) (deck1++(pegaQuatro pilha)) (pickPlay deck2 op) deck3 1 reversed
else if (getEffect(getCarta deck2 op) == "newColor") then do -- carta nova Cor
let newColor = selecionaCor deck2
rodarJogo (setColor newColor (getCarta deck2 op)) pilha deck1 (pickPlay deck2 op) deck3 1 reversed
else do rodarJogo (getCarta deck2 op) pilha deck1 (pickPlay deck2 op) deck3 1 reversed
else do
let op = escolheJogada deck2 deck3 topo
if (getEffect(getCarta deck2 op) == "REVERSE") then do
rodarJogo (getCarta deck2 op) pilha deck1 (pickPlay deck2 op) deck3 1 True
else if (getEffect(getCarta deck2 op) == "BLOCK") then do
msgBlock 2 reversed
rodarJogo (getCarta deck2 op) pilha deck1 (pickPlay deck2 op) deck3 1 reversed
else if (getEffect(getCarta deck2 op) == "+2") then do
rodarJogo (getCarta deck2 op) (tiraDuas pilha) deck1 (pickPlay deck2 op) (deck3++(pegaDuas pilha)) 3 reversed
else if (getEffect(getCarta deck2 op) == "+4") then do -- carta +4
let newColor = selecionaCor deck2
rodarJogo (setColor newColor (getCarta deck2 op)) (tiraQuatro pilha) deck1 (pickPlay deck2 op) (deck3++(pegaQuatro pilha)) 3 reversed
else if (getEffect(getCarta deck2 op) == "newColor") then do -- carta nova Cor
let newColor = selecionaCor deck2
rodarJogo (setColor newColor (getCarta deck2 op)) pilha deck1 (pickPlay deck2 op) deck3 3 reversed
else do rodarJogo (getCarta deck2 op) pilha deck1 (pickPlay deck2 op) deck3 3 reversed
else do -- Se nao tem carta, entao pega 1
if (cartaValida (pegaUma pilha) topo) then do
putStrLn (showCard (pegaUma pilha) ++ "jogada\n")
if (reversed == True) then do
if (getEffect(pegaUma pilha) == "BLOCK") then do
msgBlock 2 reversed
rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 3 reversed
else if (getEffect(pegaUma pilha) == "REVERSE") then do
rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 3 False
else if (getEffect(pegaUma pilha) == "+2") then do
let pilla = tiraUma pilha
rodarJogo (pegaUma pilha) (tiraDuas pilla) (deck1++(pegaDuas pilla)) deck2 deck3 1 reversed
else if (getEffect(pegaUma pilha) == "+4") then do -- carta +4
let pilla = tiraUma pilha
let newColor = selecionaCor deck2
rodarJogo (setColor newColor (pegaUma pilha)) (tiraQuatro pilla) (deck1++(pegaQuatro pilla)) deck2 deck3 1 reversed
else if (getEffect(pegaUma pilha) == "newColor") then do -- carta nova Cor
let pilla = tiraUma pilha
let newColor = selecionaCor deck2
rodarJogo (setColor newColor (pegaUma pilha)) pilla deck1 deck2 deck3 1 reversed
else do rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 1 reversed
else do
if (getEffect(pegaUma pilha) == "BLOCK") then do
msgBlock 2 reversed
rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 1 reversed
else if (getEffect(pegaUma pilha) == "REVERSE") then do
rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 1 False
else if (getEffect(pegaUma pilha) == "+2") then do
let pilla = tiraUma pilha
rodarJogo (pegaUma pilha) (tiraDuas pilla) deck1 deck2 (deck3++(pegaDuas pilla)) 3 reversed
else if (getEffect(pegaUma pilha) == "+4") then do -- carta +4
let pilla = tiraUma pilha
let newColor = selecionaCor deck2
rodarJogo (setColor newColor (pegaUma pilha)) (tiraQuatro pilla) deck1 deck2 (deck3++(pegaQuatro pilla)) 3 reversed
else if (getEffect(pegaUma pilha) == "newColor") then do -- carta nova Cor
let pilla = tiraUma pilha
let newColor = selecionaCor deck2
rodarJogo (setColor newColor (pegaUma pilha)) pilla deck1 deck2 deck3 3 reversed
else do rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 3 reversed
else do
putStrLn ("uma carta foi adicionada na mão de Bozonaro\n")
if (reversed == True) then do
rodarJogo topo (tiraUma pilha) deck1 (deck2 ++ [pegaUma pilha]) deck3 1 reversed
else do rodarJogo topo (tiraUma pilha) deck1 (deck2 ++ [pegaUma pilha]) deck3 3 reversed
gerenciaBot2 :: Carta -> Deck -> Deck -> Deck -> Deck -> Bool -> IO ()
gerenciaBot2 topo pilha deck1 deck2 deck3 reversed = do
putStrLn (" Guedes está jogando...\n")
threadDelay 2000000
if (podeJogar deck3 topo) then do
if (reversed == True) then do
let op = escolheJogada deck3 deck2 topo
if (getEffect(getCarta deck3 op) == "REVERSE") then do
rodarJogo (getCarta deck3 op) pilha deck1 deck2 (pickPlay deck3 op) 1 False
else if (getEffect(getCarta deck3 op) == "BLOCK") then do
msgBlock 3 reversed
rodarJogo (getCarta deck3 op) pilha deck1 deck2 (pickPlay deck3 op) 1 reversed
else if (getEffect(getCarta deck3 op) == "+2") then do
rodarJogo (getCarta deck3 op) (tiraDuas pilha) deck1 (deck2++(pegaDuas pilha)) (pickPlay deck3 op) 2 reversed
else if (getEffect(getCarta deck3 op) == "+4") then do -- carta +4
let newColor = selecionaCor deck3
rodarJogo (setColor newColor (getCarta deck3 op)) (tiraQuatro pilha) deck1 (deck2++(pegaQuatro pilha)) (pickPlay deck3 op) 2 reversed
else if (getEffect(getCarta deck3 op) == "newColor") then do -- carta nova Cor
let newColor = selecionaCor deck3
rodarJogo (setColor newColor (getCarta deck3 op)) pilha deck1 deck2 (pickPlay deck3 op) 2 reversed
else do rodarJogo (getCarta deck3 op) pilha deck1 deck2 (pickPlay deck3 op) 2 reversed
else do
let op = escolheJogada deck3 deck1 topo
if (getEffect(getCarta deck3 op) == "REVERSE") then do
rodarJogo (getCarta deck3 op) pilha deck1 deck2 (pickPlay deck3 op) 2 True
else if (getEffect(getCarta deck3 op) == "BLOCK") then do
msgBlock 3 reversed
rodarJogo (getCarta deck3 op) pilha deck1 deck2 (pickPlay deck3 op) 2 reversed
else if (getEffect(getCarta deck3 op) == "+2") then do
rodarJogo (getCarta deck3 op) (tiraDuas pilha) (deck1++(pegaDuas pilha)) deck2 (pickPlay deck3 op) 1 reversed
else if (getEffect(getCarta deck3 op) == "+4") then do -- carta +4
let newColor = selecionaCor deck3
rodarJogo (setColor newColor (getCarta deck3 op)) (tiraQuatro pilha) (deck1++(pegaQuatro pilha)) deck2 (pickPlay deck3 op) 1 reversed
else if (getEffect(getCarta deck3 op) == "newColor") then do -- carta nova Cor
let newColor = selecionaCor deck3
rodarJogo (setColor newColor (getCarta deck3 op)) pilha deck1 deck2 (pickPlay deck3 op) 1 reversed
else do rodarJogo (getCarta deck3 op) pilha deck1 deck2 (pickPlay deck3 op) 1 reversed
else do
if (cartaValida (pegaUma pilha) topo) then do
putStrLn (showCard (pegaUma pilha) ++ "jogada\n")
if (reversed == True) then do
if (getEffect(pegaUma pilha) == "BLOCK") then do
msgBlock 3 reversed
rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 1 reversed
else if (getEffect(pegaUma pilha) == "REVERSE") then do
rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 1 False
else if (getEffect(pegaUma pilha) == "+2") then do
let pilla = tiraUma pilha
rodarJogo (pegaUma pilha) (tiraDuas pilla) deck1 (deck2++(pegaDuas pilla)) deck3 2 reversed
else if (getEffect(pegaUma pilha) == "+4") then do -- carta +4
let pilla = tiraUma pilha
let newColor = selecionaCor deck3
rodarJogo (setColor newColor (pegaUma pilha)) (tiraQuatro pilla) deck1 (deck2++(pegaQuatro pilla)) deck3 2 reversed
else if (getEffect(pegaUma pilha) == "newColor") then do -- carta nova Cor
let pilla = tiraUma pilha
let newColor = selecionaCor deck3
rodarJogo (setColor newColor (pegaUma pilha)) pilla deck1 deck2 deck3 2 reversed
else do rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 2 reversed
else do
if (getEffect(pegaUma pilha) == "BLOCK") then do
msgBlock 3 reversed
rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 2 reversed
else if (getEffect(pegaUma pilha) == "REVERSE") then do
rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 2 False
else if (getEffect(pegaUma pilha) == "+2") then do
let pilla = tiraUma pilha
rodarJogo (pegaUma pilha) (tiraDuas pilla) (deck1++(pegaDuas pilla)) deck2 deck3 1 reversed
else if (getEffect(pegaUma pilha) == "+4") then do -- carta +4
let pilla = tiraUma pilha
let newColor = selecionaCor deck3
rodarJogo (setColor newColor (pegaUma pilha)) (tiraQuatro pilla) (deck1++(pegaQuatro pilla)) deck2 deck3 1 reversed
else if (getEffect(pegaUma pilha) == "newColor") then do -- carta nova Cor
let pilla = tiraUma pilha
let newColor = selecionaCor deck3
rodarJogo (setColor newColor (pegaUma pilha)) pilla deck1 deck2 deck3 1 reversed
else do rodarJogo (pegaUma pilha) (tiraUma pilha) deck1 deck2 deck3 1 reversed
else do
putStrLn ("uma carta foi adicionada na mão de Guedes\n")
if (reversed == True) then do
rodarJogo topo (tiraUma pilha) deck1 deck2 (deck3 ++ [pegaUma pilha]) 2 reversed
else do rodarJogo topo (tiraUma pilha) deck1 (deck3 ++ [pegaUma pilha]) deck3 1 reversed
vencedor :: Deck -> Deck -> Deck -> String
vencedor jogador bot1 bot2 | (size jogador) <= (size bot1) && (size jogador) <= (size bot2) = "Você venceu!!"
| (size bot1) < (size bot2) = "Bozonaro venceu!!"
| otherwise = "Dilmãe venceu!!"