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

link

Duvida..fazer jogada

23 mensagens neste tópico

Boa tarde,

Queria que me ajudassem a ver qual é o erro aqui nesta função, eu acho que está tudo bem mas isto continua-me a dar erro, ja experimentei por as chavetas e os pontos e vírgulas e tirei-os mas continua a dar erro, ou na pattern, ou no let, se me pudessem ajudar agradecia.

lejogada = do putStr "Indica a coluna onde queres jogar"
      	l <- getChar
	let l1 = ((read l):Int)
	in if (jogadavalida tabuleiro l1)
	   then return (joga tabuleiro l1 0))
	   else do putStrln "Coluna cheia ou invalida"
	   	      lejogada

Ainda não defini o tabuleiro a actualizar em cada jogada, pus só uma lista definida só para testar essa função e o 0 é o numero a acrescentar na lista

Se me pudessem tambem dizer como ponho a actualizar o tabuleiro e a alternar de 0 para 1 em cada jogada agradecia imenso

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quando uso o let dentro do do, eu não costumo usar o in. No else deve faltar um return.

Mas dava jeito colocares aqui a mensagem de erro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

os dois pontos que faltavam foi um lapso meu, retirei o in então, o erro que me dá é este: Parse Error in pattern na linha onde tem o "do"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu pus agora assim o código:

lejogada = do { putStr "Indica a coluna onde queres jogar ";
      	l <- getChar
	let l1 = ((read l)::Int)
	if (jogadavalida tabuleiro l1)
	   then return (joga tabuleiro l1 0))
	   else do { putStrln "Coluna cheia ou invalida ";
	   	     lejogada
	   	   }
      }

mas agora dá-me este erro: Parse error on input 'let'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Falta um ponto e vírgula depois do getChar. O putStrLn é com L maiúsculo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

bem agora da-me outro erro (isto nao tem fim xD)

    Couldn't match expected type `String' against inferred type `Char'
    In the first argument of `read', namely `l'
    In the expression: ((read l) :: Int)
    In the definition of `l1': l1 = ((read l) :: Int)

obrigado desde já pela paciência

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E que tal olhares para o erro e tentares perceber qual é o problema?

É que a mensagem de erro dá informação mais do que suficiente para ver qual é o erro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ui erro meu nao li com atenção desculpem, agora ja dá, testei a função e da diretinho muito obrigado.

agora se me pudessem ajudar com a parte de actualizar o tabuleiro e alternar de 0 para 1 em cada jogada agradecia imenso.

obrigado mais uma vez

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como é que estás a representar o tabuleiro?

Há para aí um tópico que explica como alterar posições de uma lista.

Usar monads de estado para guardar o tabuleiro é capaz de ser boa ideia.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é um pouco vago, mas pronto. Faz uma pesquisa neste secção, que encontras uma função para alterar um elemento de uma lista. Sendo uma lista de listas, deverás ter que aplicar a função duas vezes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

para alternar entre cada jogador fazes uma coisa deste tipo

tabuleiroInicial = [ [0, 0, 0], [0, 0, 0 ....... ]

main = jogar tabuleiroInicial 1

jogar :: [[int]] -> Int -> IO ()
jogar tabuleiro jogadorActual = do
  novoTabuleiro <- pedeJogada jogadorActual
  if (tabuleiroCheio novoTabuleiro)
    then putStrLn "fim do jogo"
    else jogar novoTabuleiro (1-jogadorActual)

isto é só para exemplificar. obviamente que não funciona. a função main chama a a função de jogo enviando como argumento o tabuleiro vazio e um numero que vai servir para saber qual o próximo jogador a jogar.

a função de jogo le uma jogada, e se o tabuleiro ficar cheio acaba o jogo, se não chama-se a si mesma mas tendo como argumento o tabuleiro actualizado e o numero correspondente ao outro jogador (a o fazer (1 - jogadorActual) vai-se alternando entre 0 e 1)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu fiz mais ou menos como o mpalhas disse, o problema está em que não actualiza o tabuleiro, eu sei que é por causa de eu ter posto na função "lejogada" o tabuleiroinicial e assim o novoTabuleiro fica sempre só com a posição que se jogou primeiramente. Gostava que me ajudassem a resolver o problema porque eu não estou mesmo a ver como isto vai acumular no tabuleiro. Aqui está o código:

Utilizei o codigo da jogada que estava num outro topico aqui no forum

--Jogada--
joga l pos n = let ini = take (pos-1) l
	   fim = drop pos l
       in ini ++ [(add n l pos)] ++ fim


ind l pos = l!!(pos-1)

add n l pos = ( n $ ind l pos

o ler jogada

--Ler a jogada--
tabuleiroinicial = [[],[],[],[],[]]
lejogada = do { putStr "Indica a coluna onde queres jogar ";
      	l <- getLine;
	let l1 = ((read l)::Int)
	;if (jogadavalida tabuleiroinicial l1)
	   then return (joga tabuleiroinicial l1 1)
	   else do { putStrLn "Coluna cheia ou invalida ";
	   	     lejogada
	   	   }
      }

e por ultimo o que o mpalhas sugeriu

main = jogar tabuleiroinicial 1	      	  

--Jogar--
jogar :: [[int]] -> Int -> IO ()
jogar tabuleiro jogadorActual = do {
novoTabuleiro <- lejogada;
if length (novoTabuleiro!!(3-1))==5
   then do { putStr "Game Over ";
   	   }
   else do { jogar novoTabuleiro (1-jogadorActual)
   	   }
}

Desculpem pelo tamanho do post e obrigado mais uma vez

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E que tal pores a função lejogada a receber o tabuleiro actual?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

era isso que eu estava a perguntar, eu não sei por na função "lejogada" a receber o tabuleiro actual em vez do tabuleiroinicial fixo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Deves estar a gozar, não?

Já olhaste, por exemplo, para a função jogar? Não recebe um, recebe dois argumentos! Curiosamente, essa função até recebe o tabuleiro como argumento. Ou seja, aquilo que precisas de fazer, já está feito nessa função.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

as vezes isto ta mesmo à nossa frente e uma pessoa não vê lol. Obrigado

so uma coisa, no if da função jogar so pus para verificar se a linha 3 ta cheia, como fazer para todas as linhas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É criares uma função que percorra todas as linhas, e devolva o resultado.

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