import java.util.*; public class Hanoi { private final static int START = 0; // 開始塔 private final static int END = 1; // 終了塔 private final static int VIA = 2; // 経由塔 private int size; // 塔のサイズ private Player player; public Hanoi(int size){ this.size = size; player = new Player(); } // ゲームのメインルーチン public void startGame(){ HanoiTowers towers = new HanoiTowers(size, START); System.out.println("ハノイの塔"); towers.print(); System.out.println(START + " から " + END + " へ移動させてください\n"); do{ boolean result = player.nextStep(towers); towers.print(); if(!result){ solve(new HanoiTowers(size, START), size, START, END, VIA); return; } }while(!towers.checkCompletion(END)); System.out.println("完成しました\nおめでとうございます"); } // ハノイの塔を解く private HanoiTowers solve(HanoiTowers towers, int n, int start, int end, int via){ if(n > 0){ // n-1 枚を経由塔に移動 towers = solve(towers, n-1, start, via, end); // n 枚目を目的の塔に移動 towers.move(start, end); System.out.println("Move " + start + " to " + end); towers.print(); try{ Thread.sleep(500); }catch(Exception e){} // n-1 枚を経由塔から目的の塔に移動 towers = solve(towers, n - 1, via, end, start); } return towers; } public static void main(String[] args){ if(args.length < 1){ System.out.println("Usage: java Hanoi [円盤の枚数]"); return; } Hanoi hanoi = new Hanoi(Integer.parseInt(args[0])); hanoi.startGame(); } }