import java.util.*; public class HanoiTowers { private final int NUMBER_OF_TOWERS = 3; private int maxSize; private List towers; public HanoiTowers(int maxSize, int initialPosition){ this.maxSize = maxSize; towers = new ArrayList(); for(int i = 0 ; i < NUMBER_OF_TOWERS ; i++){ if(i == initialPosition){ towers.add(new Tower(maxSize, true)); }else{ towers.add(new Tower(maxSize, false)); } } } // 円盤の移動 public void move(int source, int destination){ Pile pile = getTower(source).popPile(); getTower(destination).pushPile(pile); } // 終了チェック public boolean checkCompletion(int goal){ if(getTower(goal).getNumber() == maxSize){ return true; }else{ return false; } } // 移動チェック public boolean isMovable(int source, int destination){ try{ if(getTower(source).isEmpty()){ return false; } }catch(IndexOutOfBoundsException ex){ return false; } Pile pileSource = getTower(source).peekPile(); try{ if(getTower(destination).isEmpty()){ return true; } }catch(IndexOutOfBoundsException ex){ return false; } Pile pileDestination = getTower(destination).peekPile(); if(pileSource.getSize() < pileDestination.getSize()){ return true; }else{ return false; } } // i 番目の塔を返す private Tower getTower(int i) throws IndexOutOfBoundsException { return (Tower)towers.get(i); } public void print(){ System.out.println(""); List tempTowers = new ArrayList(); for(int i = 0 ; i < 3 ; i++){ // スタックを操作するのでクローンを生成 tempTowers.add(getTower(i).clone()); } for(int i = maxSize ; i > 0 ; i--){ for(int j = 0 ; j < NUMBER_OF_TOWERS ; j++){ if(((Tower)tempTowers.get(j)).getNumber() >= i){ ((Tower)tempTowers.get(j)).popPile().print(); }else{ ((Tower)tempTowers.get(j)).print(); } System.out.print(" "); } System.out.println(""); } printBase(); } private void printTowerNumber(int num){ for(int i = 0 ; i < maxSize-1 ; i++){ System.out.print(" "); } System.out.print(num); for(int i = 0 ; i < maxSize-1 ; i++){ System.out.print(" "); } } private void printBase(){ for(int i = 0 ; i < 3 ; i++){ for(int j = 0 ; j < 2 * maxSize - 1 ; j++){ System.out.print("~"); } System.out.print(" "); } System.out.println(""); for(int i = 0 ; i < 3 ; i++){ printTowerNumber(i); System.out.print(" "); } System.out.println("\n"); } }