import java.applet.Applet; import java.applet.AudioClip; import java.awt.*; public class TowerOfHanoi extends Applet { Hanoi aHanoi; AudioClip au; DrawRings aDrawRings; public void init() { aHanoi = new Hanoi(); aHanoi.init(3); aDrawRings = new DrawRings(aHanoi); // DoHanoi aDoHanoi = new DoHanoi(aHanoi, aDrawRings); au = getAudioClip(getDocumentBase(), "EndOfWorld.au"); // aDoHanoi.setEndOfWorldSound(au); setLayout(new BorderLayout()); setBackground(Color.cyan); Panel panelNumOfRings = new Panel(); panelNumOfRings.setLayout(new FlowLayout()); // Label labelNumOfRings = new Label("リングの数 :"); Label labelNumOfRings = new Label("Number Of Rings :"); Choice choiceNumOfRings = new Choice(); for (int i = 3; i <= 7; i++) { choiceNumOfRings.addItem(String.valueOf(i)); } // choiceNumOfRings.addItemListener(aDoHanoi); panelNumOfRings.add(labelNumOfRings); panelNumOfRings.add(choiceNumOfRings); Panel panelNewGame = new Panel(); // Button newGameButton = new Button("最初からやり直す"); Button newGameButton = new Button("New Game"); // newGameButton.addActionListener(aDoHanoi); // Button solveFromInitial = new Button("お手本を見る"); Button solveFromInitial = new Button("Solved by computer"); // solveFromInitial.addActionListener(aDoHanoi); panelNewGame.add(newGameButton); panelNewGame.add(solveFromInitial); // add(panelNumOfRings, "North"); // add(aDrawRings, "Center"); // add(panelNewGame, "South"); add("North", panelNumOfRings); add("Center", aDrawRings); add("South", panelNewGame); } public boolean mouseDown(Event e, int x, int y) { if (!aHanoi.isEndOfWorld()) { try { int selectedTower = x / 200; int fromTower = aHanoi.selectedTower(); if (fromTower < 0) { aHanoi.markSelectedRing(selectedTower); } else { aHanoi.moveRing(fromTower, selectedTower); aHanoi.unmarkSelectedRing(); } } catch (IllegalMovementException ex) { aHanoi.unmarkSelectedRing(); } finally { aDrawRings.repaint(); } if (aHanoi.isEndOfWorld()) { if (au != null) { au.play(); } } } return true; } public boolean action(Event e, Object o) { if (e.target instanceof Choice) { try { int numOfRings = Integer.parseInt((String)o); aHanoi.init(numOfRings); aDrawRings.repaint(); } catch (NumberFormatException ex) { } return true; } else if (e.target instanceof Button) { if ("New Game".equals(o)) { int numOfRings = aHanoi.sizeOfTower(0) + aHanoi.sizeOfTower(1) + aHanoi.sizeOfTower(2); aHanoi.init(numOfRings); aDrawRings.repaint(); } else if ("Solved by computer".equals(o)) { int numOfRings = aHanoi.sizeOfTower(0) + aHanoi.sizeOfTower(1) + aHanoi.sizeOfTower(2); aHanoi.init(numOfRings); aDrawRings.repaint(); SolveHanoiThread aSolveHanoiThread = new SolveHanoiThread(aHanoi, aDrawRings); if (au != null) { aSolveHanoiThread.setSound(au); } aSolveHanoiThread.start(); } else { } } return false; } } class SolveHanoiThread extends Thread { Hanoi aHanoi; DrawRings aDrawRings; AudioClip au = null; public SolveHanoiThread(Hanoi aHanoi, DrawRings aDrawRings) { this.aHanoi = aHanoi; this.aDrawRings = aDrawRings; } public void setSound(AudioClip au) { this.au = au; } public void run() { int numOfRings = aHanoi.sizeOfTower(0) + aHanoi.sizeOfTower(1) + aHanoi.sizeOfTower(2); solveFromInitial(numOfRings, 1, 2, 3); if (au != null && aHanoi.isEndOfWorld()) { au.play(); } stop(); } void solveFromInitial(int numOfRings, int from, int to, int another) { try { if (numOfRings == 1) { aHanoi.moveRing(from-1, to-1); sleep(1000); aDrawRings.repaint(); } else { solveFromInitial(numOfRings - 1, from, another, to); aHanoi.moveRing(from-1, to-1); sleep(1000); aDrawRings.repaint(); solveFromInitial(numOfRings - 1, another, to, from); } } catch (IllegalMovementException ex1) { // System.out.println(ex1.getLocalizedMessage()); } catch (InterruptedException ex2) { } } }