Ir ao conteúdo
  • Cadastre-se

Portugol Jogo dos 8 (Slinding Puzzle) VISUALG


Posts recomendados

Bom dia,

 

Gostaria da ajuda de vocês, estou tentando criar o jogo dos 8, na qual você tem uma matriz 3x3 e a tabela padrão é de 1 ate 0, e uma tabela aleatoria, e a a função do programa é arrumar a tabela aleatoria para ficar igual a padrão. Só que eu consigo ir mudando as posições apenas para cima e para esquerda, mas quando coloco para direita e para baixo o programa dá erro, não estou conseguindo resolver esse problema, e outro problema é que eu não estou conseguindo limitar o movimento caso eu aperte para esquerda e a matriz acabar eu teria que repetir outro movimento para não ultrapassar a matriz.

O meu código é esse.

 

algoritmo "Trabalho Final"
// Função : Jogar
// Autor : Luiz Felipe rodrigues da Silva
// Data : 24/09/2018

var

vet  :vetor [1..9] de inteiro
tab3: vetor[1..3,1..3] de inteiro
tab3a: vetor[1..3,1..3] de inteiro

aux, i, j, l, c, linha, coluna,tabuleiro, cont, opcao: inteiro

inicio
//Escolha do tabuleiro
repita
   Escreval("Escolha o modo de jogo:")
   Escreval("(1) Fácil")
   Escreval("(2) Normall")
   Escreval("(3) Difícil")

   Leia(tabuleiro)

ate((tabuleiro = 1) ou (tabuleiro = 2) ou (tabuleiro = 3))
Limpatela
escolha (tabuleiro)

   //Tabuleiro 3X3

caso 1

   //Tabela padrão

   Escreval("Como a tabele deve ficar")
   Escreval()
   cont <- 0
   para linha de 1 ate 3 faca
      para coluna de 1 ate 3 faca
         tab3[linha,coluna]<- cont + 1
         cont <- cont + 1
      fimpara
   fimpara

   tab3[3,3] <- 0

   para linha de 1 ate 3 faca
      para coluna de 1 ate 3 faca
         escreva(tab3[linha,coluna])
      fimpara
      escreval()
   fimpara
   escreval()


   //Tabela aleatória

   para i de 1 ate 9 faca
      vet <- Randi(9)
      se i > 1 entao
         j <- 1
         enquanto (j < i) faca
            se vet = vet[j] entao
               vet <- randi(9)
               j <- 1
            senao
               j <- j+1
            fimse
         fimenquanto

      fimse

      tab3a[1,1] <- vet[1]
      tab3a[1,2] <- vet[2]
      tab3a[1,3] <- vet[3]
      tab3a[2,1] <- vet[4]
      tab3a[2,2] <- vet[5]
      tab3a[2,3] <- vet[6]
      tab3a[3,1] <- vet[7]
      tab3a[3,2] <- vet[8]
      tab3a[3,3] <- vet[9]

   fimpara
   escreval("-----------------------------------------------------")
   escreval("Faça o movimento do 0 até igualar a tabela padrão")
   escreval()
   para l de 1 ate 3 faca
      para c de 1 ate 3 faca
         escreva(tab3a[l,c])
      fimpara
      escreval()
   fimpara
   escreval("-----------------------------------------------------")

   //escolha dos movimentos
  repita
   escreval("Faça os movimentos com as teclas 4 para (esquerda),8 para (cima),6 para (direita) ou 2 para (baixo")
   repita
      leia (opcao)

   ate ((opcao = 4) ou (opcao = 6) ou (opcao = 2) ou (opcao = 8))
   escolha opcao

      //Movimento esquerda
   caso 4
      para l de 1 ate 3 faca
         para c de 1 ate 3 faca

            se (tab3a[l,c] = 0) entao
               aux <- tab3a[l,c]
               tab3a[l,c] <- tab3a[l,c-1]
               tab3a[l,c-1] <- aux
            fimse
         fimpara
      fimpara

      para l de 1 ate 3 faca
         para c de 1 ate 3 faca
            escreva(tab3a[l,c])
         fimpara
         escreval()
      fimpara

      //Movimento para cima
   caso 8
      para l de 1 ate 3 faca
         para c de 1 ate 3 faca

            se (tab3a[l,c] = 0) entao
               aux <- tab3a[l,c]
               tab3a[l,c] <- tab3a[l-1,c]
               tab3a[l-1,c] <- aux
            fimse
         fimpara
      fimpara

      para l de 1 ate 3 faca
         para c de 1 ate 3 faca
            escreva(tab3a[l,c])
         fimpara
         escreval()
      fimpara
      //Movimento para direita
   caso 6
      para l de 1 ate 3 faca
         para c de 1 ate 3 faca

            se (tab3a[l,c] = 0) entao
               aux <- tab3a[l,c]
               tab3a[l,c] <- tab3a[l,c+1]
               tab3a[l,c+1] <- aux
            fimse
         fimpara
      fimpara

      para l de 1 ate 3 faca
         para c de 1 ate 3 faca
            escreva(tab3a[l,c])
         fimpara
         escreval()
      fimpara


      //movimento para baixo
   caso 2
      para l de 1 ate 3 faca
         para c de 1 ate 3 faca

            se (tab3a[l,c] = 0) entao
               aux <- tab3a[l,c]
               tab3a[l,c] <- tab3a[l+1,c]
               tab3a[l+1,c] <- aux
            fimse
         fimpara
      fimpara

      para l de 1 ate 3 faca
         para c de 1 ate 3 faca
            escreva(tab3a[l,c])
         fimpara
         escreval()
      fimpara

   fimescolha
   
   ate (tab3[linha,coluna]=tab3a[l,c])

