import java.util.Stack; public class Hanoi{ private Stack[] tower; private int selectedRing; public Hanoi() { tower = new Stack[3]; for (int i = 0; i < 3; i++) { tower[i] = new Stack(); } } public void init(int numOfRings) { try { for (int indexOfTower = 0; indexOfTower < 3; indexOfTower++) { int sizeOfTower = tower[indexOfTower].size(); for (int indexOfRing = 0; indexOfRing < sizeOfTower; indexOfRing++) { tower[indexOfTower].pop(); } } } catch (java.util.EmptyStackException e) { } for (int valueOfRing = numOfRings; valueOfRing > 0; valueOfRing--) { tower[0].push(new Integer(valueOfRing)); } selectedRing = -1; } public boolean isEndOfWorld() { return (tower[0].empty() && tower[1].empty()) || (tower[0].empty() && tower[2].empty()); } public void moveRing(int from, int to) throws IllegalMovementException { try { if (from == to) { // throw new IllegalMovementException("Move ring to another tower!", "違う塔にリングを移しましょうよ。"); throw new IllegalMovementException("Move ring to another tower!"); } if ((!tower[to].empty() && (((Integer)tower[from].peek()).intValue() > ((Integer)tower[to].peek()).intValue()))) { // throw new IllegalMovementException("Can't move bigger ring upto smaller ring!", "小さなりリングの上に大きなリングを動かすことはできません。"); throw new IllegalMovementException("Can't move bigger ring upto smaller ring!"); } tower[to].push(tower[from].pop()); // from の一番上のリングを to にのせる。 } catch (java.util.EmptyStackException e) { // throw new IllegalMovementException("There is no ring in tower " + from + " !", "その塔にリングはありません。"); throw new IllegalMovementException("There is no ring in tower " + from + " !"); } } public void markSelectedRing(int selectedTower) throws IllegalMovementException { try { selectedRing = ((Integer)tower[selectedTower].peek()).intValue(); } catch (java.util.EmptyStackException e) { throw new IllegalMovementException(); } } public void unmarkSelectedRing() { selectedRing = -1; } public int getValueOfSelectedRing() { return selectedRing; } public int selectedTower() { if (selectedRing < 0) { return -1; } else { for (int indexOfTower = 0; indexOfTower < 3; indexOfTower++) { for (int indexOfRing = 0; indexOfRing < tower[indexOfTower].size(); indexOfRing++) { if (((Integer)tower[indexOfTower].elementAt(indexOfRing)).intValue() == selectedRing) return indexOfTower; } } return 999; } } public int valueOfRing(int indexOfTower, int indexOfRing) { return ((Integer)tower[indexOfTower].elementAt(indexOfRing)).intValue(); } public int sizeOfTower(int indexOfTower) { return tower[indexOfTower].size(); } } class IllegalMovementException extends Exception { private String localizedDetailMessage; public IllegalMovementException() { super(); } public IllegalMovementException(String message) { super(message); } // public IllegalMovementException(String message, String localizedMessage) { // super(message); // localizedDetailMessage = localizedMessage; // } // public String getLocalizedMessage() { // return localizedDetailMessage; // } }