java课程设计--Hannoi汉诺塔游戏
汉诺塔 java 程序
汉诺塔java 程序import java.awt.*;import java.awt.event.*;import javax.swing.*;public class AutoMoveDisc extends JDialog implements ActionListener{ int amountOfDisc=3;TowerPoint [] pointA,pointB,pointC;char [] towerName;Container con;StringBuffer moveStep;JTextArea showStep;JButton bStart,bStop,bContinue,bClose;Timer time;int i=0,number=0;AutoMoveDisc(Container con){setModal(true);setTitle("自动演示搬盘子过程");this.con=con;moveStep=new StringBuffer();time=new Timer(1000,this);time.setInitialDelay(10);showStep=new JTextArea(10,12);bStart=new JButton("演示");bStop=new JButton("暂停");bContinue=new JButton("继续");bClose=new JButton("关闭");bStart.addActionListener(this);bStop.addActionListener(this);bContinue.addActionListener(this);bClose.addActionListener(this);JPanel south=new JPanel();south.setLayout(new FlowLayout());south.add(bStart);south.add(bStop);south.add(bContinue);south.add(bClose);add(new JScrollPane(showStep),BorderLayout.CENTER);add(south,BorderLayout.SOUTH);setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);towerName=new char[3];addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){time.stop();setVisible(false);}});}public void setPointA(TowerPoint [] pointA){this.pointA=pointA;}public void setPointB(TowerPoint [] pointB){this.pointB=pointB;}public void setPointC(TowerPoint [] pointC){this.pointC=pointC;}public void setTowerName(char name[]){if(name[0]==name[1]||name[0]==name[2]||name[1]==name[2]){towerName[0]='A';towerName[1]='B';towerName[2]='C';}elsetowerName=name;}public void setAmountOfDisc(int n){amountOfDisc=n;}public void actionPerformed(ActionEvent e) {if(e.getSource()==time){number++;char cStart,cEnd;if(i<=moveStep.length()-2){cStart=moveStep.charAt(i);cEnd=moveStep.charAt(i+1);showStep.append("("+number+")从"+cStart+"座搬一个盘子到"+cEnd+"座\n");autoMoveDisc(cStart,cEnd);}i=i+2;if(i>=moveStep.length()-1){time.stop();}}else if(e.getSource()==bStart){if(moveStep.length()==0){if(time.isRunning()==false){i=0;moveStep=new StringBuffer();setMoveStep(amountOfDisc,towerName[0],towerName[1],towerName[2]);number=0;time.start();}}}else if(e.getSource()==bStop){if(time.isRunning()==true)time.stop();}else if(e.getSource()==bContinue){if(time.isRunning()==false)time.restart();}else if(e.getSource()==bClose){time.stop();setVisible(false);}}private void setMoveStep(int amountOfDisc,char one,char two,char three){ if(amountOfDisc==1){moveStep.append(one);moveStep.append(three);}else{setMoveStep(amountOfDisc-1,one,three,two);moveStep.append(one);moveStep.append(three);setMoveStep(amountOfDisc-1,two,one,three);}}private void autoMoveDisc(char cStart,char cEnd){Disc disc=null;if(cStart==towerName[0]){for(int i=0;i<pointA.length;i++){if(pointA[i].isHaveDisc()==true){disc=pointA[i].getDiscOnPoint();pointA[i].setHaveDisc(false);break;}}}if(cStart==towerName[1]){for(int i=0;i<pointB.length;i++){if(pointB[i].isHaveDisc()==true){disc=pointB[i].getDiscOnPoint();pointB[i].setHaveDisc(false);break;}}}if(cStart==towerName[2]){for(int i=0;i<pointC.length;i++){if(pointC[i].isHaveDisc()==true){disc=pointC[i].getDiscOnPoint();pointC[i].setHaveDisc(false);break;}}}TowerPoint endPoint=null;int i=0;if(cEnd==towerName[0]){for(i=0;i<pointA.length;i++){if(pointA[i].isHaveDisc()==true){if(i>0){endPoint=pointA[i-1];break;}else if(i==0)break;}}if(i==pointA.length)endPoint=pointA[pointA.length-1];}if(cEnd==towerName[1]){for(i=0;i<pointB.length;i++){if(pointB[i].isHaveDisc()==true){if(i>0){endPoint=pointB[i-1];break;}else if(i==0)break;}}if(i==pointB.length)endPoint=pointB[pointB.length-1];}if(cEnd==towerName[2]){for(i=0;i<pointC.length;i++){if(pointC[i].isHaveDisc()==true){if(i>0){endPoint=pointC[i-1];break;}else if(i==0)break;}}if(i==pointC.length)endPoint=pointC[pointC.length-1];}if(endPoint!=null&&disc!=null){endPoint.putDisc(disc,con);endPoint.setHaveDisc(true);}}}import javax.swing.*;import java.awt.*;public class Disc extends JButton{int number;TowerPoint point;Disc(){setBackground(Color.cyan);}public void setNumber(int n){number=n;}public int getNumber(){return number;}public void setPoint(TowerPoint p){point=p;}public TowerPoint getPoint(){return point;}}import java.awt.event.*;import java.awt.*;public class HandleMouse implements MouseListener,MouseMotionListener { TowerPoint [] pointA,pointB,pointC;TowerPoint startPoint=null,endPoint=null;int leftX,leftY,x0,y0;boolean move=false,countTime=false;Container con;HandleMouse(Container con){this.con=con;}public void setPointA(TowerPoint [] pointA){this.pointA=pointA;}public void setPointB(TowerPoint [] pointB){this.pointB=pointB;}public void setPointC(TowerPoint [] pointC){this.pointC=pointC;}public void mousePressed(MouseEvent e){move=false;Disc disc=null;disc=(Disc)e.getSource();startPoint=disc.getPoint();x0=e.getX();y0=e.getY();int m=0;for(int i=0;i<pointA.length;i++){if(pointA[i].equals(startPoint)){m=i;if(m>0&&(pointA[m-1].isHaveDisc()==false)){move=true;break;}else if(m==0){move=true;break;}}}for(int i=0;i<pointB.length;i++){if(pointB[i].equals(startPoint)){m=i;if(m>0&&(pointB[m-1].isHaveDisc()==false)){move=true;break;}else if(m==0){move=true;break;}}}for(int i=0;i<pointC.length;i++){if(pointC[i].equals(startPoint)){m=i;if(m>0&&(pointC[m-1].isHaveDisc()==false)){move=true;break;}else if(m==0){move=true;break;}}}}public void mouseMoved(MouseEvent e){}public void mouseDragged(MouseEvent e){Disc disc=null;disc=(Disc)e.getSource();leftX=disc.getBounds().x;leftY=disc.getBounds().y;int x=e.getX();int y=e.getY();leftX=leftX+x;leftY=leftY+y;if(move==true)disc.setLocation(leftX-x0,leftY-y0);}public void mouseReleased(MouseEvent e){Disc disc=null;disc=(Disc)e.getSource();Rectangle rect=disc.getBounds();boolean location=false;int x=-1,y=-1;for(int i=0;i<pointA.length;i++){x=pointA[i].getX();y=pointA[i].getY();if(rect.contains(x,y)){endPoint=pointA[i];if(i==pointA.length-1&&endPoint.isHaveDisc()==false){location=true;break;}else if(i<pointA.length-1&&pointA[i+1].isHaveDisc()==true&&endPoint.isHaveDisc()==false&&pointA[i+1].getDiscOnPoint().getNumber()>disc.getNumber()){location=true;break;}}}for(int i=0;i<pointB.length;i++){x=pointB[i].getX();y=pointB[i].getY();if(rect.contains(x,y)){endPoint=pointB[i];if(i==pointB.length-1&&endPoint.isHaveDisc()==false){location=true;break;}else if(i<pointB.length-1&&pointB[i+1].isHaveDisc()==true&&endPoint.isHaveDisc()==false&&pointB[i+1].getDiscOnPoint().getNumber()>disc.getNumber()){location=true;break;}}}for(int i=0;i<pointC.length;i++){x=pointC[i].getX();y=pointC[i].getY();if(rect.contains(x,y)){endPoint=pointC[i];if(i==pointC.length-1&&endPoint.isHaveDisc()==false){location=true;break;}else if(i<pointC.length-1&&pointC[i+1].isHaveDisc()==true&&endPoint.isHaveDisc()==false&&pointC[i+1].getDiscOnPoint().getNumber()>disc.getNumber()){location=true;break;}}}if(endPoint!=null&&location==true){endPoint.putDisc(disc,con);startPoint.setHaveDisc(false);}elsestartPoint.putDisc(disc,con);}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){}public void mouseClicked(MouseEvent e){}}import javax.swing.*;import java.awt.*;import java.awt.event.*;public class HannoiWindow extends JFrame implements ActionListener{ Tower tower=null;int amountOfDisc=3;char []towerName={'A','B','C'};JMenuBar bar;JMenu menuGrade;JMenuItem oneGradeItem,twoGradeItem,threeGradeItem;JButton renew=null;JButton autoButton=null;JPanel center=new JPanel();HannoiWindow(){tower=new Tower(towerName);tower.setAmountOfDisc(amountOfDisc);tower.setMaxDiscWidth(120);tower.setMinDiscWidth(50);tower.setDiscHeight(16);tower.putDiscOnTower();add(tower,BorderLayout.CENTER);bar=new JMenuBar();menuGrade=new JMenu("选择级别");oneGradeItem=new JMenuItem("初级");twoGradeItem=new JMenuItem("中级");threeGradeItem=new JMenuItem("高级");menuGrade.add(oneGradeItem);menuGrade.add(twoGradeItem);menuGrade.add(threeGradeItem);bar.add(menuGrade);setJMenuBar(bar);oneGradeItem.addActionListener(this);twoGradeItem.addActionListener(this);threeGradeItem.addActionListener(this);renew=new JButton("重新开始");renew.addActionListener(this);autoButton=new JButton("自动演示");autoButton.addActionListener(this);JPanel north=new JPanel();north.add(renew);north.add(autoButton);String mess="将全部盘子从"+towerName[0]+"座搬运到"+towerName[1]+ "座或"+towerName[2]+"座";JLabel hintMess=new JLabel(mess,JLabel.CENTER);north.add(hintMess);add(north,BorderLayout.NORTH);setResizable(false);setVisible(true);setBounds(60,60,460,410);validate();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public void actionPerformed(ActionEvent e){if(e.getSource()==oneGradeItem){amountOfDisc=3;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==twoGradeItem){amountOfDisc=4;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==threeGradeItem){amountOfDisc=5;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==renew){tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==autoButton){tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();int x=this.getBounds().x+this.getBounds().width;int y=this.getBounds().y;tower.getAutoMoveDisc().setLocation(x,y);tower.getAutoMoveDisc().setSize(280,this.getBounds().height);tower.getAutoMoveDisc().setVisible(true);}validate();}public static void main(String args[]){new HannoiWindow();}}import javax.swing.*;import java.awt.*;public class Tower extends JPanel{int amountOfDisc=3;Disc [] disc;int maxDiscWidth,minDiscWidth,discHeight;char [] towerName;TowerPoint [] pointA,pointB,pointC;HandleMouse handleMouse;AutoMoveDisc autoMoveDisc;Tower(char [] towerName){handleMouse=new HandleMouse(this);this.towerName=towerName;setLayout(null);setBackground(new Color(200,226,226));}public void setAmountOfDisc(int number){if(number<=1)amountOfDisc=1;elseamountOfDisc=number;}public void setMaxDiscWidth(int m){maxDiscWidth=m;}public void setMinDiscWidth(int m){minDiscWidth=m;}public void setDiscHeight(int h){discHeight=h;}public AutoMoveDisc getAutoMoveDisc(){return autoMoveDisc;}public void putDiscOnTower(){removeDisk();int n=(maxDiscWidth-minDiscWidth)/amountOfDisc;disc=new Disc[amountOfDisc];for(int i=0;i<disc.length;i++){disc[i]=new Disc();disc[i].setNumber(i);int diskwidth=minDiscWidth+i*n;disc[i].setSize(diskwidth,discHeight);disc[i].addMouseListener(handleMouse);disc[i].addMouseMotionListener(handleMouse);}pointA=new TowerPoint[amountOfDisc];pointB=new TowerPoint[amountOfDisc];pointC=new TowerPoint[amountOfDisc];int vertialDistance=discHeight;for(ii<pointA.nt i=0;length;i++){pointA[i]=new TowerPoint(maxDiscWidth,100+vertialDistance);vertialDistance=vertialDistance+discHeight;}vertialDistance=discHeight;for(int i=0;i<pointB.length;i++){pointB[i]=new TowerPoint(2*maxDiscWidth,100+vertialDistance);vertialDistance=vertialDistance+discHeight;}vertialDistance=discHeight;for(int i=0;i<pointC.length;i++){pointC[i]=new TowerPoint(3*maxDiscWidth,100+vertialDistance);vertialDistance=vertialDistance+discHeight;}for(int i=0;i<pointA.length;i++){pointA[i].putDisc(disc[i],this);}handleMouse.setPointA(pointA);handleMouse.setPointB(pointB);handleMouse.setPointC(pointC);autoMoveDisc=new AutoMoveDisc(this);autoMoveDisc.setTowerName(towerName);autoMoveDisc.setAmountOfDisc(amountOfDisc);autoMoveDisc.setPointA(pointA);autoMoveDisc.setPointB(pointB);autoMoveDisc.setPointC(pointC);validate();repaint();}public void removeDisk(){if(pointA!=null){for(int i=0;i<pointA.length;i++){pointA[i].removeDisc(pointA[i].getDiscOnPoint(),this);pointB[i].removeDisc(pointB[i].getDiscOnPoint(),this);pointC[i].removeDisc(pointC[i].getDiscOnPoint(),this);}}}public void paintComponent(Graphics g){super.paintComponent(g);int x1,y1,x2,y2;x1=pointA[0].getX();y1=pointA[0].getY()-discHeight/2;x2=pointA[amountOfDisc-1].getX();y2=pointA[amountOfDisc-1].getY()+discHeight/2;g.drawLine(x1,y1,x2,y2);x1=pointB[0].getX();y1=pointB[0].getY()-discHeight/2;x2=pointB[amountOfDisc-1].getX();y2=pointB[amountOfDisc-1].getY()+discHeight/2;g.drawLine(x1,y1,x2,y2);x1=pointC[0].getX();y1=pointC[0].getY()-discHeight/2;x2=pointC[amountOfDisc-1].getX();y2=pointC[amountOfDisc-1].getY()+discHeight/2;g.drawLine(x1,y1,x2,y2);g.setColor(Color.blue);x1=pointA[amountOfDisc-1].getX()-maxDiscWidth/2;y1=pointA[amountOfDisc-1].getY()+discHeight/2;x2=pointC[amountOfDisc-1].getX()+maxDiscWidth/2;y2=pointC[amountOfDisc-1].getY()+discHeight/2;int length=x2-x1,height=6;g.fillRect(x1,y1,length,height);int size=5;for(int i=0;i<pointA.length;i++){g.fillOval(pointA[i].getX()-size/2,pointA[i].getY()-size/2,size,size);g.fillOval(pointB[i].getX()-size/2,pointB[i].getY()-size/2,size,size);g.fillOval(pointC[i].getX()-size/2,pointC[i].getY()-size/2,size,size);}g.drawString(towerName[0]+"座",pointA[amountOfDisc-1].getX(),pointA[amountOfDisc-1].getY()+50);g.drawString(towerName[1]+"座",pointB[amountOfDisc-1].getX(),pointB[amountOfDisc-1].getY()+50);g.drawString(towerName[2]+"座",pointC[amountOfDisc-1].getX(),pointC[amountOfDisc-1].getY()+50);}}import java.awt.*;public class TowerPoint{int x,y;boolean haveDisc;Disc disc=null;public TowerPoint(int x,int y){this.x=x;this.y=y;}public boolean isHaveDisc(){return haveDisc;}public void setHaveDisc(boolean boo){haveDisc=boo;}public int getX(){return x;}public int getY(){return y;}public boolean equals(TowerPoint p){if(p.getX()==this.getX()&&p.getY()==this.getY())return true;elsereturn false;}public void putDisc(Component com,Container con){ disc=(Disc)com;con.setLayout(null);con.add(disc);int w=disc.getBounds().width;int h=disc.getBounds().height;disc.setBounds(x-w/2,y-h/2,w,h);haveDisc=true;disc.setPoint(this);con.validate();}public Disc getDiscOnPoint(){return disc;}public void removeDisc(Component com,Container con){ if(com!=null)con.remove(com);con.validate();}}。
汉诺塔游戏课程设计
汉诺塔游戏课程设计一、课程目标知识目标:1. 学生能理解汉诺塔游戏的起源、规则及数学原理。
2. 学生能掌握递归算法的基本概念及其在汉诺塔游戏中的应用。
3. 学生能运用数学归纳法推导汉诺塔游戏的步数与盘子数之间的关系。
技能目标:1. 学生能够运用所学知识,独立设计并解决汉诺塔游戏的不同层次问题。
2. 学生能够通过小组合作,提高问题解决能力和团队协作能力。
3. 学生能够运用信息技术工具,进行汉诺塔游戏模拟和数据分析。
情感态度价值观目标:1. 学生对数学产生兴趣,认识到数学与游戏的紧密联系,提高学习数学的积极性。
2. 学生在游戏中培养逻辑思维能力和创新精神,增强自信心和自主探究意识。
3. 学生通过合作与交流,培养团队精神,学会尊重他人,形成积极向上的人生态度。
课程性质:本课程以汉诺塔游戏为载体,结合数学知识和算法,培养学生的逻辑思维能力、问题解决能力和团队协作能力。
学生特点:五年级学生具有一定的数学基础和逻辑思维能力,对游戏具有浓厚兴趣,但可能对递归算法等抽象概念理解有限。
教学要求:结合学生特点,教师需采用生动有趣的教学方法,引导学生主动探究,注重培养学生的实践操作能力和团队协作精神。
通过本课程的学习,使学生将所学知识应用于实际情境,提高学生的综合素养。
二、教学内容1. 汉诺塔游戏背景介绍:包括汉诺塔的起源、发展及其在数学游戏中的地位。
相关教材章节:数学游戏与趣味数学2. 汉诺塔游戏规则及数学原理:讲解汉诺塔的游戏规则,引导学生发现汉诺塔移动盘子过程中的数学原理。
相关教材章节:组合数学基本概念3. 递归算法及其在汉诺塔游戏中的应用:介绍递归算法的概念,通过实例演示递归算法在汉诺塔游戏中的运用。
相关教材章节:算法与程序设计4. 汉诺塔游戏步数与盘子数之间的关系:运用数学归纳法,推导汉诺塔游戏中盘子数与步数之间的关系。
相关教材章节:数学归纳法5. 汉诺塔游戏实践操作:组织学生进行汉诺塔游戏实践,培养学生动手操作能力和问题解决能力。
汉诺塔教学设计
汉诺塔教学设计一、了解起源,激发兴趣1.谈话师:孩子们,今天有位同学要给我们讲个古老的寓言故事,大家欢迎。
学生上台讲“愚公移山”的故事。
老师总结:今天我们玩的这个游戏也叫“愚公移山”,同学们在我们平时的学习生活过程中我们要学习愚公坚韧不拔的意志力和精神,但是今天的这款游戏还需要我们动脑“巧移”。
其实,它还有一个国际上通用的名字叫“汉诺塔”。
出示课题:汉诺塔师:你们对汉诺塔了解多少?生1:摇头,没听说过。
生2:我在电脑上玩过。
师:哦这个同学玩过,不错,那你给大家介绍介绍汉诺塔?预设学生对此不甚了解,或者了解一些了解游戏起源师:刚才这位同学给咱们稍微介绍了一下这款游戏,据我所知,咱们班有位同学在课下对汉诺塔游戏的起源进行了深入的研究,请他来给咱大家详细的介绍一下它的起源,好吗?请同学们,注意倾听,看谁听得最认真,最仔细,能从这位同学的介绍当中听到最多的信息。
)生:法国数学家爱德华·卢卡斯曾为汉诺塔编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。
印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。
不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。
僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
古汉诺塔问题又被成为“世界末日问题”。
评价:孩子们,让我们以热烈的掌声谢谢这位同学精彩的汇报。
这只是一个传说,那到底是谁最早发明了汉诺塔问题呢?预设生:不知道预设生:法国数学家爱德华·卢卡斯师:对,就是上面提到的法国数学家,爱德华·卢卡斯,(介绍一下这个数学家:卢卡斯,法国数学家,受教育是在巴黎高等师范。
先是在巴黎天文台工作,随后成为一个专业数学家。
汉诺塔游戏设计过程
兰州交通大学数理与软件工程学院课程设计报告2011 ~2012学年第二学期2012年6月一、实验目的:通过此次C++实训,一方面加深了对C++语言的了解,而不只是单单的在课本中学到的那些理论。
通过学生动手亲自编写,平时乏味的课程,变的生动有趣。
平时在课堂上学到的东西可以自己动手编写,将其转化成一些实用的技能。
另一方面,通过学生小组完成任务,提高团队意识,增加凝聚力,让同学们意识到团结就是力量,每个人都是重要的一份子。
二、题目:汉诺塔游戏程序<1> 问题描述:在平面上有三个位置A、B、C,在A位置上有n个大小不等的圆盘、小盘压在大盘上形成圆盘堆。
要求将A位置的N个圆盘通过B位置移动到C位置上,并按同样的顺序叠放。
移动圆盘时必须遵循以下规则:1.每一次只能移动一个圆盘2.圆盘可以放在A、B、C任何一个塔座上3.任何时刻都不能将大圆盘压在小圆盘上<2> 基本要求:圆盘的个数从键盘输入(如3-64等);用动画的形式在屏幕上显示盘的移动。
三、问题分析和任务定义1、已知有三个塔(1、2、3)和n个从大到小的金碟子,初始状态时n个碟子按从大到小的次序从塔1的底部堆放至顶部。
2、要求把碟子都移动到塔2(按从大到小的次序从塔2的底部堆放至顶部)。
3、每次移动一个碟子。
4、任何时候、任何一个塔上都不能把大碟子放到小碟子的上面。
5、可以借助塔3。
先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了:1、将上面的N个盘子移到b杆上;2、将a杆上剩下的盘子移到c杆上;3、将b杆上的全部盘子移到c杆上。
将这个过程继续下去,就是要先完成移动n个盘子、n-1个盘子、n-2个盘子....1个盘的工作。
四、课题介绍:4.1 汉诺塔问题初始模型:4.2 实现步骤:为满足题目中盘子的移动问题,必须遵循的条件是:一次仅能移动一个盘,且不允许大盘放在小盘的上面。
设要解决的汉诺塔共有N个圆盘,对A杆上的全部N个圆盘从小到大顺序编号,最小的圆盘为1号,次之为2号,依次类推,则最下面的圆盘的编号为N。
Hannoi塔(汉诺塔)--Java课程设计报告
Java课程设计报告题目汉诺塔所在院系软件学院学生姓名邓小文专业土木+软件工程班级08-1班学号14号2010年7月17日一、总体设计1.本系统的主要功能(1)本软件是汉诺塔游戏;(2)可以实现计时功能;(3)游戏结束时记录排名;(4)在玩游戏的同时还可以欣赏歌曲;(5)不知如何玩时可以实现自动演示;2.系统包含的类及类之间的关系为了实现本软件的各项功能,对要在本软件中需要用到的源文件进行总体设计。
本系统共包括12个java 源文件。
1.各个类之间的关系如图1所示。
Hel TowerHannoiTower Musi Disk TowerPoint TimeRecord ShowRecor Peopl图1-1各个类之间的关系2.java 源文件及其功能,如表所示。
表1java 源文件及其功能二、详细设计为了实现总体设计中的各个类之间的接口连接,使玩家能够顺畅的使用本软件进行游戏,考虑用详细设计来给玩家一一介绍。
以下是对本软件的详细设计:序号文件名主要功能备注1Tower 用户可以在主窗口选择开始搬运盘子或自动演示。
程序默认的情况是手动搬运盘子2HannoiTower 该文件生成的类负责创建Hannoi塔,汉诺塔由A、B、C 三个塔组成,可以用鼠标搬运各个塔上的盘子。
3Disk该文件生成的类负责创建盘子对象4TowerPoint 该文件生成的类负责为Hannoi 塔创建塔点对象,即盘子放置的位置。
5Time 记录玩家完成游戏所需的时间6People 记录成绩能够排进排行榜的选手7About 关与本软件的制作信息8Help 帮助主题9Record 记录10Music 该文件负责生成一款播放器,可以选取玩家自己喜欢的歌曲欣赏。
播放的歌曲需要是“wav”等形式的。
11ShowRecord该文件用来实现玩家看英雄榜的情况。
1.主类Tower(1)该类用到的主要成员变量见表5表5类Tower主要成员变量成员变量描述变量类型名称汉诺塔对象HannoiTower tower塔名数组Char[]TowerName盘子数目int盘子数目p float盘子从上到下缩小的比例盘子大小Int盘宽,盘高自动演示线程Thread Threadfile初级,file高级File初级高级排行榜记录file1,file2File规则帮助文本自动演示文字显示搬运过程TextArea信息条背景音乐Music music菜单条JMenuBar bar菜单JMenu fileMenu1,fileMenu2,fileMenu3菜单项JMenuItem 开始游戏,重新开始,自动演示,英雄榜,退出,背景音乐,帮助主题,关于汉诺塔;显示时间JTextField显示时间(2)方法见表6表6类Tower主要方法名称功能备注Tower创建窗口构造方法(3)源代码见文件Tower.java2.类HannoiTower(1)该类用到的主要成员变量见表7表7类HannoiTower主要成员变量成员变量描述变量类型变量名位置int X,Yp float盘子从上到下缩小的比例搬运坐标int Shartx,Starty,Starti盘子数目int盘子数目塔名char Towername[]时间int spendtime塔点TowerPoint point[]移动状态boolean move盘子Disk盘子[]显示移动信息TextArea信息条用来计时Time计时计时器是否启动boolean计时器是否启动(2)方法见表8表8类HannoiTower主要方法名称功能(3)源代码见文件HannoiTower.java3.类TowerPoint(1)该类用到的主要成员变量见表9表9类TowerPoint主要成员变量成员变量描述变量类型变量名位置Int X,Yboolean有盘子查看是否有盘子创建盘子Disk盘子创建塔HannoiTower con (2)方法见表10表10类TowerPoint主要方法名称功能是否有盘子返回“有盘子”变量的状态(3)源代码见文件TowerPoint.java4.类Disk(1)该类用到的主要成员变量见表11表11类Disk主要成员变量成员变量描述变量类型变量名数目int number 上方有无盘子boolean上方有盘(2)方法见表12表12类Disk主要方法名称功能get上方有盘得到“上方有盘”set上方有盘设置“上方有盘”getNumber得到盘子号(3)源代码见文件Disk.java5.类Time(1)该类用到的主要成员变量见表13表13类Time主要成员变量成员变量描述变量类型变量名时间int time计时器javax.swing.Timer计时器显示时间JTextField显示时间计时器是否启动boolean计时器是否启动(2)方法见表14表14类Time主要方法名称功能actionPerformed处理ActionEvent事件begin设置开始计时rebegin设置重新开始计时pause设置停止计时clear设置计时清零且不显示(3)源代码见文件Time.java6.类Music(1)该类用到的主要成员变量见表15表15类Music主要成员变量成员变量描述变量类型变量名线程Thread thread音频对象AudioClip clip按钮Button buttonPlay,buttonLoop,buttonStop选择框Choice choice面板Panel p1,p2盒式容器Box baseBox,boxV1,boxV2标签Label标签1,标签2(2)方法见表16表16类Music主要方法名称功能Music创建背景音乐对话框run启动线程actionPerformed处理ActionEvent事件(3)源代码见文件Music.java7.类People(1)该类用到的主要成员变量见表17表17类People主要成员变量成员变量描述变量类型变量名测试者姓名String name测试所用时间int time(2)方法见表18表18类People主要方法名称功能People获取测试者姓名getTime获取测试所用时间(3)源代码见文件People.java8.类Record(1)该类用到的主要成员变量见表19表19类Record主要成员变量变量类型变量名功能int time记录游戏所用时间int n判断级别JTextFile yourName记录测试者的名字File gradeFile存放成绩的文件JButton确定,取消是否保存成绩的按钮(2)方法见表20表20类Record主要方法名称功能Record创建保存成绩窗口setTime设置时间setFile设置文件actionPerformed处理ActionEvent事件(3)源代码见文件Record.java9.类ShowRecord(1)该类用到的主要成员变量见表21表21类ShowRecord主要成员变量变量类型变量名功能File gradeFile存放成绩的文件JButton确定,清除按钮JTextArea Show显示成绩的区域(2)方法见表22表22类ShowRecord主要方法名称功能ShowRecord创建显示成绩窗口actionPerformed处理ActionEvent事件(3)源代码见文件ShowRecord.java10.类Help(1)该类用到的主要成员变量见表25表25类Help主要成员变量变量类型变量名功能TextArea text存放帮助主题的文件FileReader f帮助主题的文本文档(2)方法见表26表26类Help主要方法名称功能Help创建帮助窗口三、运行效果1、将10个java文件打包保存到同一个文件夹中,并且分别编译生成相应的字节码文件。
汉诺塔课程设计
汉诺塔课程设计一、课程目标知识目标:1. 学生能理解汉诺塔的起源、规则及数学原理;2. 学生掌握汉诺塔问题解决的递归思想,并能运用到其他数学问题中;3. 学生能运用数学符号和表达式描述汉诺塔的移动过程。
技能目标:1. 学生能够运用所学知识解决汉诺塔问题,提高逻辑思维和问题解决能力;2. 学生通过合作探究,培养团队协作能力和沟通表达能力;3. 学生学会利用递归思想分析问题,提高数学建模能力。
情感态度价值观目标:1. 学生在探索汉诺塔问题的过程中,培养对数学的兴趣和好奇心,激发学习热情;2. 学生通过解决汉诺塔问题,体验成功的喜悦,增强自信心;3. 学生在合作探究中,学会尊重他人意见,培养包容、谦逊的品质;4. 学生认识到数学在现实生活中的应用,理解数学的价值。
课程性质:本课程为数学学科拓展课程,旨在通过汉诺塔问题的探究,培养学生的逻辑思维、问题解决和团队协作能力。
学生特点:学生处于初中阶段,具有一定的数学基础和逻辑思维能力,对新鲜事物充满好奇心,喜欢探索和挑战。
教学要求:教师需结合学生的特点,设计有趣、富有挑战性的教学活动,引导学生主动参与,充分调动学生的积极性和主动性。
在教学过程中,注重培养学生的逻辑思维、问题解决和团队协作能力,同时关注学生的情感态度价值观的培养。
通过本课程的学习,使学生能够在知识和能力上得到全面提升。
二、教学内容1. 汉诺塔的起源与规则:介绍汉诺塔的背景、发展历程及基本规则,使学生了解汉诺塔问题的历史背景和基本操作。
相关教材章节:数学游戏与趣味数学2. 汉诺塔的数学原理:讲解汉诺塔问题中的递归思想,引导学生发现规律,理解汉诺塔问题背后的数学原理。
相关教材章节:递归与数学问题3. 汉诺塔问题解决方法:教授解决汉诺塔问题的具体方法,如递归法、迭代法等,帮助学生掌握解决问题的技巧。
相关教材章节:算法与程序设计4. 汉诺塔问题拓展与应用:引导学生将汉诺塔问题与其他数学问题相联系,培养学生举一反三的能力。
汉诺塔
《JA V A语言程序设计》课程设计题目:汉诺塔随着计算机的普及越来越多得人使用计算机,人们得生活工作越来越离不开计算机!但是人们面对长时间的电脑工作,难免会有厌倦情绪,而现代人使用最多得打发无聊时间得方式,多是:聊天,浏览网页,看电影,玩大型得网游,结果到头来,花费勒很多得时间却发现自己并没有放松,相反还使自己更加精力疲倦!汉诺塔是一款益智小游戏,花费得时间不多,但是你却要经过思考来完成,从而获得身心得放松!关键词:汉诺塔;计算机;游戏;演示;移动1.引言 (1)1.1问题的提出 (1)1.2 任务设计内容 (1)2.需求分析 (2)2.1 界面及布局设计 (2)2.2 A、B、C 座的实现方法 (2)2.3 圆盘的实现方法 (3)2.4 记录时间方法 (3)3.总体设计 (4)3.1总体功能图 (4)3.2总体流程图 (5)4.主要功能设计流程 (6)4.1 A、B、C 座实现流程图 (6)4.2圆盘画法流程图 (7)4.3保存流程图 (7)4.4时间流程图 (8)5.代码实现 (8)5.1间关系图 (8)5.2 运行效果图 (9)6.总结与说明 (10)7.负责的部分原代码 (11)8.参考文献 (23)1.引言1.1问题的提出随着计算机得普及,人们越来越多得接触到计算机,人们得生活工作中无处不有计算机得身影!人们面对长时间的难免会有倦怠的情绪!而人们大多得缓解情绪得网络活动其实并不能起到放松心情得作用!现代人得生活节奏越来越快,有没有一种快速缓解疲倦得游戏呢?我们提出设计一款益智得小游戏,这种游戏不会花太多时间,同时把玩家得思维带动起来,达到一举多得得效果!1.2 任务设计内容(1)设计Hannoi塔中有三个座,名字分别是A、B和C。
初始状态是A座上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A 座上。
用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子;(2)程序要求用户在移动盘子过程中,不允许把大盘放置在小盘的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上;(3)用户可以通过Hannoi塔界面提供的菜单来选择初级、中级、高级和自定义四个级别。
汉诺塔益智游戏实施方案
汉诺塔益智游戏实施方案一、项目背景汉诺塔是一种经典的益智游戏,起源于中国,现在已经成为了全球范围内普遍流行的一种思维训练游戏。
该游戏能够培养玩家的逻辑思维和推理能力,在娱乐之余也可以提高大脑的反应能力。
二、目标开发一个汉诺塔益智游戏,让用户能够在游戏中体验到经典的汉诺塔游戏乐趣,并通过游戏的设计提高用户的逻辑思维和推理能力。
三、实施方案1. 游戏界面设计游戏界面简洁明了,主要分为以下几个部分:- 游戏区域:显示汉诺塔的三个柱子和上面的圆盘,用户通过点击圆盘将其移动到别的柱子上。
- 分数板:显示用户的当前分数,即完成游戏所需的最小步数。
- 操作按钮:包括开始游戏、重新开始和退出游戏等功能按钮。
2. 游戏规则设计- 游戏的初始状态为所有圆盘都放在一个柱子上,按照大小从上到下递减放置,最大的圆盘在最下面。
- 用户通过点击柱子上的顶端圆盘将其移动到别的柱子上,但是不能将大圆盘放在小圆盘上。
- 用户通过移动圆盘的最少步数来获得高分,计算分数的公式为:分数= (2 ^ 圆盘数量)- 1。
- 当用户成功将所有的圆盘从起始柱子移动到目标柱子上时,游戏成功并计算对应的分数。
3. 游戏开发流程1)需求调研:确定游戏的目标用户、功能需求以及各个界面的设计。
2)游戏设计:根据需求调研结果,进行游戏的界面设计、游戏规则设计等。
3)游戏开发:根据设计结果,进行游戏界面的编码实现以及游戏逻辑的实现。
4)游戏测试:对游戏进行功能测试、兼容性测试等,确保游戏的稳定性和可玩性。
5)游戏发布:将游戏打包发布到各大应用商店,供用户下载和体验。
4. 游戏实施中的注意事项- 界面设计要简洁明了,使用户能够快速上手。
- 游戏规则要简单明了,用户能够轻松理解并进行操作。
- 游戏的难度要有适当的梯度,让用户能够逐渐提高自己的思维能力。
- 游戏要支持不同难度级别的设定,满足不同玩家的需求。
- 游戏的界面要适应不同屏幕大小的设备,保证用户体验的一致性。
汉诺塔问题课程设计
汉诺塔问题课程设计一、课程目标知识目标:1. 学生能理解汉诺塔问题的起源、规则及数学原理。
2. 学生掌握递归思想,并能运用递归算法解决汉诺塔问题。
3. 学生能运用数学归纳法推导汉诺塔问题的解法。
技能目标:1. 学生能够运用计算机编程语言实现汉诺塔问题的求解。
2. 学生能够通过实际操作,培养逻辑思维和问题解决能力。
3. 学生能够与他人合作探讨问题,提高沟通与协作能力。
情感态度价值观目标:1. 学生对数学问题产生浓厚的兴趣,增强对数学学科的学习信心。
2. 学生培养面对困难勇于挑战、善于思考的良好品质。
3. 学生通过解决汉诺塔问题,认识到数学知识在实际生活中的应用价值。
课程性质:本课程为信息技术与数学学科相结合的实践课程,以汉诺塔问题为载体,培养学生逻辑思维和问题解决能力。
学生特点:学生处于初中阶段,具有一定的计算机操作能力和数学基础,对新鲜事物充满好奇。
教学要求:教师应注重引导学生通过自主探究、合作学习的方式,将所学知识应用于实际问题的解决中,达到学以致用的目的。
同时,关注学生情感态度价值观的培养,提高学生的综合素质。
在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. 汉诺塔问题背景介绍:引导学生了解汉诺塔问题的起源、发展及数学原理。
相关教材章节:数学思维训练篇第一章第二节《递归与汉诺塔问题》。
2. 递归算法讲解:讲解递归的概念、递归算法的设计及汉诺塔问题中的递归应用。
相关教材章节:计算机科学篇第二章第五节《递归算法及其应用》。
3. 汉诺塔问题求解:引导学生运用递归算法解决汉诺塔问题,通过数学归纳法推导汉诺塔问题的解法。
相关教材章节:数学思维训练篇第一章第三节《汉诺塔问题的数学解法》。
4. 计算机编程实践:指导学生运用计算机编程语言(如Python、C++等)实现汉诺塔问题的求解。
相关教材章节:计算机科学篇第三章第一节《编程基础及实践》。
5. 案例分析与讨论:分析汉诺塔问题在实际生活中的应用,提高学生学以致用的能力。
汉诺塔问题解决及游戏方案
汉诺塔问题的解决及游戏设计班级:数学与应用数学0901姓名:何文坤黄骏指导老师:王玉英随着时代的不断发展进步,计算机已经融入我们的日常生活。
很多时候,很多的问题想通过人的手来亲自解决已变得十分困难了,这时我们就要运用计算机来帮我们解决这些复杂的问题。
汉诺塔问题就是这类较复杂的问题。
汉诺塔游戏规则:有三根针A,B,C。
A针上有n个盘子,盘子大小不等,大的在下,小的在上。
要求把这n个盘子移到C针,在移动过程中可以借助B针,每次只允许移动一个盘子,且在移动过程中在三根针上的盘子都保持大盘在下,小盘在上。
此次,我们通过VisualC++软件运用递归算法来解决汉诺塔问题。
程序运行后会出现一个界面,界面上有各种操作提示,按照提示进行各种操作后会得到汉诺塔游戏的运行过程及结果。
关键词:汉诺塔;Visual C++;递归算法;问题描述------------------------------------------------------------------------------1开发平台------------------------------------------------------------------------------2变量命名规则------------------------------------------------------------------------3程序中主要类或函数的描述------------------------------------------------------4程序流程-----------------------------------------------------------------------------------------6设计难点及难点处理---------------------------------------------------------------7运行结果及结果分析---------------------------------------------------------------8程序需要完善的地方---------------------------------------------------------------10自己的心得体会---------------------------------------------------------------------11一、问题描述汉诺塔<又称河内塔)问题是起源于印度的一个古老的传说。
汉诺塔
super.paintComponent(g);
g.drawLine(point[0].getX(),point[0].getY(),
point[盘子数目-1].getX(),point[盘子数目-1].getY());
g.drawLine(point[盘子数目].getX(),point[盘子数目].getY(),
{
Disk disk=null;
move=false;
Rectangle rect=null;
if(e.getSource() instanceof Disk)
{
disk=(Disk)e.getSource();
rect=disk.getBounds();
e=SwingUtilities.convertMouseEvent(disk,e,this);
{
int x=point[i].getX();
int y=point[i].getY();
if(rect.contains(x,y))
{
startI=i;
break;
}
}
}
}
public void mouseMoved(MouseEvent e)
{
}
public void mouseDragged(MouseEvent e)
int h=height/2;
g.setColor(Color.orange);
g.fillRect(leftx,lefty,w,h);
g.setColor(Color.red);
int size=4;
for(int i=0;i<3*盘子数目;i++)
{
g.fillOval(point[i].getX()-size/2,point[i].getY()-size/2,size,size);
07141326汉诺塔-课程设计
07141326汉诺塔-课程设计汉诺塔课程设计报告⽬录⼀、需求分析 (3)⼆、概要设计 (4)三、详细设计 (6)四、测试与分析 (7)五、总结 (7)六、附录:源程序清单 (8)⼀、需求分析1.1问题描述汉诺塔(⼜称河内塔)问题是印度的⼀个古⽼的传说。
开天辟地的神勃拉玛在⼀个庙⾥留下了三根⾦刚⽯的棒,第⼀根上⾯套着64个圆的⾦⽚,最⼤的⼀个在底下,其余⼀个⽐⼀个⼩,依次叠上去,庙⾥的众僧不倦地把它们⼀个个地从这根棒搬到另⼀根棒上,规定可利⽤中间的⼀根棒作为帮助,但每次只能搬⼀个,⽽且⼤的不能放在⼩的上⾯。
这是⼀个著名的问题,⼏乎所有的教材上都有这个问题。
由于条件是⼀次只能移动⼀个盘,且不允许⼤盘放在⼩盘上⾯,所以64个盘的移动次数是:18,446,744,073,709,551,615这是⼀个天⽂数字,若每⼀微秒可能计算(并不输出)⼀次移动,那么也需要⼏乎⼀百万年。
我们仅能找出问题的解决⽅法并解决较⼩N值时的汉诺塔,但很难⽤计算机解决64层的汉诺塔。
后来,这个传说就演变为汉诺塔游戏:1.有三根杆⼦A,B,C。
A杆上有若⼲圆盘2.每次移动⼀块圆盘,⼩的只能叠在⼤的上⾯3.把所有圆盘从A杆全部移到C杆上经过研究发现,汉诺塔的破解很简单,就是按照移动规则向⼀个⽅向移动圆盘:如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C此外,汉诺塔问题也是程序设计中的经典递归问题。
将n个盘⼦从a座移动到c座可以分解为以下3个步骤:(1)将a上n-1个盘借助c座先移到b座上。
(2)把a座剩下的⼀个盘移到c座上。
(3)将n-1个盘从c座借助于a座移到c座上。
1.2基本要求(1)输⼊的形式和输⼊值的范围:输⼊圆盘的数量,类型为整型,⼤于零。
(2)输出的形式:运⾏结果为⽤字母表⽰移动盘⼦的⽅案,⽽并⾮是真正移动盘⼦。
(3) 程序所能达到的功能;输⼊圆盘数量为定值时的移盘⽅案。
帮助我们更清晰的理解汉诺塔问题,及递归调⽤的应⽤。
1汉诺塔的介绍及游戏规则教学设计
1汉诺塔的介绍及游戏规则教学设计汉诺塔(Hanoi Tower)是一种经典的益智游戏,起源于印度。
它由三根塔柱和若干个不同大小的盘子组成。
游戏的目标是将所有的盘子从一根塔柱上移动到另一根塔柱上,同时遵守以下规则:1.只能移动一个盘子。
2.盘子只能放在较大的盘子上面。
3.只能使用塔柱上的空间来辅助移动盘子。
4.尽量使用辅助塔柱完成最小步数的移动。
游戏规则教学设计如下:第一步:介绍游戏的背景和目标(大约150字)首先,向学生介绍汉诺塔的概念和起源,以及游戏的目标。
告诉学生他们需要尝试将所有的盘子从一根塔柱上移动到另一根塔柱上。
提醒他们要遵守游戏规则并尽量使用最少的步数完成。
第二步:解释游戏规则(大约300字)解释游戏的基本规则。
确保学生理解每个规则,并解释它对游戏的影响。
第三步:示范游戏过程(大约400字)在示范台上放置三根竖立的木棍,代表三根塔柱,并在第一根塔柱上放置不同大小的盘子。
从中间选择一个盘子进行移动,并将其放置在合适的位置。
解释每个步骤的目的和限制,并展示如何使用空塔柱来辅助移动盘子。
第四步:让学生自己进行游戏(大约250字)每个学生在自己的桌子上或使用纸板上的示范板进行游戏,使用小纸片或其他可代替的盘子。
指导学生按照规则进行游戏,并鼓励他们尝试不同的策略来找到最优解。
第五步:总结和反思(大约200字)游戏结束后,与学生一起讨论游戏的策略和解决方案。
鼓励学生分享他们的经验,并总结出一些有效的移动方法。
仔细观察学生的思考过程和策略选择,并引导他们思考如何将这些策略应用到其他问题中。
通过这样的教学设计,学生将能够理解汉诺塔的背景、目标和规则,并在实践中应用这些知识。
同时,通过游戏的过程,学生也能培养逻辑思维和问题解决能力。
同时,教师还可以利用这个机会,帮助学生总结和反思他们的思维过程,培养学生的分析能力和创新思维。
Java课程设计指导书
《Java程序设计》课程设计指导书2013-2014学年第二学期计科11级学生计算机学院2013-12一、课程设计目的1、复习、巩固所学过的Java语言基础知识,进一步加深对Java语言的理解和掌握;2、课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生分析、解决实际问题的能力,提高学生适应实际、实践编程的能力。
3、培养学生在项目开发中团队合作精神、创新意识及能力。
二、课程设计要求1、对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其它功能或修饰,使程序更加完善、合理;2、系统设计要实用,编程简练、可用、功能全面;3、说明书、流程图要清楚;4、记录设计情况(备查,也为编写设计说明书作好准备);5、要求采用模块化程序设计方法及锯齿型的标准代码书写格式,要求上机调试通过并按设计报告格式书写报告;6、要求标识符命名遵循命名规范,代码多加注释;注意各种可能遇到的异常处理,注重提高程序运行效率;7、图形界面要符合日常软件使用规范来设计菜单和界面。
8、上交内容:打印课程设计报告一份(按格式书写)、源程序文件。
每人给学习委员上传含报告和代码的压缩包,文件名形如"张三.rar"(学号加姓名组成),由课代表刻录。
三、课程设计题目●设计题目知识点:程序控制语句编程设计题目1.1编写程序从键盘输入10个整数,找出最大、最小的整数并输出。
设计题目1.2输入某一个班级学生的Java程序设计期末考试成绩,以-1作为结束标记:(1)统计班级学生中,不及格、及格、中等、良好、优秀的人数;(2)求该班级学生这门课的考试平均分数。
设计题目1.3某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:1A、B至少有一人作案;A、E、F三人中至少有两人参与作案;A、D不可能是同案犯;B、C或同时作案,或与本案无关;C、D中有且仅有一人作案;如果D没有参与作案,则E也不可能参与作案。
汉诺塔程序设计报告
VC++作业电信学院电子0801班张海滨20809050汉诺塔程序设计报告一、题目汉诺塔(Towers of Hanoi)问题二、设计要求1、在窗口中画出初始时塔和碟子的状态。
2、可以以自动或手动两种方式搬移碟子。
3、自动搬移可以通过定时器或多线程的方法,每一次移动的时间间隔可以自定,以人眼观察比较舒服为宜,每一次的移动过程如能实现动画最好。
4、定义塔的描述类和碟子的描述类。
5、在程序中,碟子的数目及每次移动的时间间隔可以通过对话框设置(也应该有默认值)。
6、支持暂停功和继续的功能(在自动搬移过程中可以暂停,并继续)。
7、暂停后,可以将当前的状态保存(碟子和塔的组合关系)。
8、可以从7中保存的文件中读出某个状态,并继续移动。
三、问题分析1、已知有三个塔(1、2、3)和n个从大到小的金碟子,初始状态时n个碟子按从大到小的次序从塔1的底部堆放至顶部。
2、要求把碟子都移动到塔2(按从大到小的次序从塔2的底部堆放至顶部)。
3、每次移动一个碟子。
4、任何时候、任何一个塔上都不能把大碟子放到小碟子的上面。
5、可以借助塔3。
(图1-1)图1-1首先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了:1、将上面的63个盘子移到b杆上;2、将a杆上剩下的盘子移到c杆上;3、将b杆上的全部盘子移到c杆上。
将这个过程继续下去,就是要先完成移动63个盘子、62个盘子、61个盘子....1个盘的工作。
四、算法选择汉诺塔程序设计算法的实质就是递归递归思想的运用。
现将其算法简述如下:为了更清楚地描述算法,可以定义一个函数hanoi(n,a,b,c)。
该函数的功能是:将n个盘子从塔a上借助塔b移动到塔c上。
这样移动n 个盘子的工作就可以按照以下过程进行:1) hanoi(n-1,a,c,b);//将n-1个金盘由a借助c移到b2) 将最下面的金盘从a移动到c上;3) hanoi(n-1,b,a,c);//将b上的n-1个盘借助a移到c重复以上过程,直到将全部的盘子移动到塔c上时为止。
校本课程《汉诺塔游戏》【教学设计】
校本课程《汉诺塔游戏》【教学设计】.doc教学设计:汉诺塔游戏研究内容:数学游戏“汉诺塔”第一课时研究目标:1.了解汉诺塔游戏的传说和基本规则。
2.在游戏中掌握汉诺塔游戏的基本规则,初步发现游戏中的规律。
3.发展归纳推理能力和逻辑思维能力。
4.体会与他人合作获得更多的成功体验。
研究重点:掌握汉诺塔游戏的基本规则,发现游戏中的规律。
研究难点:发展归纳推理能力和逻辑思维能力。
研究过程:课前活动:1.引入话题,了解学生喜欢的游戏。
2.播放黑猩猩玩游戏的视频,引出汉诺塔游戏。
一、认识XXX:1.介绍XXX的来历和相关信息。
2.介绍汉诺塔的各部分,包括托盘和三根柱子。
3.介绍汉诺塔游戏的规则,包括从一边到另一边、一次只能移动一个金片和大金片不能放在小金片上面。
二、动手实践玩游戏:1.从一个圆片开始研究,掌握游戏规则。
2.探究两个圆片的玩法,发现规律。
3.逐步增加圆片数量,练归纳推理和逻辑思维能力。
4.在合作中获得成功体验。
教学设计:汉诺塔游戏研究内容:数学游戏“汉诺塔”第一课时研究目标:1.了解汉诺塔游戏的传说和基本规则。
2.在游戏中掌握汉诺塔游戏的基本规则,初步发现游戏中的规律。
3.发展归纳推理能力和逻辑思维能力。
4.体会与他人合作获得更多的成功体验。
研究重点:掌握汉诺塔游戏的基本规则,发现游戏中的规律。
研究难点:发展归纳推理能力和逻辑思维能力。
研究过程:课前活动:1.引入话题,了解学生喜欢的游戏。
2.播放黑猩猩玩游戏的视频,引出汉诺塔游戏。
一、认识XXX:1.介绍XXX的来历和相关信息。
2.介绍汉诺塔的各部分,包括托盘和三根柱子。
3.介绍汉诺塔游戏的规则,包括从一边到另一边、一次只能移动一个金片和大金片不能放在小金片上面。
二、动手实践玩游戏:1.从一个圆片开始研究,掌握游戏规则。
2.探究两个圆片的玩法,发现规律。
3.逐步增加圆片数量,练归纳推理和逻辑思维能力。
4.在合作中获得成功体验。
请在A柱上放置两个圆片,并将它们移动到C柱上。
汉诺塔问题的程序实现(hanoi塔)
汉诺塔问题的程序实现(hanoi塔)问题重述:有三根柱A、B、C,在柱A上有N块盘⽚,所有盘⽚都是⼤的在下⾯,⼩⽚能放在⼤⽚上⾯。
现要将A上的N块盘⽚移到C柱上,每次只能移动⼀⽚,⽽且在同⼀根柱⼦上必须保持上⾯的盘⽚⽐下⾯的盘⽚⼩,输⼊任意的N,输出移动⽅法。
(注意:这是⼀个古⽼的传说,传说是如果把64个盘⼦由A柱移到了C柱的话,那么世界末⽇就到了,事实上如果要把64个盘⼦从A柱移到C柱的话,即使⽤计算机运算,也要计算数亿年,所以这个预⾔未必不是真实。
)【分析】我们可以这样考虑,当n=1时,我们只要直接将A柱的盘⼦移到C柱,当n>1时,我们可以先把n-1个盘⼦由A柱通过C柱移到B 柱,此时就可以把A柱剩下的最后⼀个盘⼦直接移到C柱,这样接下来只要把n-1个盘⼦通过A柱移到C 柱即可,如果就构成了递归的思路,我们可以定义个移动过程mov(n,a,b,c)表⽰将n个盘⼦从a通过b移到c1.只要求输出搬运的次数#includeusing namespace std;int m=0;void move(){m++;}void I(int n){if(n==1)move();else{I(n-1);move();I(n-1);}}int main(){I(3);cout<cout<<"输出完毕!"<return 0;}更加简单的⽅法!#includeusing namespace std;int fact(int n){if(n==1)return(1);elsereturn((2*fact(n-1)+1));}int main(){cout<}2.不仅要求输出搬运的次数,⽽且要输出每个步骤的详细搬运#includeusing namespace std;int m=0;void Move(int n,char x,char y){cout<<"把"<m++;}void Hannoi(int n,char a,char b,char c){if(n==1)Move(1,a,c);else{Hannoi(n-1,a,c,b);Move(n,a,c);Hannoi(n-1,b,a,c);}}int main(){int i;cout<<"请输⼊圆盘数"<cin>>i;Hannoi(3,'a','b','c');cout<<"总的搬运次数"<cout<<"输出完毕!"<return 0;}}另外⼀种不利⽤递归的解法(很抱歉,我⾃⼰也没调出来,实在太复杂了)#includeusing namespace std;//圆盘的个数最多为64const int MAX = 1;//⽤来表⽰每根柱⼦的信息struct st{int s[MAX]; //柱⼦上的圆盘存储情况int top; //栈顶,⽤来最上⾯的圆盘char name; //柱⼦的名字,可以是A,B,C 中的⼀个int Top()//取栈顶元素{return s[top];}int Pop()//出栈{return s[top--];}void Push(int x)//⼊栈{s[++top] = x;}} ;long Pow(int x, int y); //计算x^yvoid Creat(st ta[], int n); //给结构数组设置初值void Hannuota(st ta[], long max); //移动汉诺塔的主要函数int main(void){int n;cin >> n; //输⼊圆盘的个数st ta[3]; //三根柱⼦的信息⽤结构数组存储Creat(ta, n); //给结构数组设置初值long max = Pow(2, n) - 1;//动的次数应等于2^n - 1 Hannuota(ta, max);//移动汉诺塔的主要函数system("pause");return 0;}void Creat(st ta[], int n){ta[0].name = 'A';ta[0].top = n-1;//把所有的圆盘按从⼤到⼩的顺序放在柱⼦A 上for (int i=0; ita[0].s[i] = n - i;//柱⼦B,C 上开始没有没有圆盘ta[1].top = ta[2].top = 0;for (int j=0; jta[1].s[j] = ta[2].s[j] = 0;//若n 为偶数,按顺时针⽅向依次摆放A B Cif (n%2 == 0){ta[1].name = 'B';ta[2].name = 'C';}else //若n 为奇数,按顺时针⽅向依次摆放A C B {ta[1].name = 'C';ta[2].name = 'B';}}long Pow(int x, int y){long sum = 1;for (int i=0; isum *= x;return sum;}void Hannuota(st ta[], long max){int k = 0; //累计移动的次数int i = 0;int ch;while (k < max){//按顺时针⽅向把圆盘1 从现在的柱⼦移动到下⼀根柱⼦ch = ta[i%3].Pop();ta[(i+1)%3].Push(ch);cout << ++k << ": " <<"Move disk " << ch << " from " << ta[i%3].name <<" to " << ta[(i+1)%3].name << endl;i++;//把另外两根柱⼦上可以移动的圆盘移动到新的柱⼦上if (k < max){ //把⾮空柱⼦上的圆盘移动到空柱⼦上,当两根柱⼦都为空时,移动较⼩的圆if (ta[(i+1)%3].Top() == 0 ||ta[(i-1)%3].Top() > 0 &&ta[(i+1)%3].Top() > ta[(i-1)%3].Top()){ch = ta[(i-1)%3].Pop();ta[(i+1)%3].Push(ch);cout << ++k << ": " << "Move disk "<< ch << " from " << ta[(i-1)%3].name<< " to " << ta[(i+1)%3].name << endl;}else{ch = ta[(i+1)%3].Pop();ta[(i-1)%3].Push(ch);cout << ++k << ": " << "Move disk " << ch << " from " << ta[(i+1)%3].name << " to " << ta[(i-1)%3].name << endl; }}}}补充知识:【典型例题1】求阶乘n!#includeusing namespace std;int fact(int n){if(n==0)return(1);elsereturn(n*fact(n-1)); }int main(){cout<。
微课-汉诺塔问题教案
本微课适用范围如下所示:课程所属学科:计算机适用专业:计算机应用技术、计算机软件工程、电子信息适用课程:C语言程序设计、C++程序设计、JAVA程序设计、数据结构适用对象:有一定编程基础的同学《汉诺塔问题》微课教案学院(部):软件学院系(教研室):网络教研授课教师:杨珺职称:副教授时间复杂度为:O(2n)程序实现部分汉诺塔问题的递归实现:#include<stdio.h>void hanoi(int n,char A,char B,char C){if(n==1){printf("Move disk %d from %c to %c\n",n,A,C);}else{hanoi(n-1,A,C,B);printf("Move disk %d from %c to %c\n",n,A,C);hanoi(n-1,B,A,C);}}main(){int n;printf("请输入数字n以解决n阶汉诺塔问题:\n");scanf("%d",&n);hanoi(n,'A','B','C');}●汉诺塔算法的非递归实现C++源代码#include <iostream>using namespace std;//圆盘的个数最多为64const int MAX = 64;//用来表示每根柱子的信息struct st{int s[MAX]; //柱子上的圆盘存储情况int top; //栈顶,用来最上面的圆盘char name; //柱子的名字,可以是A,B,C中的一个int Top()//取栈顶元素{return s[top];}int Pop()//出栈return s[top--];}void Push(int x)//入栈{s[++top] = x;}} ;long Pow(int x, int y); //计算x^yvoid Creat(st ta[], int n); //给结构数组设置初值void Hannuota(st ta[], long max); //移动汉诺塔的主要函数int main(void){int n;cin >> n; //输入圆盘的个数st ta[3]; //三根柱子的信息用结构数组存储Creat(ta, n); //给结构数组设置初值long max = Pow(2, n) - 1;//动的次数应等于2^n - 1 Hannuota(ta, max);//移动汉诺塔的主要函数system("pause");return 0;}void Creat(st ta[], int n){ta[0].name = 'A';ta[0].top = n-1;//把所有的圆盘按从大到小的顺序放在柱子A上for (int i=0; i<n; i++)ta[0].s[i] = n - i;//柱子B,C上开始没有没有圆盘ta[1].top = ta[2].top = 0;for (int i=0; i<n; i++)ta[1].s[i] = ta[2].s[i] = 0;//若n为偶数,按顺时针方向依次摆放 A B Cif (n%2 == 0){ta[1].name = 'B';ta[2].name = 'C';}else //若n为奇数,按顺时针方向依次摆放 A C Bta[1].name = 'C';ta[2].name = 'B';}}long Pow(int x, int y){long sum = 1;for (int i=0; i<y; i++)sum *= x;return sum;}void Hannuota(st ta[], long max){int k = 0; //累计移动的次数int i = 0;int ch;while (k < max){//按顺时针方向把圆盘1从现在的柱子移动到下一根柱子ch = ta[i%3].Pop();ta[(i+1)%3].Push(ch);cout << ++k << ": " <<"Move disk " << ch << " from " << ta[i%3].name <<" to " << ta[(i+1)%3].name << endl;i++;//把另外两根柱子上可以移动的圆盘移动到新的柱子上if (k < max){ //把非空柱子上的圆盘移动到空柱子上,当两根柱子都为空时,移动较小的圆盘if (ta[(i+1)%3].Top() == 0 ||ta[(i-1)%3].Top() > 0 &&ta[(i+1)%3].Top() > ta[(i-1)%3].Top()){ch = ta[(i-1)%3].Pop();ta[(i+1)%3].Push(ch);cout << ++k << ": " << "Move disk "<< ch << " from " << ta[(i-1)%3].name<< " to " << ta[(i+1)%3].name << endl;}else{ch = ta[(i+1)%3].Pop();ta[(i-1)%3].Push(ch);cout << ++k << ": " << "Move disk "<< ch << " from " << ta[(i+1)%3].name<< " to " << ta[(i-1)%3].name << endl;}}}}汉诺塔问题的非递归实现#include <stdio.h>#include <math.h>#include <stdlib.h>//第0位置是柱子上的塔盘数目int zhua[100]={0},zhub[100]={0},zhuc[100]={0};char charis(char x,int n)//左右字符出现顺序固定,且根据n值奇偶而不同{switch(x){case 'A':return (n%2==0)?'C':'B';case 'B':return (n%2==0)?'A':'C';case 'C':return (n%2==0)?'B':'A';default:return '0';}}void print(char lch,char rch)//打印字符{if(lch=='A'){switch(rch){case 'B':zhub[0]++;zhub[zhub[0]]=zhua[zhua[0]]; zhua[zhua[0]]=0;zhua[0]--;break;case 'C':zhuc[0]++;zhuc[zhuc[0]]=zhua[zhua[0]]; zhua[zhua[0]]=0;zhua[0]--;break;default:break;}}if(lch=='B'){switch(rch){case 'A':zhua[0]++;zhua[zhua[0]]=zhub[zhub[0]]; zhub[zhub[0]]=0;zhub[0]--;break;case 'C':zhuc[0]++;zhuc[zhuc[0]]=zhub[zhub[0]]; zhub[zhub[0]]=0;zhub[0]--;break;default:break;}}if(lch=='C'){switch(rch){case 'A':zhua[0]++;zhua[zhua[0]]=zhuc[zhuc[0]];zhuc[zhuc[0]]=0;zhuc[0]--;break;case 'B':zhub[0]++;zhub[zhub[0]]=zhuc[zhuc[0]];zhuc[zhuc[0]]=0;zhuc[0]--;break;default:break;}}printf("\t");int i;printf("(");for(i=1;i<=zhua[0];i++)printf(" %d ",zhua[i]);printf(")");printf("(");for(i=1;i<=zhub[0];i++)printf(" %d ",zhub[i]);printf(")");printf("(");for(i=1;i<=zhuc[0];i++)printf(" %d ",zhuc[i]);printf(")");printf("\n");}void Hannuo(int n){//分配2^n个空间bool *isrev;isrev=(bool *)malloc(sizeof(bool)*(int)pow(2,n)); for(int i=1;i<pow(2,n);i++)//循环计算是否逆序for(int ci=2;ci<=n;ci++){for(int zixh=(int)pow(2,ci-1);zixh<pow(2,ci);zixh+=4) //初始值重复一次,自增值可加4,减少循环次数。
汉诺塔问题与递归思想教学设计
汉诺塔问题与递归思想教学设计-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN一、教学思想(包括教学背景、教学目标)1、教学背景本课程“递归算法”,属于《数据结构与算法》课程中“栈和队列”章节的重点和难点。
数据结构与算法已经广泛应用于各行各业的数据存储和信息处理中,与人们的社会生活密不可分。
该课程是计算机类相关专业核心骨干课程,处于计算机学科的核心地位,具有承上启下的作用。
不仅成为全国高校计算机类硕士研究生入学的统考科目,还是各企业招聘信息类员工入职笔试的必考科目。
数据结构与算法课程面向计算机科学与技术、软件工程等计算机类学生,属于专业基础课。
2、教学大纲通过本课程的学习,主要培养学生以下几个方面的能力:1)理解递归的算法;2)掌握递归算法的实现要素;3)掌握数值与非数值型递归的实现方法。
根据学生在学习基础和能力方面的差异性,将整个课程教学目标分成三个水平:合格水平(符合课标的最低要求),中等以上水平(符合课标的基本要求),优秀水平(符合或超出课标提出的最高要求)。
具体如下表:优秀在中等水平基础上,可以独立分析并实现数值与非数值型问题递归的设计,解决复杂问题求解的递归方法。
二、课程设计思路(包括教学方法、手段)“递归算法”课程以故事引入、案例驱动法、示范模仿、启发式等多元化教学方法,设计课程内容。
具体的课堂内容如下所示:教学环节课堂内容设计教法方法导入新课引导学生学习热情明确教学目标课程教学一、故事导入:结合故事突出主题生活中大人给小孩讲故事时,讲了掩耳盗铃、入木三分后,若实在没故事了,就会讲说:从前有座山,山里有个庙,庙里有个老和尚讲故事,讲的什么呢讲的是从前有个山,山里有个庙,庙里有个老和尚讲故事,讲的什么呢这就是一个典型的递归故事,可以无限次的递归下去。
可以把这个故事比喻成函数的递归调用,但和故事不同的是,在程序设计中,不可能无限递归下去,必须要有递归的结束条件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HUBEI NORMAL UNIVERSITYJava程序设计Hannoi塔游戏论文题目Hannoi塔游戏学生指导教师所在院系专业名称完成时间摘要《JAVA语言实用教程》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。
实践教学环节是必不可少的一个重要环节。
本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA语言实用教程》课程后,进行的一次全面的综合训练,JAVA语言实用教程的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
目录一、课程设计任务及要求 (4)1、课程设计任务 (4)2、设计要求 (4)二、需求分析 (5)1、系统需求分析 (5)2、系统概述 (5)3、系统运行环境 (6)三、设计思路 (6)概要设计 (7)四、详细设计 (7)package Hannoi; (7)HannoiWindow类 (7)AutoMoveDisc类 (15)Disc类 (21)HandleMouse类 (22)Tower类 (27)TowerPoint 类 (31)五、运行调试与分析讨论 (33)六、设计体会与小结 (36)1.设计体会 (36)2.小结 (37)参考文献 (37)致谢 (38)一、课程设计任务及要求1、课程设计任务设计GUI界面的Hannoi塔游戏,用户可以通过拖动鼠标移动各个塔上的盘子,程序也可以自动演示盘子的移动过程。
2、设计要求(1)有三个表示塔的对象,分别命名为A、B和C。
A塔上有若干个盘子,盘子的大小不等,并按着大小顺序依次摆放在A塔上,大盘在下,小盘在上。
用户可以用鼠标拖动盘子,把A 塔上的盘子全部移动到另外两个塔中的任何一个塔上。
要求每次只能移动一个盘子,在任何时候不允许大盘压在小盘的上面。
(2)用户也可以选择让程序自动演示。
选择自动演示后,程序将以动画形式演示把A塔上的盘子全部移到C塔的过程,并将移动过程以文本形式显示在一个文本区中。
(3)可以由用户自己设置盘子数量和盘子大小。
(4)可以改变盘子的颜色、背景颜色以及背景音乐。
(5)游戏分为初、中、高三个等级。
(6)可以记录游戏时间并且设有从新开始按钮。
二、需求分析1、系统需求分析使用java面向对象语言设计汉诺塔游戏,此游戏要求:1)界面要求:(1)尽量使用图形界面实现,要符合日常软件使用规范来设计菜单和界面。
(2)如果无法实现图形界面,则在命令行方式下也需要提供菜单,方便用户操作(盘子可以自己规定)。
2)其他要求:可以保存自己的自动演示记录3)每次移动一个盘子,小的只能叠在大的上面。
4)把所有碟子从A塔柱全部移到C塔柱上如果A盘上的盘子全都移动到了C塔柱上,则游戏成功;否则失败。
(1)标识符命名遵循Windows命名规范。
(2)能够注意各种异常处理,注重提高程序运行效率。
2、系统概述“汉诺塔”游戏是利用面向对象语言java写的一个简单的游戏,它的目标是把最左边塔柱上的盘子按一定的规则移动到最右过的塔柱上去,规则如下:(1)有三根塔柱A,B,C。
A杆上有若干盘子(由小到大排列)(2)需要把A上的盘子搬到C上面去(由小到大排列)(3)每次只能移动一个盘子且大的盘子不能叠加到小的盘子上面3、系统运行环境任何具有jre运行环境的计算机,可在netbeans和eclipse 中运行。
三、设计思路我设计的Hannoi塔,除了要编写的6个java文件(HannoiWindow、AutoMoveDisc、Disc、HandleMouse、Tower、TowerPoint)所给出的类外,还需要java系统提供的一些重要的类,如JButton,JCheckBox等。
汉诺塔中有三个座,名字分别为A,B,C。
刚开始的时候A塔上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。
用户可以用鼠标选中盘子,然后通过拖动鼠标来移动盘子。
释放鼠标来放置该盘子。
程序要求用户在移动盘子的过程中,不允许把大盘子放置在小盘子的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上。
用户可以通过Hannoi塔界面提供的改变盘子数目功能来改变盘子的数目,同时可以改变盘子的大小以及改变盘子和界面的背景颜色,而且还可以选择控制背景音乐的播放。
用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成把A座上的盘子全部移动到C座上。
用户在移动盘子的过程中,可以随时单击Hannoi塔界面上提供的按钮,重新开始。
概要设计主要要实现的功能有: 完成汉诺塔的“手工移动演示”;完成汉诺塔的“自动移动演示”;增加计时功能,即显示用户完成移动盘子所花费的时间;用户可以设置最大和最小盘子的大小;用户可以设置盘子的数目;用户可以设置盘子的颜色、背景颜色以及背景音乐;用户可以将自动移动盘子的文本信息保存到文件中。
四、详细设计package Hannoi;HannoiWindow类/* HannoiWindow类* 该类主要功能是设置主界面的布局、相关按钮和监听事件* */import java.applet.Applet;import java.applet.AudioClip;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.File;import .MalformedURLException;import .URL;import javax.swing.JOptionPane;public class HannoiWindow extends JFrame implements ActionListener{ Tower tower=null; //Tower创建的tower容器,刻画了汉诺塔的结构,放置在主界面的中心int amountOfDisc=3; //确定tower对象中“盘子”数目(默认为3个)int number=0;Color discColor;HandleMouse handleMouseTime;Timer time=new Timer(1000,this);char []towerName={'A','B','C'}; //容器tower中三个座的名字JMenuBar bar; //菜单棒JMenu menuGrade,menuDiscNum,menuMM,menuColor;//boolean tag = true;File musicfile=new File("七里香.mid");URL url;AudioClip clip;JMenu menumusic;//JMenuItemoneGradeItem,twoGradeItem,threeGradeItem,discColorItem,backColorItem,maxDis cWidth,minDiscWidth,DiscNum,musicstart,musicstop;JButton renew=null;JButton autoButton=null;JPanel center=new JPanel();JTextField text;//----------------------public JRadioButton cyan,red,green,blue,yellow;public ButtonGroup buttonGroup;//----------------------HannoiWindow(){ //构造函数,设置主界面布局super("汉诺塔小游戏(Hannoi Game)");tower=new Tower(towerName);tower.setAmountOfDisc(amountOfDisc);//设置盘子的数量tower.setMaxDiscWidth(120);//设置最大盘子的宽度tower.setMinDiscWidth(50);//设置最小盘子的宽度tower.setDiscHeight(16);//设置盘子的高度tower.putDiscOnTower();//放置盘子到塔上add(tower,BorderLayout.CENTER);//增添菜单选项bar=new JMenuBar();menuGrade=new JMenu("选择关卡");menuColor=new JMenu("变换颜色");menuDiscNum=new JMenu("盘子数量");menuMM=new JMenu("盘子大小");oneGradeItem=new JMenuItem("第一关_初级");twoGradeItem=new JMenuItem("第二关_中级"); threeGradeItem=new JMenuItem("第三关_高级");discColorItem=new JMenuItem("盘子颜色");backColorItem=new JMenuItem("背景颜色");maxDiscWidth=new JMenuItem("最大盘子宽度");minDiscWidth=new JMenuItem("最小盘子宽度");DiscNum=new JMenuItem("设置盘子数量");menuGrade.add(oneGradeItem);//将用户的操作设置返回给相应的变量menuGrade.addSeparator();menuGrade.add(twoGradeItem);menuGrade.addSeparator();menuGrade.add(threeGradeItem);menuColor.add(discColorItem);menuColor.add(backColorItem);menuMM.add(maxDiscWidth);menuMM.add(minDiscWidth);menuDiscNum.add(DiscNum);bar.add(menuGrade);bar.add(menuDiscNum);bar.add(menuMM);bar.add(menuColor);setJMenuBar(bar);//加入代码menumusic=new JMenu("设置背景音乐");musicstart=new JMenuItem("背景音乐开启");musicstop=new JMenuItem("背景音乐关闭");menumusic.add(musicstart);menumusic.add(musicstop);bar.add(menumusic);try {url=musicfile.toURL();} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();}clip=Applet.newAudioClip(url);clip.play();//setJMenuBar(bar);//加入下2行代码musicstart.addActionListener(this);musicstop.addActionListener(this);//oneGradeItem.addActionListener(this);twoGradeItem.addActionListener(this);threeGradeItem.addActionListener(this);DiscNum.addActionListener(this);maxDiscWidth.addActionListener(this);minDiscWidth.addActionListener(this);discColorItem.addActionListener(this);backColorItem.addActionListener(this);renew=new JButton("重新开始");renew.addActionListener(this);autoButton=new JButton("自动演示");text=new JTextField("您的游戏时间:0秒",10);autoButton.addActionListener(this);JPanel north=new JPanel();String mess="将全部盘子从"+towerName[0]+" 座搬运到"+towerName[1]+" 座或"+towerName[2]+" 座";JLabel hintMess=new JLabel(mess,JLabel.CENTER);north.add(renew);north.add(autoButton);north.add(hintMess);north.add(text);add(north,BorderLayout.NORTH);//----------------------buttonGroup=new ButtonGroup();cyan = new JRadioButton("原色");red = new JRadioButton("红色");green = new JRadioButton("绿色");blue = new JRadioButton("蓝色");yellow =new JRadioButton("黄色");cyan.setFont(new Font("楷体_GB2312",Font.BOLD,14));red.setFont(new Font("楷体_GB2312",Font.BOLD,14));green.setFont(new Font("楷体_GB2312",Font.BOLD,14));blue.setFont(new Font("楷体_GB2312",Font.BOLD,14));yellow.setFont(new Font("楷体_GB2312",Font.BOLD,14));buttonGroup.add(cyan); buttonGroup.add(red); buttonGroup.add(green); buttonGroup.add(blue); buttonGroup.add(yellow);rHandler h=new rHandler(); //创建监听器cyan.addItemListener(h); red.addItemListener(h); green.addItemListener(h); blue.addItemListener(h); yellow.addItemListener(h);JPanel southColor=new JPanel();southColor.add(cyan); southColor.add(red); southColor.add(green); southColor.add(blue); southColor.add(yellow);add(southColor,BorderLayout.SOUTH);setResizable(false);//----------------------setResizable(false);setVisible(true);setBounds(300,150,680,480);validate();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);time.start();}public void actionPerformed(ActionEvent e){ //各种动作事件的监听处理if(e.getSource()==oneGradeItem||e.getSource()==twoGradeItem||e.getSource()= =threeGradeItem){if(e.getSource()==oneGradeItem) amountOfDisc=3;//设置初级盘子为3个if(e.getSource()==twoGradeItem) amountOfDisc=4;//设置中级盘子为4个if(e.getSource()==threeGradeItem) amountOfDisc=5; //设置高级盘子为5个if(time.isRunning()==false){time.restart();handleMouseTime.ALL=0;}number=0;text.setText("您的游戏时间:"+number+"秒");tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==renew){ //"重新开始"按钮动作监听处理方法if(time.isRunning()==false){time.restart();handleMouseTime.ALL=0;}number=0;//初始化计时器为0text.setText("您的游戏时间:"+number+"秒");//读计数器时间tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==autoButton){ //"自动演示"按钮动作监听处理方法tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();int x=this.getBounds().x+this.getBounds().width;int y=this.getBounds().y;tower.getAutoMoveDisc().setLocation(x,y);tower.getAutoMoveDisc().setSize(380,this.getBounds().height);tower.getAutoMoveDisc().setVisible(true);}else if(e.getSource()==discColorItem||e.getSource()==backColorItem){ Color Col=getBackground();Col=JColorChooser.showDialog(this, "颜色变换调色板", Col);discColor=Col;if(e.getSource()==discColorItem){if(time.isRunning()==false) {time.restart();handleMouseTime.ALL=0;}number=0;text.setText("您的游戏时间:"+number+"秒");tower.disccolor(discColor);tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==backColorItem){tower.setBackground(Col);JOptionPane.showMessageDialog(null, "背景颜色也可以用窗口5个单选按钮变换!", "消息提示框", JOptionPane.PLAIN_MESSAGE);}}else if(e.getSource()==DiscNum){int n;String strNum=JOptionPane.showInputDialog("请输入您要的盘子数量(有效长度1~10)");n=Integer.parseInt(strNum);if(n<=10&&n>=1){if(time.isRunning()==false){time.restart();handleMouseTime.ALL=0;}number=0;text.setText("您的游戏时间:"+number+"秒");amountOfDisc=n;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}}else if(e.getSource()==maxDiscWidth){int width;String str=JOptionPane.showInputDialog("请输入最大盘子的长度(有效长度100~180)");width=Integer.parseInt(str);if(width<=180&&width>=100){if(time.isRunning()==false){time.restart();handleMouseTime.ALL=0;}number=0;text.setText("您的游戏时间:"+number+"秒");tower.setMaxDiscWidth(width);tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}}else if(e.getSource()==minDiscWidth){int width;String str=JOptionPane.showInputDialog("请输入最小盘子的长度(有效长度10~80)");width=Integer.parseInt(str);if(width<=80&&width>=10){if(time.isRunning()==false){time.restart();handleMouseTime.ALL=0;}number=0;text.setText("您的游戏时间:"+number+"秒");tower.setMinDiscWidth(width);tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}}if(e.getSource()==time){if(handleMouseTime.Start==1){text.setText("您的游戏时间:"+number+"秒");number++;}if(handleMouseTime.ALL==1) {time.stop();handleMouseTime.Start=0;JOptionPane.showMessageDialog(null, "祝贺您,闯关成功!", "消息框", JOptionPane.PLAIN_MESSAGE);}}////////////////////////////else if(e.getSource()==musicstart){if(tag == false){try {url=musicfile.toURL();} catch (MalformedURLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}clip=Applet.newAudioClip(url);clip.play();tag = true;}}else if(e.getSource()==musicstop){if(tag == true){clip.stop();tag = false;}}//////////////////////////////validate();}public class rHandler implements ItemListener{public void itemStateChanged(ItemEvent event){if(cyan.isSelected())tower.setBackground(new Color(200,236,236));else if(red.isSelected())tower.setBackground(Color.red);else if(green.isSelected())tower.setBackground(Color.green);else if(blue.isSelected())tower.setBackground(Color.blue);else if(yellow.isSelected())tower.setBackground(Color.yellow);}}public static void main(String args[]){new HannoiWindow();}}AutoMoveDisc类/* AutoMoveDisc类* 该类实现了ActionListener接口,创建对象autoMoveDisc 是Tower的成员之一* */import java.io.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.filechooser.*;import javax.swing.text.BadLocationException;public class AutoMoveDisc extends JDialog implements ActionListener{ int amountOfDisc=3; //盘子的数量TowerPoint [] pointA,pointB,pointC; //存放Tower容器中的塔点对象的引用;char [] towerName; //存放Tower容器中的towername的引用Container con; //Container容器对象,用来存放tower对象引用StringBuffer moveStep; //存放移动盘子的步骤,用连续两个字符表示JTextArea showStep; //显示盘子移动步骤的文本区JButton bStart,bStop,bContinue,bClose,bSave; //相关按钮Timer time; //时间计时器int i=0,number=0;AutoMoveDisc(Container con){ //构造函数,完成界面布局setModal(true);setTitle("自动演示搬盘子过程:");this.con=con;moveStep=new StringBuffer();time=new Timer(1000,this);time.setInitialDelay(10);showStep=new JTextArea(15,20);bStart=new JButton("演示");bStop=new JButton("暂停");bContinue=new JButton("继续");bSave=new JButton("保存");bClose=new JButton("关闭");bStart.addActionListener(this);bStop.addActionListener(this);bContinue.addActionListener(this);bSave.addActionListener(this);bClose.addActionListener(this);JPanel south=new JPanel();south.setLayout(new FlowLayout());south.add(bStart);south.add(bStop);south.add(bContinue);south.add(bSave);south.add(bClose);add(new JScrollPane(showStep),BorderLayout.CENTER);add(south,BorderLayout.SOUTH);setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);towerName=new char[3];addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){time.stop();setVisible(false);}};}public void setPointA(TowerPoint [] pointA){//将tower容器中的pointA对象的引用传递给该对象的pointA,以便autoMoveDisc对象自动移动踏上的盘子discthis.pointA=pointA;}public void setPointB(TowerPoint [] pointB){this.pointB=pointB;}public void setPointC(TowerPoint [] pointC){this.pointC=pointC;}public void setTowerName(char name[]){//给每一个座tower命名if(name[0]==name[1]||name[0]==name[2]||name[1]==name[2]){towerName[0]='A';towerName[1]='B';towerName[2]='C';}elsetowerName=name;}public void setAmountOfDisc(int n){//设置盘子数目变量amountOfDisc的值amountOfDisc=n;}public void actionPerformed(ActionEvent e) { //实现文本显示盘子移动步骤事件if(e.getSource()==time){number++;char cStart,cEnd;if(i<=moveStep.length()-2){cStart=moveStep.charAt(i);cEnd=moveStep.charAt(i+1);showStep.append("("+number+")从"+cStart+"座搬一个盘子到"+cEnd+"座\n");autoMoveDisc(cStart,cEnd);}i=i+2;if(i>=moveStep.length()-1){time.stop();}}else if(e.getSource()==bStart){if(moveStep.length()==0){if(time.isRunning()==false){i=0;moveStep=new StringBuffer();setMoveStep(amountOfDisc,towerName[0],towerName[1],towerName[2]);number=0;time.start();}}}else if(e.getSource()==bStop){if(time.isRunning()==true)time.stop();}else if(e.getSource()==bContinue){if(time.isRunning()==false)time.restart();}else if(e.getSource()==bSave){JFileChooser save=new JFileChooser();int SV=save.showSaveDialog(null);if(SV==JFileChooser.APPROVE_OPTION){File file=save.getSelectedFile();try{BufferedWriter writer=new BufferedWriter(new FileWriter(file.getPath()));writer.write(showStep.getText());writer.flush();writer.close();}catch(FileNotFoundException fnoe){}catch(IOException ioe){}}}else if(e.getSource()==bClose){time.stop();setVisible(false);}}private void setMoveStep(int amountOfDisc,char one,char two,char three){ //记录盘子移动步骤的递归算法if(amountOfDisc==1){moveStep.append(one);moveStep.append(three);}else{setMoveStep(amountOfDisc-1,one,three,two);moveStep.append(one);moveStep.append(three);setMoveStep(amountOfDisc-1,two,one,three);}}private void autoMoveDisc(char cStart,char cEnd){//盘子从cStar 座自动移动到cEnd 座的实现Disc disc=null;if(cStart==towerName[0]){ //盘子属于A座for(int i=0;i<pointA.length;i++){if(pointA[i].isHaveDisc()==true){ //找到盘子所属的塔点disc=pointA[i].getDiscOnPoint(); //获得该塔点的盘子pointA[i].setHaveDisc(false); //设置该塔点为起始点,并置空break;}}}if(cStart==towerName[1]){ //盘子属于B座for(int i=0;i<pointB.length;i++){if(pointB[i].isHaveDisc()==true){disc=pointB[i].getDiscOnPoint();pointB[i].setHaveDisc(false);break;}}}if(cStart==towerName[2]){ //盘子属于C座for(int i=0;i<pointC.length;i++){if(pointC[i].isHaveDisc()==true){disc=pointC[i].getDiscOnPoint();pointC[i].setHaveDisc(false);break;}}}TowerPoint endPoint=null;int i=0;if(cEnd==towerName[0]){ //查找盘子拖动到的目标座,是否为A座for(i=0;i<pointA.length;i++){if(pointA[i].isHaveDisc()==true){ //查找目标塔点if(i>0){endPoint=pointA[i-1];break;}else if(i==0)break;}}if(i==pointA.length)endPoint=pointA[pointA.length-1];}if(cEnd==towerName[1]){for(i=0;i<pointB.length;i++){if(pointB[i].isHaveDisc()==true){if(i>0){endPoint=pointB[i-1];break;}else if(i==0)break;}}if(i==pointB.length)endPoint=pointB[pointB.length-1];}if(cEnd==towerName[2]){for(i=0;i<pointC.length;i++){if(pointC[i].isHaveDisc()==true){if(i>0){endPoint=pointC[i-1];break;}else if(i==0)break;}}if(i==pointC.length)endPoint=pointC[pointC.length-1];}if(endPoint!=null&&disc!=null){endPoint.putDisc(disc,con);endPoint.setHaveDisc(true);}}}Disc类/* Disc类* javax.swing包中JButton的子类,负责实现Hannoi中的“盘子“视图*/import javax.swing.*;import java.awt.*;public class Disc extends JButton{int number; //创建盘子上的数字号码,以数字大小来确定盘子的大小,数字大的盘子大于数字小的盘子TowerPoint point; //TowerPoint类对象,是盘在”塔点“,用于标明盘子所在的塔点位置Disc(Color col){setBackground(col); //设置盘子的背景颜色}public void setNumber(int n){ //设置盘子上的数字号码number=n;}public int getNumber(){ //返回盘子上的数字号码return number;}public void setPoint(TowerPoint p){ //设置盘子所在的塔点位置point=p;}public TowerPoint getPoint(){//返回盘子的塔点位置return point;}}HandleMouse类/* HandleMouse类* 该类主要实现MouseListener好MouseMotionListener接口,其中创建的对象handleMouse为tower容器的成员之一,* 主要功能是:监视tower容器中Disc盘子对象上的鼠标事件。