Ir ao conteúdo
  • Cadastre-se

C Problema Torre de Hanói em C


Posts recomendados

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;
} 

 

  • Curtir 1
Link para o comentário
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 .

  • Curtir 1
Link para o comentário
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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
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
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...