caso 2

   escreval("2")

caso 3
   escreval("3")

fimescolha


fimalgoritmo

 

  • Curtir 2
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

1#

Sobre:

9 horas atrás, Lipeco disse:

Só que eu consigo ir mudando as posições apenas para cima e para esquerda, mas quando coloco para direita e para baixo o programa dá erro

 

Dá erro porque você está varrendo a matriz procurando onde está o 0. Quando é feito a mudança para direita ou para baixo, o 0 vai para uma posição posterior, daí, o para vai continuar procurando e vai achar 0 novamente (pois a pesquisa vai indo justamente para o posterior)..., ou seja, o 0 vai cada vez indo para direita ou para baixo (respectivamente) e acaba chegando na borda!!! Acontece que o programa ainda vai tentar mover... e acaba se esbarrando um posição que não existe.

 

 

 

2#

Uma forma de resolver o problema (vulgo armengando) seria fazendo o laço interromper após encontrar. Veja, se o número já foi encontra, não tem porque continuar procurando.

 

Basta usar o comando interrompa.

         caso 6
            para l de 1 ate 3 faca
               para c de 1 ate 3 faca
                  se (tab3a[l,c] = 0) entao
                     aux          <- tab3a[l,c]
                     tab3a[l,c]   <- tab3a[l,c+1]
                     tab3a[l,c+1] <- aux
                     interrompa
                  fimSe
               fimPara
               interrompa
            fimPara

e

         caso 2
            para l de 1 ate 3 faca
               para c de 1 ate 3 faca
                  se (tab3a[l,c] = 0) entao
                     aux          <- tab3a[l,c]
                     tab3a[l,c]   <- tab3a[l+1,c]
                     tab3a[l+1,c] <- aux
                     interrompa
                  fimSe
               fimPara
               interrompa
            fimPara

 

 

 

3#

Essa pesquisa da posição é desnecessária... simplesmente armazene a posição do 0 com duas variáveis. Aí, quando for mover, faz a troca utilizando as variáveis.

 

 

 

4#

Você precisa inserir uma proteção para não deixar mover o 0 para além das bordas. 

 

 

 

5#

Em vez de imprimir a matriz em cada caso, apenas coloque uma vez depois do escolha ou lá no início do repita.

 

 

 

***

 

No aguardo.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Boa noite amigo, consegui, muito obrigado pela dica, realmente eu não estava enxergando isso, consegui limitar e fazer tudo que me indicou, agradeço muito. Espero que tenha uma excelente noite . não

Vou postar ele pronto depois que eu formatar direitinho, na terça feira devo estar postando. Agradeço amigo.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

1#

Sobre:

 

Vou postar ele pronto depois que eu formatar direitinho, na terça feira devo estar postando. Agradeço amigo.

 

Legal. Ficamos aguardando para revisar.

 

Sobre a indentação do código, no próprio Visualg tem um recurso no menu Editar. Ele automaticamente reindenta o código. É possível também utilizar o atalho CTRL+G. É bem útil. Mesmo que possa ocorrer de não ficar 100% no padrão que você possa gostar, dá para usar a ferramente e depois fazer os ajustes desejados.

 

 

 

2#

Sobre:

 

[...] realmente eu não estava enxergando isso [...]

 

Bacana! Creio que para identificar essa falha não era tão trivial mesmo, ainda mais quando está com a "cabeça quente" desenvolvendo o algoritmo... É normal.

 

Se servi de ajuda, fiquei sem entender também... para identificar o erro, eu utilizei basicamente de 2 recursos: o breakpoint (F5) e a análise dos valores das variáveis. Se tiver interesse, posteriormente eu tento explicar o que é e como eu fiz para achar o erro.

 

 

Um ponto interessante é que a necessidade de não continuar repetindo após encontrar o 0 já existia, ou seja, é necessário também fazer o mesmo para as teclas 4 e 8. Resumindo: interromper o laço serve tanto para parar de continuar, já que já achou, tanto para evitar o erro após a troca, pois o 0 reposiciona e pode acabar encontrando novamente (que é o caso do 6 e 2)

 

 

 

