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

link

Duvida..fazer jogada

Recommended Posts

link

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

Share this post


Link to post
Share on other sites
link

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"

Share this post


Link to post
Share on other sites
link

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'

Share this post


Link to post
Share on other sites
link

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

Share this post


Link to post
Share on other sites
link

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

Share this post


Link to post
Share on other sites
Rui Carlos

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.

Share this post


Link to post
Share on other sites
Rui Carlos

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.

Share this post


Link to post
Share on other sites
mpalhas

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)

Share this post


Link to post
Share on other sites
link

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

Share this post


Link to post
Share on other sites
link

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

Share this post


Link to post
Share on other sites
Rui Carlos

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.

Share this post


Link to post
Share on other sites
link

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?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.