Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Rodrigospringfield89

C Problema Torre de Hanói em C

Recommended Posts

Olá companheiros do fórum, tudo bom com vocês?

 

Estou tentando programar o jogo da Torre de Hanói em C, mas não consigo resolver um problema. O objetivo do jogo é passar os nº 1,2 3 para as outras duas torres, e o nº 1 deve ficar sempre no topo, nunca embaixo do 2 ou 3.

 

O problema é que quando eu digito o nº 1 para colocar ele na torre 2 ou 3, o mesmo não é marcado no tabuleiro do jogo. O tabuleiro fiz como sendo uma matriz 3x3.

Já tentei de tudo, mas não consigo resolver o problema citado anteriormente. Peço por gentileza, que alguém possa me dar uma luz de como eu poderia resolver o mesmo.

 

Agradeço desde já pela atenção. Um cordial abraço. 

 

O código do programa em C

 

#include<stdio.h>
#include<stdlib.h>

int torre[3][3];
int  eto,etd;
int linha;
int aux=0;

void torres(){
	for(linha=0;linha<3;linha++){//criação das torres do jogo
			torre[linha][0]=0;
			torre[linha][1]=0;
			torre[linha][2]=0;
	
 	}
		torre[0][0] = 1;
		torre[1][0] = 2;
		torre[2][0] = 3;
}

void exibirpainel(){
		printf("\n\n---------------------BEM VINDO AO TORRE DE HANOI 2.0---------------------");//Criação do menu
	    printf("\n\nSeu objetivo e passar os discos para as outras torres em ordem crescente");
	    printf("\n\nO disco 1 deve ficar sempre no topo da torre");
	    printf("\n\n");
}

void exibirtorres(){//função para exibir as torres durante o jogo
			for(linha=0;linha<3;linha++){
				printf("%d\t %d\t %d\t\n", torre[linha][0], torre[linha][1], torre[linha][2]);	
		}		
}

void escolha(){//função para escolher as torres
	    printf("\n\nInforme a torre origem: \n\n(1) - Torre 1 \n(2) - Torre 2 \n(3) - Torre 3  \n\n ");
		scanf("%d", &eto);
		printf("\n\nInforme a torre destino: \n\n(1) - Torre 1 \n(2) - Torre 2 \n(3) - Torre 3  \n\n ");
		scanf("%d",&etd);
		
		if(eto==1){//laço para zerar o disco escolhido na torre de origem
			for(linha=0;linha<3;linha++){
		        if(torre[linha][0]>0){
		    	aux=torre[linha][0];//auxiliar armazena o valor escolhido
		    	torre[linha][0]=0;
		    	torre[linha][etd-1]=aux;//auxiliar marca o valor no tabuleiro
		    	exibirtorres();
			    escolha();
	 		}
		}
	}
	   else if(eto==2){
	   	    for(linha=0;linha<3;linha++){
	   	    if(torre[linha][1]>0){
	   	    	aux=torre[linha][1];
	   	    	torre[linha][1]=0;
	   	    	torre[linha][etd-1]=aux;
	   	    	exibirtorres();
	   	    	escolha();
			    }
			}
	    }
	   
	   else if(eto==3){
	   	    for(linha=0;linha<3;linha++){
	   	    if(torre[linha][2]>0){
	   	    	aux=torre[linha][2];
	   	    	torre[linha][2]=0;
	   	    	torre[linha][etd-1]=aux;
	   	    	exibirtorres();
	   	    	escolha();
			   }
			}
	    }
	    
	    if(etd==1){//marcar na torre destino
	    	for(linha=2;linha>-1;linha--){
	    	if(torre[linha][0]==0){
	    	    torre[linha][0]=aux;
	    		exibirtorres();
	   	    	escolha();
		       } 
			}
		}
		else if(etd==2){
	    	for(linha=2;linha>-1;linha--){
	    	if(torre[linha][1]==0){
	    	    torre[linha][1]=aux;
	    		exibirtorres();
	   	    	escolha();
		       } 
			}
		}
		else if(etd==3){
	    	for(linha=2;linha>-1;linha--){
	    	if(torre[linha][2]==0){
	    	    torre[linha][2]=aux;
	    		exibirtorres();
	   	    	escolha();
		       } 
			}
		}
} 

int main(){
	torres();
	exibirpainel();
	exibirtorres();
	escolha();
	
	return 0;
} 

 

Editado por Rodrigospringfield89
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rodrigospringfield89    não está colocando o número na terre escolhida por que precisa  colocar  a linha com os comandos para fazer isso  nas três possibilidades se eto for  1 ou 2 ou 3 : 

void escolha(){//função para escolher as torres
        printf("\n\nInforme a torre origem: \n\n(1) - Torre 1 \n(2) - Torre 2 \n(3) - Torre 3  \n\n ");
        scanf("%d", &eto);
        printf("\n\nInforme a torre destino: \n\n(1) - Torre 1 \n(2) - Torre 2 \n(3) - Torre 3  \n\n ");
        scanf("%d",&etd);

        if(eto==1){//laço para zerar o disco escolhido na torre de origem
            for(linha=0;linha<3;linha++){
              if(torre[linha][0]>0){
                aux=torre[linha][0];
                torre[linha][0]=0;

                torre[linha][etd-1]=aux;/* essa linha aqui */

                exibirtorres();
                escolha();
             }
        }
    }

assim ele vai mostrar o número lá na torre escolhida,  mas  ainda precisa  alguns ajustes, pois  ele muda para a outra torre mas na mesma linha ( altura )  onde estava , e creio que deveria colocar o número na base da torre escolhida .

Editado por devair1010
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010 Muito obrigado pela ajuda Devair. Agora está marcando os números nas outras torres. Agora estou quebrando a cabeça para colocar o numero na última posição da torre escolhida. Por exemplo, se eu quero mover da torre 1 para 2, o primeiro nº escolhido, no caso o 1 deve ir para a última posição da torre 2 ou 3.

 

Obrigado novamente pela ajuda!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas agora não consigo marcar na última posição das outras torres. É no laço de repetição que tenho que alterar?

Pois já tentei de tudo e não marca direito.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rodrigospringfield89    é dentro do laço que precisa verificar em qual posição vai colocar ,  então você pode usar alguma coisa parecido com isso :

void escolha(){//função para escolher as torres
    int fim=0;/* para controlar o while */
    do{
        printf("\n\nInforme a torre origem: \n\n(1) - Torre 1 \n(2) - Torre 2 \n(3) - Torre 3  \n\n ");
        scanf("%d", &eto);
        exibirtorres();
        printf("\n\nInforme a torre destino: \n\n(1) - Torre 1 \n(2) - Torre 2 \n(3) - Torre 3  \n\n ");
        scanf("%d",&etd);
        if(eto==1){//laço para zerar o disco escolhido na torre de origem
            for(linha=0;linha<3;linha++){
                if(torre[linha][0]>0){
                    aux=torre[linha][0];
                    torre[linha][0]=0;
                    if(torre[2][etd-1]==0)
                        torre[2][etd-1]=aux;
                    else
                        if(torre[1][etd-1]==0){
                            torre[1][etd-1]=aux;
                        }
                        else
                            if(torre[0][etd-1]==0)
                                torre[0][etd-1]=aux;
                            else
                                printf("Jogada Invalida, Tente Outra !\n");
                    exibirtorres();
                }
            }
        }
        else if(eto==2){
             .
             .
             .
        coloca isso nos outros if e Remova a chamada da função escolha()
        que está dentro desses if's e também os if's que compara o etd
        e use um do / while para que volte ao começo, ao invés de chamar a 
        própria função onde se está dentro .
             .
             .
             .      
       if(torre[0][2]==1 && torre[1][2]==2 && torre[2][2]==3)fim++;
    }while( ! fim );/* isso siginifica  enquanto não fim, que é enquanto fim = zero */
    printf("\n\nParabens, voce Venceu . . . !\n\n");
    getch();
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010 Muito obrigado, funcionou perfeitamente Devair com o do while.

 

Mas as condições de vitória e derrota que criei não estão sendo implementadas pelo programa, se eu coloco um nº maior em cima do menor, a condição não funciona.

 

Obrigado novamente pela ajuda!

 

 

 

void cvitoria(){//função para definir a condição de vitória ou derrota
      if(torre[2][1]==3 && torre[1][1]==2 && torre[0][1]==1){
      	printf("\n\nParabens, voce conseguiu colocar os discos na ordem correta!");
		printf("\n\nVoce venceu!\n\n");
		vitoria++;
   }
	  if(torre[2][2]==3 && torre[1][2]==2 && torre[0][2]==1){
		printf("\n\nParabens, voce conseguiu colocar os discos na ordem correta!");
		printf("\n\nVoce venceu!\n\n");
		vitoria++;
   }
	  if(torre[2][1]==1 && torre[1][1]==2){
	  	printf("\n\n voce colocou o disco maior em cima do menor!");
	  	printf("\n\nVoce perdeu!\n\n");
   }
	
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rodrigospringfield89       para verificar a condição de vitória você pode usar algo mais simples , por exemplo você pode colocar dentro da função escolha alguma coisa assim :

                        }
                        else{/* se tentar colocar um disco maior emcima de um menor */
                            printf("\n\nJogada Invalida, Tente Outra !\n\n        Tecle\n");
                            m--;
                            getch();
                        }
                exibirtorres();
            }
            if(flag==0 && linha==2){/* se tentar mover peça de onde não tem */
                printf("\n\nNao Tem Peca Nessa Torre !\n\n         Tecle");
                getch();
                exibirtorres();
            }
        }
        if(torre[0][2]==1 && torre[1][2]==2 && torre[2][2]==3)fim++;/* se colocar todos discos na terceira torre na ordem certa */
        if(torre[0][1]==1 && torre[1][1]==2 && torre[2][1]==3)fim++;/* se colocar todos discos na segunda  torre na ordem certa */
    }while(!fim);
    printf("\n\n  > Jogo Terminado Com %d Movimentos\n",m);
    printf("  > Parabens, voce Venceu . . . !\n\n        Tecle\n\n");
    getch();

e na hora de pegar a origem e o destino use um do / while de forma que só possa digitar os números 1 ou 2 ou 3 de acordo com os discos que se quer mover e as torres para onde se quer mover esses discos, assim não haverá erros .

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010 Muito obrigado Devair, agora solucionou todos os problemas. Finalmente consegui arrumar o código.

Muito obrigado pela atenção e pela ajuda. Peço desculpas se enviei muitas mensagens.

 

Um cordial abraço!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rodrigospringfield89      não tem problema ,  podes enviar quantas mensagem quiser,  poste seu código final para vermos como ficou e para ajudar outros usuários .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×