3#

Uma forma diferente de sugerir as teclas:

         escreval("Faça os movimentos com as teclas")
         escreval("  8  ")
         escreval("4 * 6")
         escreval("  2  ")
         escreval()

Ou seja, a ideia é meio que indicando para usar o teclado numérico... por ai vai.

 

 

 

***

 

No aguardo.

tela.png

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Então, eu fiz tudo , deu certo, aí foi eu começar a organizar para começar a dar erro.

Tudo começa bem, até eu pedir para fazer o primeiro movimento, aí quando eu faço o movimento eu coloquei na logica para repetir essa leitura até a tabela randon ficar igual a Tabela padrão. Mas agora está dizendo que tem eum "ATE" sem um "repita", sendo que eu coloquei o repita, e o até.

Sigua o algoritmo.

 

Outra coisa, como coloco para a matriz ficar organizada ?
Quando coloco no modo difícil, por exemplo, cria uma matriz 5x5 mas fica todo desorganizado, tentei dar espaço, mas continua..

 

algoritmo "Trabalho Final"
// Função : Jogar
// Autor : Luiz Felipe rodrigues da Silva
// Data : 24/09/2018

var

   vet  :vetor [1..25] de inteiro
   taborig: vetor[1..5,1..5] de inteiro
   tabrand: vetor[1..5,1..5] de inteiro

   contmov,tam, aux, aux2, i, j, l, c, linha, coluna,tabuleiro, cont,contres, opcao,ii: inteiro

inicio
   //Escolha do tabuleiro
   repita
      Escreval("Escolha o modo de jogo:")
      Escreval("(1) Fácil")
      Escreval("(2) Normall")
      Escreval("(3) Difícil")

      Leia(tabuleiro)

   ate((tabuleiro = 1) ou (tabuleiro = 2) ou (tabuleiro = 3))
   Limpatela
   Se (tabuleiro = 1) entao
      tam <- 3
   fimse
   Se (tabuleiro = 2) entao
      tam <- 4
   fimse
   Se (tabuleiro = 3) entao
      tam <- 5
   fimse

   //Tabela padrão

   Escreval("Como a tabele deve ficar")
   Escreval()
   cont <- 0
   para linha de 1 ate tam faca
      para coluna de 1 ate tam faca
         taborig[linha,coluna]<- cont + 1
         cont <- cont + 1
      fimpara
   fimpara

   taborig[tam,tam] <- 0

   para linha de 1 ate tam faca
      para coluna de 1 ate tam faca
         escreva(taborig[linha,coluna]," ")
      fimpara
      escreval()
   fimpara
   escreval()

   //Tabela aleatória
   //Tabuleiro 3x3

   Se (tabuleiro = 1) entao
      para i de 1 ate 9 faca
         vet <- Randi(9)
         se i > 1 entao
            j <- 1
            enquanto (j < i) faca
               se vet = vet[j] entao
                  vet <- randi(9)
                  j <- 1
               senao
                  j <- j+1
               fimse
            fimenquanto
         fimse
         ii <- 0
         para l de 1 ate 3 faca
            para c de 1 ate 3 faca
               tabrand[l,c] <- vet[1+ii]
               ii<- ii + 1
            fimpara
         fimpara

      fimpara
      escreval("-----------------------------------------------------")
      escreval("Faça o movimento do 0 até igualar a tabela padrão")
      escreval()
      para l de 1 ate tam faca
         para c de 1 ate tam faca
            escreva(tabrand[l,c],"")
         fimpara
         escreval()
      fimpara
      escreval("-----------------------------------------------------")
   fimse

   //tabuleiro 4x4
   Se (tabuleiro = 2) entao
      tam <- 4
      para i de 1 ate 16 faca
         vet <- Randi(16)
         se i > 1 entao
            j <- 1
            enquanto (j < i) faca
               se vet = vet[j] entao
                  vet <- randi(16)
                  j <- 1
               senao
                  j <- j+1
               fimse
            fimenquanto

         fimse
         ii <- 0
         para l de 1 ate 4 faca
            para c de 1 ate 4 faca
               tabrand[l,c] <- vet[1+ii]
               ii<- ii + 1
            fimpara
         fimpara
      fimpara
      escreval("-----------------------------------------------------")
      escreval("Faça o movimento do 0 até igualar a tabela padrão")
      escreval()
      para l de 1 ate tam faca
         para c de 1 ate tam faca
            escreva(tabrand[l,c])
         fimpara
         escreval()
      fimpara
      escreval("-----------------------------------------------------")
   fimse

   //tabuleiro 5x5
   Se (tabuleiro = 3) entao
      tam <- 5
      para i de 1 ate 25 faca
         vet <- Randi(25)
         se i > 1 entao
            j <- 1
            enquanto (j < i) faca
               se vet = vet[j] entao
                  vet <- randi(25)
                  j <- 1
               senao
                  j <- j+1
               fimse
            fimenquanto
         fimse

         ii <- 0
         para l de 1 ate 5 faca
            para c de 1 ate 5 faca
               tabrand[l,c] <- vet[1+ii]
               ii<- ii + 1
            fimpara
         fimpara
      fimpara
      escreval("-----------------------------------------------------")
      escreval("Faça o movimento do 0 até igualar a tabela padrão")
      escreval()
      para l de 1 ate tam faca
         para c de 1 ate tam faca
            escreva(tabrand[l,c],"  ")
         fimpara
         escreval("  ")
      fimpara
      escreval("-----------------------------------------------------")
   fimse
   //escolha dos movimentos

   contmov <- 0
  

