Torre de Hanoi

1 resposta
C

Boa tarde tava precisando de uma ajuda em um algoritmo que o professor pediu,
Objetivo: produzir o jogo Torre de Hanoi

o link do jogo:
http://www.gameson.com.br/Jogos-Online/ClassicoPuzzle/Torre-de-Hanoi.html

o codigo ta dando erro na ultima jogada:

package a1_Aula4_30082012_Stack;

import java.util.Stack;

import javax.swing.JOptionPane;

public class Pilha {
	
	
	public static void main(String[] args) {
		Stack <Disco> p1  = new Stack<Disco>(); //cria 3 pilhas que são as hastes
		Stack <Disco> p2 = new Stack<Disco>();
		Stack <Disco> p3  = new Stack<Disco>();
		
		Disco a = new Disco(1); //cria 3 disco
		Disco b = new Disco(2);
		Disco c = new Disco(3);
		
		p1.push(c); //coloca os 3 disco na primeira haste
		p1.push(b);
		p1.push(a);
		
		do{

			int origem = Integer.parseInt(JOptionPane.showInputDialog("Digite a origem: ")); //onde sai o disco topo
			int destino = Integer.parseInt(JOptionPane.showInputDialog("Digite o destino: ")); //onde vai o disco topo
			
		
			
			if(origem ==1&&destino==2){ //opcões para origem e destino
				if(p2.size()==0){
					p2.add(p1.get(p1.size()-1));
					p1.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
					
				[b]}else if((p1.get(p1.size()-1).getTamanho())<(p2.get(p2.size()-1).getTamanho())){ //erro aqui java.lang.ArrayIndexOutOfBoundsException ultima jogada[/b]
					p2.add(p1.get(p1.size()-1));
					p1.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
					
				}else {
					JOptionPane.showMessageDialog(null, "Jogada inválida.");
				}
			}
			
			if(origem==1&&destino==3){//opcões para origem e destino
				if(p3.size()==0){
					p3.add(p1.get(p1.size()-1));
					p1.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
					
				}else if(p1.get(p1.size()-1).getTamanho()<p3.get(p3.size()-1).getTamanho()){
					p3.add(p1.get(p1.size()-1));
					p1.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
					
				}else {
					JOptionPane.showMessageDialog(null, "Jogada inválida.");
				}
			}
			
			if(origem==2&&destino==1){//opcões para origem e destino
				if(p1.size()==0){
					p1.add(p2.get(p2.size()-1));
					p2.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
				}else if(p2.get(p2.size()-1).getTamanho()<p1.get(p1.size()-1).getTamanho()){
					p1.add(p2.get(p2.size()-1));
					p2.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
				}else {
					JOptionPane.showMessageDialog(null, "Jogada inválida.");
				}
			}
			
			if(origem==2&&destino==3){//opcões para origem e destino
				if(p3.size()==0){
					p3.add(p2.get(p2.size()-1));
					p2.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
				}else if(p2.get(p2.size()-1).getTamanho()<p3.get(p3.size()-1).getTamanho()){
					p3.add(p2.get(p2.size()-1));
					p2.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
					
				}else {
					JOptionPane.showMessageDialog(null, "Jogada inválida.");
				}
			}
			
			if(origem==3&&destino==2){//opcões para origem e destino
				if(p2.size()==0){
					p2.add(p3.get(p3.size()-1));
					p3.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
				}else if(p3.get(p3.size()-1).getTamanho()<p2.get(p2.size()-1).getTamanho()){
					p2.add(p3.get(p3.size()-1));
					p1.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
					
				}else {
					JOptionPane.showMessageDialog(null, "Jogada inválida.");
				}
			}
			
			if(origem ==3&&destino==1){//opcões para origem e destino
				if(p1.size()==0){
					p1.add(p3.get(p3.size()-1));
					p3.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
				}else if(p3.get(p1.size()-1).getTamanho()<p1.get(p2.size()-1).getTamanho()){
					p1.add(p3.get(p3.size()-1));
					p3.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
					
				}else {
					JOptionPane.showMessageDialog(null, "Jogada inválida.");
				}
			}
			
		
		}while(valido(p1, p2, p3));//opcões para origem e destino
			JOptionPane.showMessageDialog(null, "Parabéns Objetivo Concluido, com muito esforço!");
		
	}
	public static boolean valido(Stack<Disco> p1, Stack<Disco> p2,Stack<Disco> p3){ //metodo para validar o jogo completo
		if(p2.size()==0&&p3.size()==3){
			return false;
		}else if(p3.size()==0&&p2.size()==3){
			return false;
		}else{
			return true;
		}
	}
}
classe Disco:
package a1_Aula4_30082012_Stack;

public class Disco {
	private int tamanho;
	
	public Disco(int tamanho) {
		this.tamanho = tamanho;
	}

	public int getTamanho() {
		return tamanho;
	}

	public void setTamanho(int tamanho) {
		this.tamanho = tamanho;
	}

	@Override
	public String toString() {
		return "Disco [tamanho=" + tamanho + "]";
	}

}
passos para terminar o jogo:
origem                   destino
1                              2
1                              3
2                              3
1                              2
3                              1
3                              2
1                              2

Espero ajuda Obrigado.

1 Resposta

C

Já arrumei o codigo, agora ta funcionando certinho.
>>>>>>>

import java.util.Stack;

import javax.swing.JOptionPane;

public class Pilha {
	
	
	public static void main(String[] args) {
		Stack <Disco> p1  = new Stack<Disco>(); //cria 3 pilhas que são as hastes
		Stack <Disco> p2 = new Stack<Disco>();
		Stack <Disco> p3  = new Stack<Disco>();
		
		Disco a = new Disco(1); //cria 3 disco
		Disco b = new Disco(2);
		Disco c = new Disco(3);
		
		p1.push(c); //coloca os 3 disco na primeira haste
		p1.push(b);
		p1.push(a);
		
		do{
			
			System.out.print("Pilha 1: ");
			for(int k = 0 ;k<p1.size();k++){
				System.out.print(" "+p1.get(k));
			}
			System.out.println();
			System.out.print("Pilha 2: ");
			
			for(int j = 0 ;j<p2.size();j++){
				System.out.print(" "+p2.get(j));
			}
			System.out.println();
			System.out.print("Pilha 3: ");
			
			for(int m = 0 ;m<p3.size();m++){
				System.out.print(" "+p3.get(m));
			}
			System.out.println();
			System.out.println();
			System.out.println();
			
			
			int origem = Integer.parseInt(JOptionPane.showInputDialog("Digite a origem: ")); //onde sai o disco topo
			int destino = Integer.parseInt(JOptionPane.showInputDialog("Digite o destino: ")); //onde vai o disco topo
			
		
			try{
			if(origem ==1&&destino==2){ //opcões para origem e destino
				if(p2.size()==0){
					p2.add(p1.get(p1.size()-1));
					p1.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
					
				}else if((p1.get(p1.size()-1).getTamanho())<(p2.get(p2.size()-1).getTamanho())){ //erro aqui java.lang.ArrayIndexOutOfBoundsException ultima jogada
					p2.add(p1.get(p1.size()-1));
					p1.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
					
				}else {
					JOptionPane.showMessageDialog(null, "Jogada inválida.");
				}
			}
			
			if(origem==1&&destino==3){//opcões para origem e destino
				if(p3.size()==0){
					p3.add(p1.get(p1.size()-1));
					p1.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
					
				}else if(p1.get(p1.size()-1).getTamanho()<p3.get(p3.size()-1).getTamanho()){
					p3.add(p1.get(p1.size()-1));
					p1.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
					
				}else {
					JOptionPane.showMessageDialog(null, "Jogada inválida.");
				}
			}
			
			if(origem==2&&destino==1){//opcões para origem e destino
				if(p1.size()==0){
					p1.add(p2.get(p2.size()-1));
					p2.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
				}else if(p2.get(p2.size()-1).getTamanho()<p1.get(p1.size()-1).getTamanho()){
					p1.add(p2.get(p2.size()-1));
					p2.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
				}else {
					JOptionPane.showMessageDialog(null, "Jogada inválida.");
				}
			}
			
			if(origem==2&&destino==3){//opcões para origem e destino
				if(p3.size()==0){
					p3.add(p2.get(p2.size()-1));
					p2.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
				}else if(p2.get(p2.size()-1).getTamanho()<p3.get(p3.size()-1).getTamanho()){
					p3.add(p2.get(p2.size()-1));
					p2.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
					
				}else {
					JOptionPane.showMessageDialog(null, "Jogada inválida.");
				}
			}
			
			if(origem==3&&destino==2){//opcões para origem e destino
				if(p2.size()==0){
					p2.add(p3.get(p3.size()-1));
					p3.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
				}else if(p3.get(p3.size()-1).getTamanho()<p2.get(p2.size()-1).getTamanho()){
					p2.add(p3.get(p3.size()-1));
					p3.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
					
				}else {
					JOptionPane.showMessageDialog(null, "Jogada inválida.");
				}
			}
			
			if(origem ==3&&destino==1){//opcões para origem e destino
				if(p1.size()==0){
					p1.add(p3.get(p3.size()-1));
					p3.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
				}else if(p3.get(p1.size()-1).getTamanho()<p1.get(p2.size()-1).getTamanho()){
					p1.add(p3.get(p3.size()-1));
					p3.pop();
					JOptionPane.showMessageDialog(null, "Jogada OK");
					
				}else {
					JOptionPane.showMessageDialog(null, "Jogada inválida.");
				}
			}
			}catch(Exception erro){
				JOptionPane.showMessageDialog(null, "Jogada Inválida.");
			}
			
		
		}while(valido(p1, p2, p3));//opcões para origem e destino
			JOptionPane.showMessageDialog(null, "Parabéns Objetivo Concluido!");
			
			System.out.print("Pilha 1: ");
			for(int k = 0 ;k<p1.size();k++){
				System.out.print(" "+p1.get(k));
			}
			System.out.println();
			System.out.print("Pilha 2: ");
			
			for(int j = 0 ;j<p2.size();j++){
				System.out.print(" "+p2.get(j));
			}
			System.out.println();
			System.out.print("Pilha 3: ");
			
			for(int m = 0 ;m<p3.size();m++){
				System.out.print(" "+p3.get(m));
			}
		
	}
	public static boolean valido(Stack<Disco> p1, Stack<Disco> p2,Stack<Disco> p3){ //metodo para validar o jogo completo
		if(p2.size()==0&&p3.size()==3){
			return false;
		}else if(p3.size()==0&&p2.size()==3){
			return false;
		}else{
			return true;
		}
	}
}
Criado 1 de setembro de 2012
Ultima resposta 3 de set. de 2012
Respostas 1
Participantes 1