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

flower_puff

Dúvida... Trabalho Prático (LEI 1º Ano)

31 mensagens neste tópico

Boa tarde a todos...

É o seguinte, tenho um trabalho prático para fazer até dia 4 de Janeiro para a disciplina de Laboratórios de Informática de LEI 1º Ano. Este trabalho consiste em fazer um jogo em Haskell, sendo ele o conhecido 4 em Linha. Em cada jogada, o jogador pode colocar uma das suas peças numa coluna não cheia. A posição dessa coluna que é ocupada é a seguinte à última que foi ocupada.

No entanto, fazer o jogo tal como o conhecemos não basta... o prof. quer que implementemos uma variante do jogo a qual se vai dar o nome "Segmentos". O objectivo do jogo é acumular o maior número de pontos possível. Os pontos são conseguidos quando se obtêm linhas de n peças iguais. Essas linhas podem ser verticais, horizontais ou na diagonal. A pontuação será diferente, consoante o número de peças em linha. Fica aqui o exemplo:

2 peças = 1 ponto

3 peças = 3 pontos

4 peças = 6 pontos

5 peças = 10 pontos

6 peças = 15 pontos

7 peças = 21 pontos

...

Desta forma, o jogo não termina assim que um jogador faça o 4 em linha, mas sim quando o tabuleiro do jogo ficar cheio... sendo que os pontos acumulados por cada jogador serão contabilizados no decorrer do jogo.

Agora passando para a minha dúvida...

Preciso de definir tipos apropriados para representar tabuleiros e jogadas. Definindo assim o tipo dos tabuleiros como instância de classes que julgue apropriadas (como por exemplo, Show).

Estou com dificuldades em fazer este passo, dado que não dei esta parte da matéria, devido a problemas de saúde e daí não ter frequentado as últimas aulas. Peço por favor alguma ajuda para isto!

Obrigado a todos.  :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para o tipo de dados podes usar uma lista de listas, onde armazenas o tabuleiro por colunas. Uma jogada não é mais que adicionar uma peça numa coluna, ou seja, acrescentar um elemento a uma das listas que vais criar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

humm.. vistas as coisas nessa prespectiva até parece ser mais fácil.

vou tentar fazer... caso não consiga depois coloco aqui o código para ver o que está mal.

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é estúpido, mas por mais que tente não consigo fazer nada de jeito!

passei a tarde toda nisto, e sempre que testava dava erro..  :cheesygrin:

será que podem dar um "empurrãozinho" com o código?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é estúpido, mas por mais que tente não consigo fazer nada de jeito!

passei a tarde toda nisto, e sempre que testava dava erro..  :cheesygrin:

será que podem dar um "empurrãozinho" com o código?

vai vendo o meu topico.. talvez te dê ajuda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Suponhamos que têm um tabuleiro de 4 colunas.

Inicialmente têm a seguinte lista: [[],[],[],[]]

O jogador 1 coloca uma peça na coluna 1: [[1],[],[],[]]

O jogador 2 coloca uma peça na coluna 1: [[1,2],[],[],[]]

O jogador 1 coloca uma peça na coluna 2: [[1,2],[1],[],[]]

O jogador 2 coloca uma peça na coluna 1: [[1,2,2],[1],[],[]]

O jogador 1 coloca uma peça na coluna 3: [[1,2,2],[1],[1],[]]

...

Ou seja, começam com uma lista de listas vazia, e a cada jogada vão adicionado um valor numa determinada lista.

Adicionalmente devem garantir que o tamanho de cada lista nunca excede o número de linhas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas.

flower_puff aqui é o 90. Olha eu pa este trabalho estou a utilizar este sistema de representar o tabuleiro como uma lista de listas (apenas não uso números para representar a peça do jogador, utilizo Bool, menos memória e a treta é a mesma já que só precisas de duas peças).

Estou neste momento a estudar outras opções mas digo-te desde já que este parece ser o método mais intuitivo para representar o tabuleiro. Facilita-te a jogada, evitas funções de validação do tabuleiro (ainda não tive nenhum tabuleiro que saísse do normal visto que este é gerado pelo programa e não pelo user), o desenho do tabuleiro, apesar de pouco intuitivo, não é complicado. Apenas perdes um pouco do controlo da dimensão do teu tabuleiro, mas podes dar a volta a isso.

Também tens a opção de utilizar uma lista de triplos (Linha,Coluna,Peca), e assim controlas bem a dimensão do tabuleiro, fixas tudo e o desenho torna-se mais intuitivo, bem como o cálculo da pontuação. Problema: é mais dificil de construir, a jogada é muito mais complicada, e precisas de mais código para te "moveres" no tabuleiro. Ah e Peca não pode ser um Bool, precisas de um valor para quando a célula for vazia.