//O PROBLEMA ESTÀ NESSE REPITA  e no ATE LÁ NO FINAL

 

Repita
      escreval("Faça os movimentos com as teclas")
      escreval("  8  ")
      escreval("4 * 6")
      escreval("  2  ")
      escreval()

      repita
         leia (opcao)
         escreval()
      ate ((opcao = 4) ou (opcao = 6) ou (opcao = 2) ou (opcao = 8))
      escolha opcao
         //Movimento esquerda
      caso 4
         para l de 1 ate tam faca
            para c de 1 ate tam faca

               se (tabrand[l,c] = 0) entao
                  se (c<>1) entao
                     aux <- tabrand[l,c]
                     tabrand[l,c] <- tabrand[l,c-1]
                     tabrand[l,c-1] <- aux
                  fimse
               fimse
            fimpara
         fimpara
         contmov <- contmov + 1
         para l de 1 ate tam faca
            para c de 1 ate tam faca
               escreva(tabrand[l,c])
            fimpara
            escreval()
         fimpara

         //Movimento para cima
      caso 8
         para l de 1 ate tam faca
            para c de 1 ate tam faca
               se (l<>1) ENTAO
                  se (tabrand[l,c] = 0) entao
                     aux <- tabrand[l,c]
                     tabrand[l,c] <- tabrand[l-1,c]
                     tabrand[l-1,c] <- aux
                  fimse
               fimse
            fimpara
         fimpara
         contmov <- contmov + 1
         para l de 1 ate tam faca
            para c de 1 ate tam faca
               escreva(tabrand[l,c])
            fimpara
            escreval()
         fimpara
         //Movimento para direita
      caso 6
         para l de 1 ate 3 faca
            para c de 1 ate 3 faca
               se (c<>tam) ENTAO
                  se (tabrand[l,c] = 0) entao
                     aux <- tabrand[l,c]
                     tabrand[l,c] <- tabrand[l,c+1]
                     tabrand[l,c+1] <- aux
                     interrompa
                  fimse
               fimse
            fimpara
         fimpara
         contmov <- contmov + 1
         para l de 1 ate tam faca
            para c de 1 ate tam faca
               escreva(tabrand[l,c])
            fimpara
            escreval()
         fimpara


         //movimento para baixo
      caso 2
         para l de 1 ate tam faca
            aux2 <- 1
            para c de 1 ate tam faca
               se (l<>tam) entao
                  se (tabrand[l,c] = 0) entao
                     aux <- tabrand[l,c]
                     tabrand[l,c] <- tabrand[l+1,c]
                     tabrand[l+1,c] <- aux
                     aux2 <- aux
                     interrompa
                  fimse
               fimse
            fimpara
            se(l<>tam) entao
               se (aux2 = 0) entao
                  interrompa
               fimse
            fimse
         fimpara
         contmov <- contmov + 1
         para l de 1 ate tam faca
            para c de 1 ate tam faca
               escreva(tabrand[l,c])
            fimpara
            escreval()
         fimpara

         //Verificação com a tabela principal

         contres <- 0
         para l de 1 ate tam faca
            para c de 1 ate tam faca
               se (tabrand[l,c]=taborig[l,c]) entao
                  contres <- contres + 1
               fimse
            fimpara
         fimpara

   Ate (contres=tam)

      Escreval("Parabéns!!! Você Venceu!!!")
      escreval("Número de tentativas foi: ",contmov)
fimalgoritmo

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

1#

Para postar um código, favor utilizar a tag CODE. Vide:

 

 

 

2#

Sobre:

21 horas atrás, Lipeco disse:

Então, eu fiz tudo , deu certo, aí foi eu começar a organizar para começar a dar erro.

Tudo começa bem, até eu pedir para fazer o primeiro movimento, aí quando eu faço o movimento eu coloquei na logica para repetir essa leitura até a tabela randon ficar igual a Tabela padrão. Mas agora está dizendo que tem eum "ATE" sem um "repita", sendo que eu coloquei o repita, e o até.

 

Creio que um dos erros chaves foi que faltou um fimEscolha. Mas tem outros detalhes que precisam ser revistos... Segue um código que fiz alguns ajustes:

algoritmo "Trabalho Final"
// Função: Jogar
// Autor : Luiz Felipe rodrigues da Silva
// Data  : 24/09/2018
var
   tabOrig:vetor[1..5,1..5] de inteiro
   tabRand:vetor[1..5,1..5] de inteiro
   vet    :vetor[1..25] de inteiro
   //{
   //contMov,tam, aux, aux2, i, j, l, c, linha, coluna,tabuleiro, cont,contRes, opcao,ii: inteiro
   //}
   tam      :inteiro //tamanho do tabuleiro
   tabuleiro:inteiro //categoria do tabuleiro
   contMov  :inteiro //contador de movimentos
   contRes  :inteiro //contador de respostas corretas
   aux      :inteiro //auxiliar para troca de posições
   l, c     :inteiro //auxiliares para percorrer as matrizes
   cont     :inteiro //auxiliar para criar a tabuleiro original
   i,j      :inteiro //auxliares para percorrer o vetor
   ii       :inteiro //auxiliar para
   opcao    :inteiro //tecla pressionada para movimentação
inicio
//Escolha do tabuleiro
repita
   escreval("Escolha o modo de jogo:")
   escreval("(1) Fácil")
   escreval("(2) Normall")
   escreval("(3) Difícil")
   leia(tabuleiro)
ate((tabuleiro = 1) ou (tabuleiro = 2) ou (tabuleiro = 3))
limpaTela
//{
//se (tabuleiro = 1) entao
//   tam <- 3
//fimSe
//se (tabuleiro = 2) entao
//   tam <- 4
//fimSe
//se (tabuleiro = 3) entao
//   tam <- 5
//fimSe
//}
se (tabuleiro = 1) entao
   tam <- 3
senao
   se (tabuleiro = 2) entao
      tam <- 4
   senao
      se (tabuleiro = 3) entao
         tam <- 5
      fimSe
   fimSe
fimSe



//Tabela padrão
//{
//escreval("Como a tabele deve ficar")
//}
escreval()
cont <- 0
para l de 1 ate tam faca
   para c de 1 ate tam faca
      //{
      //tabOrig[linha,coluna]<- cont + 1
      //cont <- cont + 1
      //}
      cont <- cont + 1
      tabOrig[l,c] <- cont
   fimPara
fimPara
tabOrig[tam,tam] <- 0

escreval("Como a tabela deve ficar")
para l de 1 ate tam faca
   para c de 1 ate tam faca
      escreva(tabOrig[l,c]," ")
   fimPara
   escreval()
fimPara
escreval()


//Tabela aleatória
//Tabuleiro 3x3
se (tabuleiro = 1) entao
   //{
   //para i de 1 ate 9 faca
   //}
   para i de 1 ate tam*tam faca
      vet[i] <- Randi(9)
      se i > 1 entao
         j <- 1
         enquanto (j < i) faca
            se vet[i] = vet[j] entao
               vet[i] <- randi(9)
               j <- 1
            senao
               j <- j+1
            fimSe
         fimenquanto
      fimSe
      //{
      //ii <- 0
      //para l de 1 ate 3 faca
      //   para c de 1 ate 3 faca
      //      tabRand[l,c] <- vet[1+ii]
      //      ii<- ii + 1
      //   fimPara
      //fimPara
      //}
   fimPara
   ii <- 0
   //{
   //para l de 1 ate 3 faca
   //   para c de 1 ate 3 faca
   //}
   para l de 1 ate tam faca
      para c de 1 ate tam faca
         //{
         //tabRand[l,c] <- vet[1+ii]
         //ii <- ii + 1
         //}
         ii <- ii + 1
         tabRand[l,c] <- vet[ii]
      fimPara
   fimPara

   escreval("-----------------------------------------------------")
   escreval("Faça o movimento do 0 até igualar a tabela padrão")
   escreval()
   para l de 1 ate tam faca
      para c de 1 ate tam faca
         escreva(tabRand[l,c],"")
      fimPara
      escreval()
   fimPara
   escreval("-----------------------------------------------------")
fimSe

contMov <- 0
repita
   escreval("Faça os movimentos com as teclas")
   escreval("  8  ")
   escreval("4 * 6")
   escreval("  2  ")
   escreval()
   repita
      leia(opcao)
      escreval()
   ate ((opcao = 4) ou (opcao = 6) ou (opcao = 2) ou (opcao = 8))
   escolha opcao
      //Movimento esquerda
      caso 4
         contMov <- contMov + 1
         para l de 1 ate tam faca
            para c de 1 ate tam faca
               se (tabRand[l,c] = 0) entao
                  se (c<>1) entao
                     aux            <- tabRand[l,c]
                     tabRand[l,c]   <- tabRand[l,c-1]
                     tabRand[l,c-1] <- aux
                  fimSe
               fimSe
            fimPara
         fimPara
         //{
         //contMov <- contMov + 1
         //}
         para l de 1 ate tam faca
            para c de 1 ate tam faca
               escreva(tabRand[l,c])
            fimPara
            escreval()
         fimPara

      //Movimento para cima
      caso 8
         contMov <- contMov + 1
         para l de 1 ate tam faca
            para c de 1 ate tam faca
               se (l<>1) ENTAO
                  se (tabRand[l,c] = 0) entao
                     aux            <- tabRand[l,c]
                     tabRand[l,c]   <- tabRand[l-1,c]
                     tabRand[l-1,c] <- aux
                  fimSe
               fimSe
            fimPara
         fimPara
      para l de 1 ate tam faca
         para c de 1 ate tam faca
            escreva(tabRand[l,c])
         fimPara
         escreval()
      fimPara
      //Movimento para direita
      caso 6
         contMov <- contMov + 1
         para l de 1 ate 3 faca
            para c de 1 ate 3 faca
               se (c<>tam) ENTAO
                  se (tabRand[l,c] = 0) entao
                     aux            <- tabRand[l,c]
                     tabRand[l,c]   <- tabRand[l,c+1]
                     tabRand[l,c+1] <- aux
                     interrompa
                  fimSe
               fimSe
            fimPara
         fimPara
         para l de 1 ate tam faca
            para c de 1 ate tam faca
               escreva(tabRand[l,c])
            fimPara
            escreval()
         fimPara
      //movimento para baixo
      caso 2
         contMov <- contMov + 1
         para l de 1 ate tam faca
            //{
            //aux2 <- 1
            //{
            para c de 1 ate tam faca
               se (l<>tam) entao
                  se (tabRand[l,c] = 0) entao
                     aux            <- tabRand[l,c]
                     tabRand[l,c]   <- tabRand[l+1,c]
                     tabRand[l+1,c] <- aux
                     //{
                     //aux2 <- aux
                     //}
                  interrompa
                  fimSe
               fimSe
            fimPara
            //{
            //se (l<>tam) entao
            //   se (aux2 = 0) entao
            //      interrompa
            //   fimSe
            //fimSe
            //}
         fimPara
         para l de 1 ate tam faca
            para c de 1 ate tam faca
               escreva(tabRand[l,c])
            fimPara
            escreval()
         fimPara
   fimEscolha //<--FALTOU ESSE COMANDO

   //Verificação com a tabela principal
   contRes <- 0
   para l de 1 ate tam faca
      para c de 1 ate tam faca
         se (tabRand[l,c]=tabOrig[l,c]) entao
            contRes <- contRes + 1
         fimSe
      fimPara
   fimPara
//{
//ate (contRes=tam)
//}
ate (contRes=tam*tam)
escreval("Parabéns!!! Você Venceu!!!")
escreval("Número de tentativas foi: ",contMov)
fimAlgoritmo

 

 

3#

21 horas atrás, Lipeco disse:

Outra coisa, como coloco para a matriz ficar organizada ?
Quando coloco no modo difícil, por exemplo, cria uma matriz 5x5 mas fica todo desorganizado, tentei dar espaço, mas continua..

 

Calma lá. Apenas organize a tabela fácil (1). As faz as outras depois. Será a mesma base!

 

 

 

4#

Sobre as sugestões:

4.1

Em 28/09/2018 às 21:57, Simon Viegas disse:

4#

Você precisa inserir uma proteção para não deixar mover o 0 para além das bordas. 

"Feito". Apenas coloque "essa proteção" antes!!! os para quem ficam dentro do se, não o contrário.

 

4.2

Em 28/09/2018 às 21:57, Simon Viegas disse:

5#

Em vez de imprimir a matriz em cada caso, apenas coloque uma vez depois do escolha ou lá no início do repita.

Falta fazer. Você está repetindo o mesmo código em cada opção sem necessidade.

 

4.3

Em 28/09/2018 às 21:57, Simon Viegas disse:

3#

Essa pesquisa da posição é desnecessária... simplesmente armazene a posição do 0 com duas variáveis. Aí, quando for mover, faz a troca utilizando as variáveis.

Falta fazer!

 

 

***

 

Resumindo: 

- Revisa o código que eu postei. Veja as alterações feitas, caso tenha dúvida sobre qualquer parte é só perguntar. Depois de entender pode apagar os comentários com { } para deixar o código mais limpo.

- Só depois, implementa o 4.2. É simples, mas é importante;

- Após implementa o 4.3.

 

obs.: não tente fazer tudo de uma vez. Como sugerido, vai fazendo uma coisa de cada vez. Só para para um próximo quando finalizar um outro. 

 

Mais pra frente vemos qual é o próximo passo.

 

 

No aguardo.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

ADENDO:
Sobre:

11 horas atrás, Simon Viegas disse:

