Trabalho prático LEI 1º ANO - Haskell - Portugal-a-Programar
Trabalho prático LEI 1º ANO
By HIT_Braga, December 27, 2008 in Haskell
Anda por aqui muita gente a trabalhar no assunto
Alguém me sugere como fazer a pontuação das diagonais ??? de forma a que se aumentar o tabuleiro funcione sempre, porque para um tabuleiro fixo n é mto dificil.
o meu tabuleiro é uma lista de listas.
a maneira que eu utilizei talvez não seja a melhor, mas funciona (e agora também não estou para pensar mais nessa parte)
fazes uma função que te aceda ao tabuleiro como se fosse uma matriz. por exemplo: acederTab tabuleiro 2 2, deve dar-te o valor da 2ª linha, 2ª coluna
com isto fazes uma que percorra o tabuleiro na diagona. começa no canto inferior esquerdo, e a cada iteração, vai para o campo abaixo e à direita do anterior. assim que ultrapassar os limites do tabuleiro, vai para a diagonal seguinte. a cada passagem o que faz é: se o valor da casa actual for o valor pretendido, então soma uma unidade ao segmento anterior, se não acrescenta um zero à lista
não sei se me fiz explicar bem (nunca foi grande explicador), mas isto a mim dá como resultado uma lista do tipo: [1,0,0,1,0,3] isto significa que o tabuleiro tem 2 segmentos de 1 e 1 segmento de 3. depois é usar isto para calcular a pontuação final
ah! e falta depois calcular também as diagonais no outro sentido, e isso pode ser feito de forma idêntica a esta
mpalhas desde já obrigado por responderes.
Percebi a ideia mas não sei muito bem como implementar. Podias mostrar um pouco do teu código para tirar umas ideias.
Tenho uma lista de listas.
Cada lista é uma coluna.
Consigo transformar em linhas (lista de listas que são linhas)
Conta pontos na horizontal e vertical.Só falta mesmo diagonais.E como queria que o jogo desse para crescer tem se ser de forma automática.
tou cheio de :wallbash: e já ando a ficar 😡 com as diagonais
Obrigados desde já pelo tempo dispendido
por exemplo para as horizontais:
calculaHor :: Tabuleiro -> Int -> Int -> Int -> [int]
calculaHor tab jogador x y | x > altura_do_tabuleiro = [0] -- se passou da ultima linha, entao ja chegou ao fim. nao pode devolver lista vazia porque isso nao servia para o padrao (cabeca:cauda)
| y > largura_do_tabuleiro = 0: (calculaHor tab 1 (y+1)) -- se passou o fim da linha, vai para o inicio da linha seguinte, e acrescenta um zero à cabeça para dizer que o segmento acaba ali
| pos == jogador = (1+cabeca):cauda -- se a casa actual for igual ao valor que se procura, soma 1 a cabeca da lista (por isso é que se tem que acrescentar os zeros)
| otherwise = 0:cabeca:cauda -- qualquer outro caso acrescenta apenas um zero à lista
where pos = acederTabuleiro x y
(cabeca:cauda) = calculaHor tab jogador (x+1) y -- recursivamente vai para a casa seguinte. como se quer saber as horizontais, essa é a casa á direita
nas guardas eu usei largura_do_tabuleiro, e altura_do_tabuleiro, que não estão definidas, mas acho que dá para perceber o que significam
também provavelmente isto não compila porque foi escrito agora mesmo e sem testar, por isso não deve funcionar, mas dá para ter uma ideia
Ah! aquela funcao acederTabuleiro não defini mas terá que dar o valor que o tabuleiro tem na posicao (x, y)