Eu aconselho o primeiro, mas se te der mais jeito, pensa na lista de triplos.

Qualquer coisa apita  :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas.. ja consegui fazer mais alguma coisita, no entanto, as dúvidas persistem.

Ainda não consegui perceber as classes e as instâncias! Daí não conseguir definir os tipos dos tabuleiros como uma instância de classes (por exemplo a SHOW). Outra dúvida está em definir funções para testar a validade do tabuleiro e das jogadas.

Respondam sff...

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

esse método do 90 parece ser o melhor. também já me tinha ocorrido algo parecido mas como já tinha o meu bastante avançado, iria ter que alterar praticamente o código todo, por isso fico com a minha primeira opção que também não é má de todo

basicamente uso também uma lista de listas, mas em vez de começar com listas vazias, criei um tipo de dados:

data FieldValue = Null | P1 | P2

todos os campos começam como Null. ou seja, um tabuleiro de 3x3 começa por ser assim:

[ [Null, Null, Null],

  [Null, Null, Null],

  [Null, Null, Null] ]

cada sub-lista em vez de ser uma coluna como já mostraram aqui, é uma linha.

para certas coisas acho que até é a melhor opção. por exemplo, para escrever o tabuleiro no ecrã basta percorrê-lo elemento a elemento e ir escrevendo. para verificar se uma coluna está cheia, basta ver o elemento correspondente da primeira linha... numa lista de colunas isto já não seria assim tão simples

mas para outra coisas secalhar fica menos eficiente

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas...

Tenho o seguinte código:


--Jogadores possiveis
data CampoTabuleiro = Nenhum
                    | Jogador1
                    | Jogador2
                    deriving (Eq, Show)
   
  
type LinhaTabuleiro = [CampoTabuleiro]
type Tabuleiro = [LinhaTabuleiro]




--Camada interactiva (Menu)
menu :: IO() 
menu = do {putStrLn "  4 em Linha - Segmentos\n ";
           putStrLn "                          ";
	           putStrLn "*------------------------*";
           putStrLn "|     Menu Principal     |";
	           putStrLn "|------------------------|";
           putStrLn "|   1 - Jogar            |";
	           putStrLn "|   2 - Carregar Jogo    |";
	           putStrLn "|   3 - Sair             |";
	           putStrLn "*------------------------*";
	           putStrLn "Escolha a opcao:"; 
	           opcao <- getLine;
	           case opcao of "1" -> putStrLn "Opcao 1 escolhida"; --trocar pelo nome das respectivas funções
	                         "2" -> putStrLn "Opcao 2 escolhida";
					                         "3" -> putStrLn "A sair...";
	          }
	  


--Camada Interactiva (Tabuleiro) 
desenharTabuleiro :: Tabuleiro -> IO ()
desenharTabuleiro [] = return ()
desenharTabuleiro (linha:xs) = do desenharLinhaTabuleiro linha
                                  desenharTabuleiro xs


desenharLinhaTabuleiro :: LinhaTabuleiro -> IO ()
desenharLinhaTabuleiro [] = putStrLn ("|")
desenharLinhaTabuleiro (c:cs) = do desenharCampoTabuleiro c
                                   desenharLinhaTabuleiro cs


desenharCampoTabuleiro :: CampoTabuleiro -> IO ()
desenharCampoTabuleiro value = putStr("|_" ++ signal ++ "_|")
                               where signal = case value of 
                                                           Nenhum     -> "_"
                                                           Jogador1   -> "X"
                                                           Jogador2   -> "O"

Atenção: o código não está bem alinhado!

Ora então precisava de ajuda para o seguinte. Utilizando esta solução para fazer o tabuleiro, pretendo criar uma função "comecarJogo" em que vai chamar a função de um jogo com um tabuleiro vazio.

De seguida criar a função "jogar" que irá verificar se é possivel jogar, ou seja, se o tabuleiro està ou não cheio, e vai fazendo a alternância entre o jogador 1 e 2.

É também necessário criar a função "pedeJogada" que vai perguntar qual a coluna em que o jogador pretende colocar a peça, e de seguida coloca a peça desse jogador na coluna pretendida e apresenta o tabuleiro actualizado.

Resumindo eu sei aquilo que tenho que fazer, mas o que é certo é k não sei como fazer, uma vez que não percebo muito de Haskell e tenho dificuldades com o código! :S

Alguém me pode ajudar com o código disto??

Obrigado. Boas Festas.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Caso tenhamos a seguinte lista

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

Como fazer para saber se a 2ª lista tem o elemento 2?

Ou se a 3ª lista tem o elemento 1?

