• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Y_E_T_I

Duvida sobre Função aplicada a Listas

2 mensagens neste tópico

Boas,

Ja vi que está tudo a batalhar para o mesmo trabalho.

Agradecia então ajuda com a seguinte funçao. Preciso que dado um tabuleiro (lista de colunas) me devolva uma lista de tabuleiros com possiveis jogadas para o mesmo. Ou seja, sendo o tabuleiro  [[1,1,0],[1,1,0]] me devolva [[1,1,2],[1,1,0]],[[1,1,0],[1,1,2]]. Sendo estas a possibilidades para jogar com o jogador 2 no respectivo tabuleiro.

Tenho o seguinte código:


jogadaspossiveis :: Tabuleiro -> Tabuleiro
jogadaspossiveis [] = []
jogadaspossiveis  (h:t) = if colunacheia h
                          then h:(jogadaspossiveis t)
                          else (jogar 2 1 (h:t))


jogadaspossiveisaux :: Tabuleiro -> [Tabuleiro]
jogadaspossiveisaux [a] = [(jogadaspossiveis [a])]
jogadaspossiveisaux (h:t) =  if tabuleirocheio (jogadaspossiveis (h:t))
                             then [(h:t)]
                             else (jogadaspossiveis (h:t))  jogadaspossiveisaux(jogadaspossiveis (h:t)))

em que:

Tabuleiro = [[int]]

a funçao jogar recebe um jogador (1 ou 2) a posição no tabuleiro (ou seja a coluna) e um tabuleiro e aplica a jogada devolvendo o tabuleiro com esta ja realizada

a funçao tabuleiro cheio devolve um bool

o problema é que o output apenas me esta a dar a primeira possivel jogada ou seja no caso do tabuleiro acima devolve-me:

[[[1,1,2],[1,1,0]],[[1,1,2],[1,1,0]]]

Agradeço desde ja qualquer ajuda

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a abordar o problema de forma incorrecta.

A melhor forma seria usando a monad de Listas para programação lógica, mas penso que isto é trabalho de 1º ano e portanto seria overkill.

Ou seja, a melhor forma para resolveres o problema seria do estilo.

1 - Obtinhas uma listagem das jogadas possíveis (basicamente uma lista com o número de colunas, pro teu exemplo seria [0,1])

2 - Percorrias essa lista e para cada elemento geravas um novo Tabuleiro como se jogasses nessa coluna. Para tratar de casos em que a jogada não seria possível, seria mais correcto ser um Maybe Tabuleiro, ou seja, Just novotabuleiro se for efectuada uma jogada válida, se for uma jogada inválida então Nothing. Pro teu exemplo, obterias algo do género [Just [[1,1,2],[1,1,0]], Just [[1,1,0],[1,1,2]]], mas se por acaso a 2ª coluna estivesse cheia e não fosse permitido jogar nessa coluna então obterias [Just [[1,1,2],[1,1,1]], Nothing]

3 - Agora o resto é fácil, só tinhas que percorrer a lista obtida no passo anterior e filtrar os Nothings, obtendo os Tabuleiros válidos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora