java实现汉诺塔Word格式文档下载.docx
- 文档编号:1499136
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:19
- 大小:26.32KB
java实现汉诺塔Word格式文档下载.docx
《java实现汉诺塔Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《java实现汉诺塔Word格式文档下载.docx(19页珍藏版)》请在冰点文库上搜索。
privateBoardCanvasbc;
privateStatusPanelsp;
privateControlPanelcp;
privateImageboardImage;
privateStringboardImageFile="
board.gif"
;
privateThreadsolveThread,timer;
publicvoidinit(){
//loadboardimage
MediaTrackertracker=newMediaTracker(this);
URLurl=getCodeBase();
boardImage=getImage(url,boardImageFile);
tracker.addImage(boardImage,0);
try{tracker.waitForID(0);
}
catch(InterruptedExceptione){}
//initializeappletlayout
setBackground(Color.black);
PanelmainPanel=newPanel();
mainPanel.setLayout(newBorderLayout(0,0));
//BoardCanvas
bc=newBoardCanvas(this);
bc.resize(CANVAS_WIDTH,CANVAS_HEIGHT);
//Titlepanel
titlePanel=newPanel();
titlePanel.setLayout(newGridLayout(1,1));
titlePanel.setBackground(Color.gray);
titlePanel.setFont(titleFont);
titlePanel.add(titleLabel=newLabel("
TowerofHanoi1.1"
Label.LEFT));
titleLabel.setForeground(Color.white);
//ControlPanel
cpBack=newPanel();
cpBack.setBackground(Color.gray);
cp=newControlPanel(this);
cpBack.add(cp);
//Statuspanel
sp=newStatusPanel(this);
sp.setBackground(Color.gray);
//constructappletpanel
mainPanel.add("
Center"
bc);
North"
titlePanel);
East"
cpBack);
South"
sp);
add(mainPanel);
validate();
newGame();
//startup
voidnewGame(){
intdiscs=cp.getDiscs();
System.gc();
gameOver=false;
bd=newBoard(discs,this);
bc.drawBoard(bd,boardImage,0,0,0);
sp.setMoveCount(0);
if(cp.isTimerOn())timer=newTimer(cp);
elsecp.setTimer("
"
);
if(solveThread==null)
sp.setStatus("
Moveall"
+discs+"
discstotherightmostpeg."
bc.requestFocus();
}
//handleResetevent
voidrestartGame(){
stop();
cp.setAutoSolveEnable(true);
//killallthreads
publicvoidstop(){
if(solveThread!
=null){
solveThread.stop();
solveThread=null;
if(timer!
timer.stop();
timer=null;
//spawnAutosolvethread
publicvoidstartSolveThread(){
solveThread=newThread(this);
solveThread.start();
//runAutosolvethread
publicvoidrun(){
Autosolving..."
solve(cp.getDiscs(),PEG1,PEG2,PEG3);
Finished!
"
gameOver=true;
//here'
sthefamousalgorithm
voidsolve(intdiscs,intsource,intaux,inttarget){
if(discs==0)return;
//basetoendrecursion
solve(discs-1,source,target,aux);
//recursivecall#1
bd.moveDisc(source,target);
//movedisc
sp.setMoveCount(bd.getMoveCount());
//updatedisplay
try{solveThread.sleep(cp.getDelay());
}//Autosolvedelay
solve(discs-1,aux,source,target);
//recursivecall#2
//handlemousedragevent
voiddragDisc(intx,inty){
if(!
gameOver&
&
(sourceDisc!
=0))
bc.drawBoard(bd,boardImage,sourceDisc,x,y);
//handlemousedownevent
voidselectDisc(intx,inty){
(solveThread==null)){
if((timer!
=null)&
(!
timer.isAlive()))timer.start();
sourcePeg=pixelToPeg(x,y);
if(bd.isStartPeg(sourcePeg)){
sourceDisc=bd.getTopDisc(sourcePeg);
//handlemouseupevent
voiddropDisc(intx,inty){
=0)){
targetPeg=pixelToPeg(x,y);
if(bd.moveDisc(sourceDisc,sourcePeg,targetPeg)){
gameStatus=bd.getBoardStatus();
if(gameStatus==null)
Theminimumnumberofmovesrequiredis"
+
bd.getMinMoves()+"
."
else{
sp.setStatus(gameStatus);
sourceDisc=0;
//conversionformousedown/upevents
intpixelToPeg(intx,inty){
intpeg=-1;
if((y>
40)&
(y<
TABLE_TOP)){
if((x>
50)&
(x<
100))peg=PEG1;
elseif((x>
200)&
250))peg=PEG2;
350)&
400))peg=PEG3;
returnpeg;
}
/********TIMER********
controlsTimerthread
finalclassTimerextendsThread{
staticfinalintONE_SECOND=1000;
privatelongstartTime,rem;
privateinthours,min,sec;
privateStringsMin,sSec,sTime;
//constructor
Timer(ControlPanelcp){
this.cp=cp;
cp.setTimer(setTime(0));
//runthread
startTime=System.currentTimeMillis();
while(true){
try{Thread.sleep(ONE_SECOND);
}
cp.setTimer(setTime(System.currentTimeMillis()-startTime));
//returnh:
mm:
ssstringfrommilliseconds
StringsetTime(longmillisec){
hours=(int)(millisec/3600000);
rem=millisec-(hours*3600000);
min=(int)(rem/60000);
rem=rem-(min*60000);
sec=(int)(rem/1000);
sMin=Integer.toString(min);
if(sMin.length()==1)sMin="
0"
+sMin;
sSec=Integer.toString(sec);
if(sSec.length()==1)sSec="
+sSec;
sTime="
+Integer.toString(hours)+"
:
+sMin+"
returnsTime;
}
/********BOARD********
controlsdiscpositions,rulesformovingdiscs
finalclassBoard{
staticfinalintPEGS=3,
DISC_SIZES[][]={{68,18},{76,16},{84,14},{92,13},{100,12},
{108,12},{112,11},{116,10},{120,9},{124,9}};
privateintpeg[][],pegTop[]=newint[PEGS],discWidth[];
privateintdiscs,moveCount,minMoves;
privateHanoi11main;
Board(intdiscs,Hanoi11main){
this.discs=discs;
this.main=main;
peg=newint[discs][PEGS];
//putallthedisksonthefirstpeg
for(inti=0;
i<
discs;
i++)peg[i][main.PEG1]=discs-i;
pegTop[main.PEG1]=discs-1;
for(inti=1;
PEGS;
i++)pegTop[i]=-1;
//calculatediscwidths
discWidth=newint[discs];
for(inti=discs-1;
i>
=0;
i--)
discWidth[i]=DISC_SIZES[discs-main.MIN_DISCS][0]-
(DISC_SIZES[discs-main.MIN_DISCS][1]*
(discs-1-i));
moveCount=0;
//minimummovesis(2**discs)-1
minMoves=((int)Math.pow(2.0,discs))-1;
voidsetDisc(intd,intp){peg[++pegTop[p]][p]=d;
intgetDisc(intd,intp){returnpeg[d][p];
intgetTopDisc(intp){returnpeg[pegTop[p]--][p];
intgetPegTop(intp){returnpegTop[p];
intgetMoveCount(){returnmoveCount;
intgetMinMoves(){returnminMoves;
intgetDiscWidth(intd){returndiscWidth[d-1];
booleanisStartPeg(inti){
if((i>
=0)&
(pegTop[i]>
=0))returntrue;
elsereturnfalse;
StringgetBoardStatus(){
Stringstatus=null;
if(pegTop[PEGS-1]==(discs-1)){
if(moveCount==minMoves)
status="
Congratulations!
elsestatus="
Youdidit!
Nowtryagain,makingonly"
+minMoves+"
moves."
returnstatus;
//manualmove
booleanmoveDisc(intd,intp1,intp2){
if((p1>
=0)&
(p2>
//todifferentpegwhichisemptyorhaslargerdisc
if((p1!
=p2)&
((pegTop[p2]<
0)||(peg[pegTop[p2]][p2]>
d))){
setDisc(d,p2);
moveCount++;
returntrue;
setDisc(d,p1);
returnfalse;
//AutoSolvemove
voidmoveDisc(intp1,intp2){
setDisc(getTopDisc(p1),p2);
/********BOARDCANVAS********
drawstheboardusingdoublebuffer,
passescanvasmouseeventstomainclass
finalclassBoardCanvasextendsCanvas{
staticfinalintPEG_SPACE=75,DISC_HEIGHT=15;
staticfinalColorCOLOR_1=newColor(102,51,0),
COLOR_2=newColor(153,102,0),
COLOR_3=newColor(204,153,51),
COLOR_4=newColor(255,204,0),
COLOR_5=newColor(255,255,204);
privateImagebufferImage;
privateGraphicsbuffer;
BoardCanvas(Hanoi11main){
voiddrawBoard(Boardb,ImageboardImage,intdragDisc,intdragX,intdragY){
intwidth=0,disc=0;
if(buffer==null){
bufferImage=createImage(main.CANVAS_WIDTH,main.CANVAS_HEIGHT);
buffer=bufferImage.getGraphics();
//drawboard
buffer.drawImage(boardImage,0,0,this);
//drawdiscs
for(intp=main.PEG1;
p<
=main.PEG3;
p++){
for(intd=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);
//drawdraggeddisc
if(dragDisc!
width=b.getDiscWidth(dragDisc);
drawDisc(dragX-(int)(width/2),
dragY-(int)(DISC_HEIGHT*.75),width);
repaint();
//drawsingledisc15pixelheightwithprimitives
voiddrawDisc(intx,inty,intwidth){
buffer.setColor(COLOR_3);
buffer.drawLine(x+4,y,x+width-4,y);
//1
buffer.dr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 实现 汉诺塔