java写的汉诺塔演示动画(原创)

wu4357815 2014-03-11 10:10:54
加精
java写的汉诺塔演示动画,这个是本人原创,其实早在2010就写好了,不过是c语言版,
现在学习java,就改写了一下,其实核心思想和算法一点都没变。
c语言版和c++版在这个网址
http://bbs.bccn.net/thread-422624-1-1.html
http://bbs.bccn.net/thread-422623-1-1.html
我个人感觉还是比较美观的,和网上的代码相比
说下思路:
1.新建一个线程实现汉诺塔递归。要不然就会阻塞图形线程。
2.图形界面输入,不是命令行输入(c语言版是命令行)
3.直接用画矩形函数实行塔的绘制。


import java.awt.*;

import javax.swing.*;

class var{
public static int num=0; //表示开始时第一塔有5个
public static int t_one=0,t_two=-1,t_three=-1; //表示每层塔的个数
public static int tower_one[]=new int[30],tower_two[]=new int[30],tower_three[]=new int[30]; //表示每个塔有塔的层数
public static int n=2;
public static int rectx1,rectx2,recty=440,rectmid,rectmidt=315; //表示要画的矩形左右坐标
public static int t=0,t2=0; //tower为指向要移动的塔的指针
public static int tower[]=tower_one;
public static int bool=1;//画图函数,画出a塔移动到b塔
public static char str[]=new char[20];
}
public class Hanoi2 extends JFrame implements Runnable{
public Thread thread1=new Thread(this);

public Hanoi2(){
init();
add(new Paints());
//runs();
input();
thread1.start();
}
public void init(){
for(int i=0;i<30;i++) //分别为每个塔里层数编号
{
var.tower_one[i]=i;
}
for(int i=0;i<30;i++)
{
var.tower_two[i]=i;
}
for(int i=0;i<30;i++)
{
var.tower_three[i]=i;
}
}
public void input(){
String str=JOptionPane.showInputDialog("请输入汉诺塔层数不大于13的整数。");
int x=(int)Float.parseFloat(str);
if(!(x>=1&&x<=13)){
JOptionPane.showMessageDialog(null,"请输入汉诺塔层数不大于13的整数。");
System.exit(0);
}
else{
var.n=x;
var.t_one=x-1;
}

}
public void moves(int a,int b)
{
switch(a)
{
case 1:var.rectmid=155;var.tower=var.tower_one;var.t=var.t_one;var.t_one-=1;break; //t表示要移动的塔中塔数有几个
case 2:var.rectmid=315;var.tower=var.tower_two;var.t=var.t_two;var.t_two-=1;break;
case 3:var.rectmid=475;var.tower=var.tower_three;var.t=var.t_three;var.t_three-=1;break;
}
switch(b)
{
case 1:var.rectmidt=155;var.t2=var.t_one;break; //t2表示要移动到的塔有几个
case 2:var.rectmidt=315;var.t2=var.t_two;break;
case 3:var.rectmidt=475;var.t2=var.t_three;break;
}
if(a>=b) var.bool=1;
else var.bool=0;
var.rectx1=var.rectmid-(14-var.tower[var.t])*5; //计算要画的矩形左边坐标
var.rectx2=var.rectmid+(14-var.tower[var.t])*5;
var.recty=440-var.t*5;
while(var.recty>=200)
{
var.recty-=10; //塔向上移动到坐标100处
repaint();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
while(var.rectmid!=var.rectmidt) //rectmidt表示中间塔中间的位置
{
if(1==var.bool)
{
var.rectmid-=5;
var.rectx1=var.rectmid-(14-var.tower[var.t])*5; //rectx2-rectx1 是变长的
var.rectx2=var.rectmid+(14-var.tower[var.t])*5;
repaint();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else
{
var.rectmid+=5;
var.rectx1=var.rectmid-(14-var.tower[var.t])*5;
var.rectx2=var.rectmid+(14-var.tower[var.t])*5;
repaint();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
while(var.recty<=(430-(var.t2)*5))
{
var.recty+=10; //塔向下移动
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();
}
switch(b)
{
case 1:var.t_one+=1;var.tower_one[var.t_one]=var.tower[var.t];repaint();break; //选择移动到的塔层数加1,并且把当前塔的大小,传递过去。
case 2:var.t_two+=1;var.tower_two[var.t_two]=var.tower[var.t];repaint();break;
case 3:var.t_three+=1;var.tower_three[var.t_three]=var.tower[var.t];repaint();break;
}


}
public void hanoi(int n,int one,int two,int three)
{
if(n==1)
{
moves(one,three);
//JOptionPane.showMessageDialog(null,n);
}
else
{
hanoi(n-1,one,three,two);
moves(one,three);
hanoi(n-1,two,one,three);
}
}
public void run(){
hanoi(var.n,1,2,3);

}
public static void main(String[] args){
Hanoi2 frame= new Hanoi2();


frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(660, 550);
frame.setTitle("汉诺塔移动动画");
frame.setVisible(true);
frame.setResizable(false);

}

}
class Paints extends JPanel{
protected void paintComponent(Graphics g){
int i,j,rectmid1;
//JOptionPane.showMessageDialog(null, "画图启动");
g.drawString("南昌大学benmo制作", 270, 50);
g.drawString("qq号52733#8997(去掉中间的#)", 270, 70);
g.drawRect(80,450,150,5);
g.drawRect(240,450,150,5);
g.drawRect(400,450,150,5);
rectmid1=155;int recty1=440;
g.drawRect(var.rectx1,var.recty,var.rectx2-var.rectx1,9); //画出移动的矩形
for(i=0;i<=var.t_one;i++)
g.drawRect(155-(14-var.tower_one[i])*5,recty1-10*i,(14-var.tower_one[i])*10,10);
for(i=0;i<=var.t_two;i++)
g.drawRect(315-(14-var.tower_two[i])*5,recty1-10*i,(14-var.tower_two[i])*10,10);
for(i=0;i<=var.t_three;i++)
g.drawRect(475-(14-var.tower_three[i])*5,recty1-10*i,(14-var.tower_three[i])*10,10);
}
}


...全文
9605 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
OhRotary 2015-02-15
  • 打赏
  • 举报
回复
感觉很不错啊。赞一个!感谢LZ分享!
黄逗 2014-12-07
  • 打赏
  • 举报
回复
借用下楼主的,只做算法演示!感谢
lgq910710 2014-05-31
  • 打赏
  • 举报
回复
高手,膜拜啊!!
还寝梦佳期 2014-04-19
  • 打赏
  • 举报
回复
很好很强大!!!!
u010145281 2014-03-24
  • 打赏
  • 举报
回复
很不错的说
代码间的舞者 2014-03-22
  • 打赏
  • 举报
回复
感谢楼主啊。 想想自己只知道看别人的代码,却没有自己动手写过这样的程序,真是惭愧呀
xusir98 2014-03-21
  • 打赏
  • 举报
回复
wangsufu77 2014-03-21
  • 打赏
  • 举报
回复
一听说汉诺塔就头疼
aby913 2014-03-19
  • 打赏
  • 举报
回复
谢谢分享!学习了!
kuoshuang 2014-03-18
  • 打赏
  • 举报
回复
谢谢分享!学习了!
「已注销」 2014-03-18
  • 打赏
  • 举报
回复
酷啊,学习学习~
austin9972 2014-03-17
  • 打赏
  • 举报
回复
sevenir 2014-03-17
  • 打赏
  • 举报
回复
顶,谢谢分享、
工作圈 2014-03-17
  • 打赏
  • 举报
回复
非常给力啊,学习了
suabcsu 2014-03-17
  • 打赏
  • 举报
回复
真不错 学习了
漫步的小张 2014-03-17
  • 打赏
  • 举报
回复
不错!!!!
代码间的舞者 2014-03-17
  • 打赏
  • 举报
回复
用楼主的代码,运行了一遍,果然不容易啊
letingoo 2014-03-16
  • 打赏
  • 举报
回复
支持,学习了
twtiqfn 2014-03-16
  • 打赏
  • 举报
回复
真是太厉害了,学习了
「已注销」 2014-03-16
  • 打赏
  • 举报
回复
感谢分享喽。嘿嘿
加载更多回复(29)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