Torre de Hanoi

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:

o codigo ta dando erro na ultima jogada:

[code]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;
	}
}

}[/code]

classe Disco:

[code]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 + "]";
}

}[/code]

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

Espero ajuda Obrigado.

Já arrumei o codigo, agora ta funcionando certinho.

[code]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;
	}
}

}
[/code]