PS: Isto é apenas um exemplo.

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para ver se uma lista tem um determinado elemento basta usar a função elem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim... mas como é que divido as listas?

podes usar o take/drop/head/last, etc, ou então a função (!!) que acede à lista como se fosse um array.

ex:

lista !! 0 -> dá o 1º elemento da lista

lista !! 1 -> dá o 2ºe elemento

...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas...

Tenho o seguinte código:


--Jogadores possiveis
data CampoTabuleiro = Nenhum
                    | Jogador1
                    | Jogador2
                    deriving (Eq, Show)

  
type LinhaTabuleiro = [CampoTabuleiro]
type Tabuleiro = [LinhaTabuleiro]




--Camada interactiva (Menu)
menu :: IO() 
menu = do {putStrLn "  4 em Linha - Segmentos\n ";
           putStrLn "                          ";
	           putStrLn "*------------------------*";
           putStrLn "|     Menu Principal     |";
	           putStrLn "|------------------------|";
           putStrLn "|   1 - Jogar            |";
	           putStrLn "|   2 - Carregar Jogo    |";
	           putStrLn "|   3 - Sair             |";
	           putStrLn "*------------------------*";
	           putStrLn "Escolha a opcao:"; 
	           opcao <- getLine;
	           case opcao of "1" -> putStrLn "Opcao 1 escolhida"; --trocar pelo nome das respectivas funções
	                         "2" -> putStrLn "Opcao 2 escolhida";
					                         "3" -> putStrLn "A sair...";
	          }
	  


--Camada Interactiva (Tabuleiro) 
desenharTabuleiro :: Tabuleiro -> IO ()
desenharTabuleiro [] = return ()
desenharTabuleiro (linha:xs) = do desenharLinhaTabuleiro linha
                                  desenharTabuleiro xs


desenharLinhaTabuleiro :: LinhaTabuleiro -> IO ()
desenharLinhaTabuleiro [] = putStrLn ("|")
desenharLinhaTabuleiro (c:cs) = do desenharCampoTabuleiro c
                                   desenharLinhaTabuleiro cs


desenharCampoTabuleiro :: CampoTabuleiro -> IO ()
desenharCampoTabuleiro value = putStr("|_" ++ signal ++ "_|")
                               where signal = case value of 
                                                           Nenhum     -> "_"
                                                           Jogador1   -> "X"
                                                           Jogador2   -> "O"

Atenção: o código não está bem alinhado!

Ora então precisava de ajuda para o seguinte. Utilizando esta solução para fazer o tabuleiro, pretendo criar uma função "comecarJogo" em que vai chamar a função de um jogo com um tabuleiro vazio.

De seguida criar a função "jogar" que irá verificar se é possivel jogar, ou seja, se o tabuleiro està ou não cheio, e vai fazendo a alternância entre o jogador 1 e 2.

É também necessário criar a função "pedeJogada" que vai perguntar qual a coluna em que o jogador pretende colocar a peça, e de seguida coloca a peça desse jogador na coluna pretendida e apresenta o tabuleiro actualizado.

Resumindo eu sei aquilo que tenho que fazer, mas o que é certo é k não sei como fazer, uma vez que não percebo muito de Haskell e tenho dificuldades com o código! :S

Alguém me pode ajudar com o código disto??

Obrigado. Boas Festas.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas!

desculpem o double-post, mas teve mesmo k ser.

Ja avancei um pouco no trabalho, mas agora ao testar o programa dá-me o seguinte erro:

78203429ek5.th.jpg

Não sei a que se deve isto! Se alguém puder ajudar...

Penso que esteja tudo bem feito.

Digam qualquer coisa.

Obrigado

kripton2007

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A mensagem é explícita: há conflitos de tipos. Olha para os tipos das funções e vê o que tens de mudar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

quer dizer que a função está à espera de retornar um IO () mas tu estás a tentar enviar uma String.

msgImpJogar, suponho que seja uma string certo? então o que deves querer é trocar isso por

putStrLn msgImpJogar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas...

Antes de mais espero que todos tenham tido uma óptima passagem de ano! Um FELIZ 2009...

Voltou-me a aparecer um erro ao correr o programa. Já alterei tudo aquilo que achei possível, mas sinceramente não adiantou de nada.

82978950du6.th.jpg

Fico à espera de alguma ajuda!

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

assim a primeira vista parece que onde tens

pontuacaoDiagonal (inverterBoard board)

essa funcao está a espera de mais algum parametro do tipo CampoTabuleiro

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado mpalhas... esse erro também ja está resolvido! ;)

Agora surgiu mais um, mas este acontece na importação de módulos...

69015747jd6.th.jpg

a que se deve este erro, tendo em conta que está (supostamente) tudo bem?

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