//Tabela aleatória
//Tabuleiro 3x3
se (tabuleiro = 1) entao
   //{
   //para i de 1 ate 9 faca
   //}
   para i de 1 ate 9 faca
      vet[i] <- Randi(9)
      se i > 1 entao
         j <- 1

 

Como observado, o código ficou igual. No caso, a alteração seria:

//Tabela aleatória
//Tabuleiro 3x3
se (tabuleiro = 1) entao
   //{
   //para i de 1 ate 9 faca
   //}
   para i de 1 ate tam*tam faca
      vet[i] <- Randi(9)
      se i > 1 entao
         j <- 1

 

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

@Lipeco     seu código está com erro no repita , para ver se o número chegou no lugar onde deve estar ,  e você precisa de outro repita para mover os outros números , até que mova todos para o lugar certo , modifiquei o modo como ele compara se o número está no lugar certo , e funcionou mas apenas para o nível fácil , e para os outros níveis precisa construir ,  então seu código modificado seria assim  :

algoritmo "Trabalho Final"
// Função : Jogar
// Autor : Luiz Felipe rodrigues da Silva
// Data : 24/09/2018
var
  vet     : vetor[1..25    ]    de inteiro
  taborig : vetor[1..5,1..5]    de inteiro
  tabrand : vetor[1..5,1..5]    de inteiro
  contmov,tam,aux,aux2,i,j,l,c   : inteiro
  linha,coluna,tabuleiro,cont    : inteiro
  contres,opcao,ii,xix,num,lf,cf : inteiro
procedimento imprime_tabuleiro
inicio
escreval("-----------------------------------------------------")
    escreval("Faça o movimento do ",num," até igualar a tabela padrão")
    escreval()
    para l de 1 ate tam faca
      para c de 1 ate tam faca
        escreva(tabrand[l,c])
        Se (tabuleiro = 3) entao
          escreva("  ")
        fimse
      fimpara
      Se (tabuleiro = 3) entao
        escreva("  ")
      senao
        escreval()
      fimse
    fimpara
    escreval("-----------------------------------------------------")
