-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathresta1.hs
148 lines (132 loc) · 6.75 KB
/
resta1.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
import Data.Matrix
import Data.Char
import Tabuleiro
import Jogada
import Validacao
import Constantes
{-
- Exibe as regras do jogo para o usuário
-}
exibirRegras :: IO ()
exibirRegras =
do
putStrLn ("RRRRRRRRRRRRRRRRR tttt 1111111")
putStrLn "R::::::::::::::::R ttt:::t 1::::::1"
putStrLn "R::::::RRRRRR:::::R t:::::t 1:::::::1"
putStrLn "RR:::::R R:::::R t:::::t 111:::::1"
putStrLn " R::::R R:::::R eeeeeeeeeeee ssssssssss ttttttt:::::ttttttt aaaaaaaaaaaaa 1::::1"
putStrLn " R::::R R:::::R ee::::::::::::ee ss::::::::::s t:::::::::::::::::t a::::::::::::a 1::::1"
putStrLn " R::::RRRRRR:::::R e::::::eeeee:::::eess:::::::::::::s t:::::::::::::::::t aaaaaaaaa:::::a 1::::1"
putStrLn " R:::::::::::::RR e::::::e e:::::es::::::ssss:::::stttttt:::::::tttttt a::::a 1::::l"
putStrLn " R::::RRRRRR:::::R e:::::::eeeee::::::e s:::::s ssssss t:::::t aaaaaaa:::::a 1::::l"
putStrLn " R::::R R:::::Re:::::::::::::::::e s::::::s t:::::t aa::::::::::::a 1::::l"
putStrLn " R::::R R:::::Re::::::eeeeeeeeeee s::::::s t:::::t a::::aaaa::::::a 1::::l"
putStrLn " R::::R R:::::Re:::::::e ssssss s:::::s t:::::t tttttta::::a a:::::a 1::::l"
putStrLn "RR:::::R R:::::Re::::::::e s:::::ssss::::::s t::::::tttt:::::ta::::a a:::::a 111::::::111"
putStrLn "R::::::R R:::::R e::::::::eeeeeeee s::::::::::::::s tt::::::::::::::ta:::::aaaa::::::a 1::::::::::1"
putStrLn "R::::::R R:::::R ee:::::::::::::e s:::::::::::ss tt:::::::::::tt a::::::::::aa:::a 1::::::::::1"
putStrLn "RRRRRRRR RRRRRRR eeeeeeeeeeeeee sssssssssss ttttttttttt aaaaaaaaaa aaaa 111111111111"
putStrLn " "
putStrLn "REGRAS:"
putStrLn "O objetivo eh deixar apenas uma peca no tabuleiro apos uma sequencia de movimentos validos."
putStrLn "O tabuleiro possui um espaco vazio no centro, representado pelo caractere '0', com um numero de pecas, representadas pelo caractere '1', que designam uma estrutura pre-definida."
putStrLn "O jogo apresenta duas formas de tabuleiro, a primeira com padrao ingles com 32 pecas e a outra o padrao europeu com 36 pecas."
putStrLn "Um movimento consiste em pegar uma peca e faze-la 'saltar' sobre outra peca, sempre na horizontal ou na vertical, terminando em um espaco vazio, representado pelo caractere '0', adjacente a peca 'saltada'. A peca que foi 'saltada' eh retirada do tabuleiro."
{-
- Mapeira a coluna indexada de A-G para seu valor numérico começando de 1
- Caso não esteja no intervalo especificado, é retornado o valor 8,
- que não passa nas validações
-}
mapeiaLetraColuna :: [Char] -> Int
mapeiaLetraColuna "A" = 1
mapeiaLetraColuna "B" = 2
mapeiaLetraColuna "C" = 3
mapeiaLetraColuna "D" = 4
mapeiaLetraColuna "E" = 5
mapeiaLetraColuna "F" = 6
mapeiaLetraColuna "G" = 7
mapeiaLetraColuna _ = 8
{-
-Confere ao jogador a escolha de uma jogada automática
-}
isJogadaAutomatica :: IO(Bool)
isJogadaAutomatica = do
putStrLn "Deseja realizar uma jogada automatica(s/n)?"
opcao <- getLine
if (opcao == "s") then return True
else if (opcao == "n") then return False
else isJogadaAutomatica
{-
- Realiza os passos para a vitória do jogo.
-}
vitoriaAutomatica :: [[Int]] -> Matrix Char -> IO()
vitoriaAutomatica [] tabuleiro = do
exibirTabuleiro tabuleiro
print "Parabens! Você venceu!"
vitoriaAutomatica (s:ss) tabuleiro = do
let linha = s !! 0
let coluna = s !! 1
let direcao = s !! 2
exibirTabuleiro tabuleiro
vitoriaAutomatica ss $ realizaJogada linha coluna direcao tabuleiro
{-
- Loop principal do jogo, que é finalizado quando não existem mais jogadas a serem realizadas,
- a ultima ação do loop é verificar a vitória do jogador.
- TODO: Ao inserir Strings em entradas que esperam receber Int (linha e direção) é disparado um erro que finaliza a aplicação.
-}
gameLoop tabuleiro
| (existeJogada tabuleiro) =
do
exibirTabuleiro tabuleiro
jogadaAutomatica <- isJogadaAutomatica
if (jogadaAutomatica) then do
gameLoop (realizaJogadaAutomatica tabuleiro)
else
do
putStrLn "Selecione a linha(1-7): "
linhaInput <- getLine
putStrLn "Selecione a coluna(A-G): "
colunaInput <- getLine
putStrLn "Selecione a direção(0 - Cima; 1 - Baixo; 2 - Esquerda; 3 - Direita): "
direcaoInput <- getLine
let linha = read linhaInput
coluna = mapeiaLetraColuna (map toUpper colunaInput)
direcao = read direcaoInput in
if (not (validaEntradaJogada linha coluna direcao))
then do
print "Entrada Invalida"
gameLoop tabuleiro
else if(not (isJogadaValida linha coluna direcao tabuleiro))
then do
print "Jogada Invalida"
gameLoop tabuleiro
else
do
gameLoop $ realizaJogada linha coluna direcao tabuleiro
| otherwise =
do
if (checaVitoria tabuleiro) then
print "Parabens! Você venceu!"
else
print "Voce perdeu, tente novamente!"
{-
- Função que retorna True caso o modo vitoria automática seja delecionado
-}
selecionaModo :: IO (Bool)
selecionaModo = do
putStrLn "Digite: 0 - Vencer Automaticamente, 1 - Jogar"
escolha <- getLine
return ((read escolha) == 0)
{-
- Função main da aplicação, que inicializa o jogo e dispara o gameLoop
-}
main :: IO()
main = do
exibirRegras
putStrLn " "
isVitoriaAutomatica <- selecionaModo
if ( isVitoriaAutomatica ) then
vitoriaAutomatica sequenciaDeVitoria tabuleiroIngles
else do
tabuleiro <- selecionaTabuleiro
gameLoop tabuleiro