******************************************************/
import java.applet.* ;
import java.awt.* ;
import java.net.* ;
import java.util.* ;
/******************************************************
public class Hanoi extends Applet implements Runnable {
public String getAppletInfo() {
return "Tower of Hanoi "; }
String parameterInfo[][] = {
{"bgColor", "integer", "Applet background color (24-bit RGB hex int)"},
{"boardBgColor", "integer", "Board background color (24-bit RGB hex int)"},
{"title", "string", "Applet title text"},
{"discs", "string", "Discs label text"},
{"plus", "string", "Discs Plus button text"},
{"minus", "string", "Discs Minus button text"},
{"restart", "string", "Restart button text"},
{"solution", "string", "Solution button text"},
{"speed", "string", "Speed label text"},
{"timer", "string", "Timer label text"},
{"moves", "string", "Moves label text"},
{"instruct", "string", "Instructions status text"},
{"solving", "string", "Solve in progress status text"},
{"finished", "string", "Solve finished status text"},
{"minimum", "string", "Minimum moves status text"},
{"win", "string", "Puzzle solved status text"},
{"perfect", "string", "Minimum moves solution status text"} } ;
public String[][] getParameterInfo() { return parameterInfo ; }
static final Color DF_BG_COLOR=Color.white ; // default background color
static final String DF_TITLE ="Tower of Hanoi", // default text strings
DF_DISCS ="DISCS",
DF_PLUS ="+",
DF_MINUS ="-",
DF_RESTART="RESTART",
DF_SOLUTION="SOLUTION",
DF_SPEED ="SPEED",
DF_TIMER ="TIMER",
DF_MOVES ="MOVES",
DF_INSTRUCT="Move all discs to the rightmost peg.",
DF_SOLVING ="Solving ...",
DF_FINISHED="Finished !",
DF_MINIMUM ="The minimum number of moves required is",
DF_WIN ="Done ! Now try for the minimum number of moves.",
DF_PERFECT ="Congratulations !" ;
static final Font titleFont=new Font("Helvetica", Font.BOLD, 12),
textFont=new Font("Helvetica", Font.PLAIN, 11),
monoFont=new Font("Courier", Font.BOLD, 12),
statusFont=new Font("Dialog", Font.PLAIN, 12) ;
static final int CANVAS_WIDTH=450, CANVAS_HEIGHT=250, TABLE_TOP=225,
PEG1=0, PEG2=1, PEG3=2, MIN_DISCS=3, MAX_DISCS=12 ;
protected Color BG_COLOR, BOARD_BG_COLOR ;
protected String TITLE, DISCS, PLUS, MINUS, RESTART, SOLUTION, SPEED, TIMER, MOVES,
INSTRUCT, SOLVING, FINISHED, MINIMUM, WIN, PERFECT ;
private boolean gameOver ;
private int sourceDisc, sourcePeg, targetPeg ;
private String gameStatus ;
private Panel cpBack, titlePanel ;
private Label titleLabel ;
private Board bd ;
private BoardCanvas bc ;
private StatusPanel sp ;
private ControlPanel cp ;
private Image boardImage ;
private String boardImageFile = "board.gif" ;
private Thread solveThread, timer ;
public void init() {
// get applet parameters
// applet background color
String bgColorString = getParameter("bgColor") ;
try { BG_COLOR = bgColorString==null ? DF_BG_COLOR : new Color(Integer.parseInt(bgColorString,16)) ; }
catch (NumberFormatException e) {
BG_COLOR = DF_BG_COLOR ;
System.out.println("ERROR: Invalid bgColor parameter.") ;
}
// board background color
String boardBgColorString = getParameter("boardBgColor") ;
try { BOARD_BG_COLOR = boardBgColorString==null ? BG_COLOR : new Color(Integer.parseInt(boardBgColorString,16)) ; }
catch (NumberFormatException e) {
BOARD_BG_COLOR = BG_COLOR ;
System.out.println("ERROR: Invalid boardBgColor parameter.") ;
}
// text
TITLE = getParameter("title") ; if (TITLE==null) TITLE = new String(DF_TITLE) ;
DISCS = getParameter("discs") ; if (DISCS==null) DISCS = new String(DF_DISCS) ;
PLUS = getParameter("plus") ; if (PLUS==null) PLUS = new String(DF_PLUS) ;
MINUS = getParameter("minus") ; if (MINUS==null) MINUS = new String(DF_MINUS) ;
RESTART = getParameter("restart") ; if (RESTART==null) RESTART = new String(DF_RESTART) ;
SOLUTION = getParameter("solution") ; if (SOLUTION==null) SOLUTION = new String(DF_SOLUTION) ;
SPEED = getParameter("speed") ; if (SPEED==null) SPEED = new String(DF_SPEED) ;
TIMER = getParameter("timer") ; if (TIMER==null) TIMER = new String(DF_TIMER) ;
MOVES = getParameter("moves") ; if (MOVES==null) MOVES = new String(DF_MOVES) ;
INSTRUCT = getParameter("instruct") ; if (INSTRUCT==null) INSTRUCT = new String(DF_INSTRUCT) ;
SOLVING = getParameter("solving") ; if (SOLVING==null) SOLVING = new String(DF_SOLVING) ;
FINISHED = getParameter("finished") ; if (FINISHED==null) FINISHED = new String(DF_FINISHED) ;
MINIMUM = getParameter("minimum") ; if (MINIMUM==null) MINIMUM = new String(DF_MINIMUM) ;
WIN = getParameter("win") ; if (WIN==null) WIN = new String(DF_WIN) ;
PERFECT = getParameter("perfect") ; if (PERFECT==null) PERFECT = new String(DF_PERFECT) ;
// load board image
MediaTracker tracker = new MediaTracker(this) ;
URL url = getCodeBase() ;
boardImage = getImage(url,boardImageFile) ;
tracker.addImage(boardImage,0) ;
try { tracker.waitForID(0); }
catch (InterruptedException e) {}
// initialize applet layout
setBackground(BG_COLOR) ;
Panel mainPanel = new Panel() ;
mainPanel.setLayout(new BorderLayout(0,0)) ;
// BoardCanvas
bc = new BoardCanvas(this) ;
bc.resize(CANVAS_WIDTH,CANVAS_HEIGHT) ;
// Title panel
titlePanel = new Panel() ;
titlePanel.setLayout(new GridLayout(1,1)) ;
titlePanel.setBackground(Color.lightGray) ;
titlePanel.setFont(titleFont) ;
titlePanel.add(titleLabel=new Label(" "+TITLE,Label.LEFT)) ;
titleLabel.setForeground(Color.black) ;
// Control Panel
cpBack = new Panel() ;
cpBack.setLayout(new FlowLayout(FlowLayout.CENTER,10,5)) ;
cpBack.setBackground(Color.lightGray) ;
cp = new ControlPanel(this) ;
cpBack.add(cp) ;
// Status panel
sp = new StatusPanel(this) ;
sp.setBackground(Color.lightGray) ;
// construct applet panel
Panel p1 = new Panel() ;
p1.setLayout(new FlowLayout(FlowLayout.CENTER,10,10)) ;
mainPanel.add("Center",bc) ;
mainPanel.add("North",titlePanel) ;
mainPanel.add("East",cpBack) ;
mainPanel.add("South",sp) ;
p1.add(mainPanel) ;
add(p1) ;
validate() ;
newGame() ;
}
// startup
void newGame() {
int discs = cp.getDiscs() ;
System.gc() ;
gameOver = false ;
bd = new Board(discs,this) ;
bc.drawBoard(bd,boardImage,0,0,0) ;
sp.setMoveCount(0) ;
if (cp.isTimerOn()) timer = new Timer(cp) ;
else cp.setTimer(" ") ;
if (solveThread == null)
sp.setStatus(INSTRUCT) ;
bc.requestFocus() ;
}
// handle Reset event
void restartGame() {
stop() ;
cp.setAutoSolveEnable(true) ;
newGame() ;
}
// kill all threads
public void stop() {
if (solveThread!=null) {
solveThread.stop() ;
solveThread = null ;
}
if (timer!=null) {
timer.stop()