fimprocedimento
inicio
  //Escolha do tabuleiro
  repita
    Escreval("Escolha o modo de jogo:")
    Escreval("(1) Fácil"              )
    Escreval("(2) Normall"            )
    Escreval("(3) Difícil"            )
    Leia(tabuleiro)
  ate((tabuleiro = 1) ou (tabuleiro = 2) ou (tabuleiro = 3))
  Limpatela
  tam := tabuleiro+2
  lf  := tam
  cf  := lf
  //Tabela padrão
  Escreval("Como a tabela deve ficar")
  Escreval()
  cont <- 1
  para linha de 1 ate tam faca
    para coluna de 1 ate tam faca
      taborig[linha,coluna]<- cont
      cont <- cont + 1
    fimpara
  fimpara
  taborig[tam,tam] <- 0
  para linha de 1 ate tam faca
    para coluna de 1 ate tam faca
      escreva(taborig[linha,coluna]," ")
    fimpara
    escreval()
  fimpara
  escreval()
  //Tabela aleatória
  //Tabuleiro 3x3
  Se tabuleiro = 1 entao
    para i de 1 ate 9 faca
      vet[i] <- Randi(9)
      se i > 1 entao
        j <- 1
        enquanto j < i faca
          se vet[i] = vet[j] entao
            vet[i] <- randi(9)
            j <- 1
          senao
            j <- j+1
          fimse
        fimenquanto
      fimse
      ii <- 0
      para l de 1 ate 3 faca
        para c de 1 ate 3 faca
          tabrand[l,c] <- vet[1+ii]
          ii<- ii + 1
        fimpara
      fimpara
    fimpara
  fimse
  //tabuleiro 4x4
  Se tabuleiro = 2 entao
    tam <- 4
    para i de 1 ate 16 faca
      vet <- Randi 16
      se i > 1 entao
        j <- 1
        enquanto j < i faca
          se vet = vet[j] entao
            vet <- randi(16)
            j <- 1
          senao
            j <- j+1
          fimse
        fimenquanto
      fimse
      ii <- 0
      para l de 1 ate 4 faca
        para c de 1 ate 4 faca
          tabrand[l,c] <- vet[1+ii]
          ii<- ii + 1
        fimpara
      fimpara
    fimpara
  fimse
  //tabuleiro 5x5
  Se (tabuleiro = 3) entao
    tam <- 5
    para i de 1 ate 25 faca
      vet <- Randi 25
      se i > 1 entao
        j <- 1
        enquanto j < i faca
          se vet = vet[j] entao
            vet <- randi 25
            j <- 1
          senao
            j <- j+1
          fimse
        fimenquanto
      fimse
      ii <- 0
      para l de 1 ate 5 faca
        para c de 1 ate 5 faca
          tabrand[l,c] <- vet[1+ii]
          ii<- ii + 1
        fimpara
      fimpara
    fimpara
  fimse
  //escolha dos movimentos
  contmov <- 0
  //O PROBLEMA ESTÀ NESSE REPITA  e no ATE LÁ NO FINAL
  repita
    Repita
      imprime_tabuleiro   // imprimie o tabuleiro
      escreval("Faça os movimentos com as teclas")
      escreval("  8  ")
      escreval("4 * 6")
      escreval("  2  ")
      escreval()
      repita
        leia (opcao)
        escreval()
      ate ((opcao = 4) ou (opcao = 6) ou (opcao = 2) ou (opcao = 8))
      escolha opcao
      //Movimento esquerda
      caso 4
        para l de 1 ate tam faca
          para c de 1 ate tam faca
            se tabrand[l,c] = num entao   // era zero 0
              se c<>1 entao
                aux            <- tabrand[l,c]
                tabrand[l,c]   <- tabrand[l,c-1]
                tabrand[l,c-1] <- aux
              fimse
            fimse
          fimpara
        fimpara
        contmov <- contmov + 1
        para l de 1 ate tam faca
          para c de 1 ate tam faca
            escreva(tabrand[l,c])
          fimpara
          escreval()
        fimpara
        //Movimento para cima
      caso 8
        para l de 1 ate tam faca
          para c de 1 ate tam faca
            se (l<>1) ENTAO
              se tabrand[l,c] = num entao  // era zero 0
                aux <- tabrand[l,c]
                tabrand[l,c] <- tabrand[l-1,c]
                tabrand[l-1,c] <- aux
              fimse
            fimse
          fimpara
        fimpara
        contmov <- contmov + 1
        para l de 1 ate tam faca
          para c de 1 ate tam faca
            escreva(tabrand[l,c])
          fimpara
          escreval()
        fimpara
        //Movimento para direita
      caso 6
        para l de 1 ate 3 faca
          para c de 1 ate 3 faca
            se (c<>tam) ENTAO
              se tabrand[l,c] = num entao   // era zero 0
                aux <- tabrand[l,c]
                tabrand[l,c] <- tabrand[l,c+1]
                tabrand[l,c+1] <- aux
                interrompa
              fimse
            fimse
          fimpara
        fimpara
        contmov <- contmov + 1
        para l de 1 ate tam faca
          para c de 1 ate tam faca
            escreva(tabrand[l,c])
          fimpara
          escreval()
        fimpara
        //movimento para baixo
      caso 2
        para l de 1 ate tam faca
          aux2 <- 1
          para c de 1 ate tam faca
            se (l<>tam) entao
              se tabrand[l,c] = num entao   // era zero 0
                aux <- tabrand[l,c]
                tabrand[l,c] <- tabrand[l+1,c]
                tabrand[l+1,c] <- aux
                aux2 <- aux
                interrompa
              fimse
            fimse
          fimpara
          se(l<>tam) entao
            se (aux2 = num) entao  // era zero 0
              interrompa
            fimse
          fimse
        fimpara
        contmov <- contmov + 1
      fimescolha
    ate tabrand[lf,cf] = num  // num é o qual número que vai mover
    se(tabuleiro = 1) entao
      se num = 0 entao        //posiciona em qual linha e coluna está o número
        cf := 0               // é a coluna onde ficará o número que está movendo
      fimse
      se num < 3 entao
        lf:=1                // é a linha onde ficará o número que está movendo
        cf := cf + 1         // é a coluna onde ficará o número que está movendo
      senao
        se num < 6 entao
          se num = 3 entao
            cf := 0          // é a coluna onde ficará o número que está movendo
          fimse
          lf := 2            // é a linha onde ficará o número que está movendo
          cf := cf + 1       // é a coluna onde ficará o número que está movendo
        senao
          se num = 6 entao
            cf := 0          // é a coluna onde ficará o número que está movendo
          fimse
          lf := 3            // é a linha onde ficará o número que está movendo
          cf := cf + 1       // é a coluna onde ficará o número que está movendo
        fimse
      fimse
    senao
      //construir para tabuleiro = 2 e 3
    fimse
    num := num + 1
    limpatela
    se num < 9 entao
      escreval("========================================")
      escreval("    Agora Será A Vez Do Número ---> ",num)
      escreval("========================================")
    fimse
  ate num = 9  // ate mover todos os números
  escreval("   +------------------------------------------+")
  escreval("   |        Completou Os Movimentos           |")
  para l de 1 ate tam faca
    escreva("   |               ")
    para c de 1 ate tam faca
      escreva(tabrand[l,c])
    fimpara
    escreva("                     |")
    escreval
  fimpara
  escreval("   |                                          |")
  escreval("   +------------------------------------------+")
  escreval
  Escreval("           Parabéns!!! Você Venceu!!!")
  escreval("                                      ----")
  escreval("           Número de tentativas foi : ",contmov," ")
  escreval("                                      ----")
  escreval
fimalgoritmo

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!