?? hanoi11.java
字號(hào):
void setDisc(int d,int p) { peg[++pegTop[p]][p] = d ; }
int getDisc(int d,int p) { return peg[d][p] ; }
int getTopDisc(int p) { return peg[pegTop[p]--][p] ; }
int getPegTop(int p) { return pegTop[p] ; }
int getMoveCount() {return moveCount ; }
int getMinMoves() {return minMoves ; }
int getDiscWidth(int d) { return discWidth[d-1] ; }
boolean isStartPeg(int i) {
if ((i >= 0)&&(pegTop[i]>=0)) return true ;
else return false ;
}
String getBoardStatus() {
String status = null ;
if (moveCount==minMoves)
status = "Congratulations!" ;
else status = "You did it! Now try again, making only " + minMoves + " moves." ;
}
return status ;
}
// manual move
boolean moveDisc(int d,int p1,int p2) {
if ((p1>=0)&&(p2>=0)) {
// to different peg which is empty or has larger disc
if ( (p1!=p2)&&((pegTop[p2]<0)||(peg[pegTop[p2]][p2]>d)) ) {
setDisc(d,p2) ;
moveCount++ ;
return true ;
}
}
setDisc(d,p1) ;
return false ;
}
// AutoSolve move
void moveDisc(int p1,int p2) {
setDisc(getTopDisc(p1),p2) ;
moveCount++ ;
}
}
/******** BOARD CANVAS ********
draws the board using double buffer,
passes canvas mouse events to main class
*/
final class BoardCanvas extends Canvas {
static final int PEG_SPACE=75, DISC_HEIGHT=15 ;
static final Color COLOR_1=new Color(102,51,0),
COLOR_2=new Color(153,102,0),
COLOR_3=new Color(204,153,51),
COLOR_4=new Color(255,204,0),
COLOR_5=new Color(255,255,204) ;
private Image bufferImage ;
private Graphics buffer ;
private Hanoi11 main ;
// constructor
BoardCanvas(Hanoi11 main) {
this.main = main ;
}
void drawBoard(Board b,Image boardImage,int dragDisc,int dragX,int dragY) {
int width=0, disc=0 ;
if (buffer==null) {
bufferImage = createImage(main.CANVAS_WIDTH,main.CANVAS_HEIGHT) ;
buffer = bufferImage.getGraphics() ;
}
// draw board
buffer.drawImage(boardImage,0,0,this) ;
// draw discs
for (int p=main.PEG1; p<=main.PEG3; p++) {
for (int d=0; d<=b.getPegTop(p); d++) {
disc = b.getDisc(d,p) ;
if (disc!=0) {
width = b.getDiscWidth(disc) ;
drawDisc( (((2*p)+1)*PEG_SPACE)-((int)(width/2)),
main.TABLE_TOP-((d+1)*DISC_HEIGHT),width ) ;
}
}
}
// draw dragged disc
if (dragDisc!=0) {
width = b.getDiscWidth(dragDisc) ;
drawDisc(dragX-(int)(width/2),
dragY-(int)(DISC_HEIGHT*.75),width) ;
}
repaint() ;
}
// draw single disc 15 pixel height with primitives
void drawDisc(int x,int y,int width) {
buffer.setColor(COLOR_3) ;
buffer.drawLine(x+4,y,x+width-4,y) ; // 1
buffer.drawLine(x+2,y+1,x+width-2,y+1) ; // 2
buffer.drawRect(x,y+7,width,1) ; // 8,9
buffer.setColor(COLOR_4) ;
buffer.drawLine(x+1,y+2,x+width-1,y+2) ; // 3
buffer.drawRect(x,y+5,width,1) ; // 6,7
buffer.setColor(COLOR_5) ;
buffer.drawLine(x+1,y+3,x+width-1,y+3) ; // 4
buffer.drawLine(x,y+4,x+width,y+4) ; // 5
buffer.setColor(COLOR_2) ;
buffer.drawRect(x,y+9,width,1) ; // 10,11
buffer.drawLine(x+1,y+11,x+width-1,y+11) ; // 12
buffer.setColor(COLOR_1) ;
buffer.drawLine(x+1,y+12,x+width-1,y+12) ; // 13
buffer.drawLine(x+2,y+13,x+width-2,y+13) ; // 14
buffer.drawLine(x+4,y+14,x+width-4,y+14) ; // 15
}
public void paint(Graphics g) { update(g) ; }
public void update(Graphics g) { g.drawImage(bufferImage,0,0,this) ; }
// mouse event handlers
public boolean mouseDown(Event e,int x,int y) { main.selectDisc(x,y) ; return true ; }
public boolean mouseDrag(Event e,int x,int y) { main.dragDisc(x,y) ; return true ; }
public boolean mouseUp(Event e,int x,int y) { main.dropDisc(x,y) ; return true ; }
}
/******** CONTROL PANEL ********
main UI components
*/
final class ControlPanel extends Panel {
static final int MAX_DELAY=1000 ;
private Panel discsPanel ;
private Button bDiscsMinus, bDiscsPlus, bReset, bSolve ;
private Checkbox cbTimer ;
private TextField tfDiscs, tfTimer ;
private Scrollbar sbSpeed ;
private Hanoi11 main ;
private int discs=main.MIN_DISCS, delay=200 ;
// constructor
ControlPanel(Hanoi11 main) {
this.main = main ;
setLayout(new GridLayout(8,1,0,3)) ;
setFont(main.textFont) ;
// DISCS
discsPanel = new Panel() ;
discsPanel.setLayout(new BorderLayout(2,0)) ;
tfDiscs = new TextField(3) ;
tfDiscs.setFont(main.monoFont) ;
tfDiscs.setForeground(Color.black) ;
tfDiscs.setBackground(Color.lightGray) ;
tfDiscs.setEditable(false) ;
setDiscs(discs) ;
discsPanel.add("West",bDiscsMinus=new Button("-")) ;
bDiscsMinus.setFont(main.monoFont) ;
discsPanel.add("Center",tfDiscs) ;
discsPanel.add("East",bDiscsPlus=new Button("+")) ;
bDiscsPlus.setFont(main.monoFont) ;
discsPanel.validate() ;
// SPEED
sbSpeed = new Scrollbar(Scrollbar.HORIZONTAL,
(MAX_DELAY-delay),0,0,(MAX_DELAY-9)) ;
sbSpeed.setBackground(Color.lightGray) ;
sbSpeed.setPageIncrement((int)(MAX_DELAY/10)) ;
sbSpeed.setLineIncrement((int)(MAX_DELAY/100)) ;
bSolve = new Button("AUTOSOLVE") ;
// TIMER
cbTimer = new Checkbox(" TIMER") ;
cbTimer.setBackground(Color.gray) ;
tfTimer = new TextField(10) ;
tfTimer.setFont(main.monoFont) ;
tfTimer.setForeground(Color.white) ;
tfTimer.setBackground(Color.darkGray) ;
tfTimer.setEditable(false) ;
// construct panel
add(new Label("DISCS",Label.CENTER)) ;
add(discsPanel) ;
add(bReset=new Button("RESET")) ;
add(bSolve=new Button("AUTOSOLVE")) ;
add(new Label("SPEED",Label.CENTER)) ;
add(sbSpeed) ;
add(cbTimer) ;
add(tfTimer) ;
validate() ;
setPlusMinusEnable() ;
cbTimer.setState(true) ;
}
void setTimerEnable(boolean b) { cbTimer.enable(b) ; }
void setAutoSolveEnable(boolean b) { bSolve.enable(b) ; }
void setPlusMinusEnable() {
bDiscsPlus.enable(discs<main.MAX_DISCS) ;
bDiscsMinus.enable(discs>main.MIN_DISCS) ;
}
void setDiscs(int i) {
String s = Integer.toString(i) ;
if (s.length()==1) s = " " + s ;
else if (s.length()==2) s = " " + s ;
tfDiscs.setText(s) ;
}
void setTimer(String s) { tfTimer.setText(s) ; }
int getDiscs() { return discs ; }
int getDelay() { return delay ; }
boolean isTimerOn() { return cbTimer.getState() ; }
// handle button clicks
public boolean action(Event e,Object o) {
if ("AUTOSOLVE".equals(o)) {
setAutoSolveEnable(false) ;
main.startSolveThread() ;
}
else {
if ("+".equals(o)) setDiscs(++discs) ;
else if ("-".equals(o)) setDiscs(--discs) ;
setPlusMinusEnable() ;
main.restartGame() ;
}
return true ;
}
// handle scrollbar
public boolean handleEvent(Event e) {
if (e.target instanceof Scrollbar) {
delay = MAX_DELAY - sbSpeed.getValue() ;
return true ;
}
else return super.handleEvent(e) ;
}
}
/******** STATUS PANEL ********
UI components for status messages and move counter
*/
final class StatusPanel extends Panel {
private TextField tfStatus, tfMoveCount ;
private Hanoi11 main ;
// constructor
StatusPanel(Hanoi11 main) {
this.main = main ;
setFont(main.textFont) ;
tfStatus = new TextField(50) ;
tfStatus.setForeground(Color.white) ;
tfStatus.setBackground(Color.darkGray) ;
tfStatus.setEditable(false) ;
tfMoveCount = new TextField(6) ;
tfMoveCount.setFont(main.monoFont) ;
tfMoveCount.setForeground(Color.white) ;
tfMoveCount.setBackground(Color.darkGray) ;
tfMoveCount.setEditable(false) ;
add(tfStatus) ;
add(tfMoveCount) ;
add(new Label("MOVES")) ;
validate() ;
}
void setMoveCount(int i) {
String s=Integer.toString(i) ;
switch (s.length()) {
case 1: s = " " + s ; break ;
case 2: s = " " + s ; break ;
case 3: s = " " + s ; break ;
case 4: s = " " + s ; break ;
}
tfMoveCount.setText(s) ;
}
void setStatus(String s) { tfStatus.setText(s) ; }
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -