数据结构课程设计java求解迷宫-回溯法-A算法.docx

上传人:李司机 文档编号:6432042 上传时间:2023-10-30 格式:DOCX 页数:41 大小:356.34KB
返回 下载 相关 举报
数据结构课程设计java求解迷宫-回溯法-A算法.docx_第1页
第1页 / 共41页
数据结构课程设计java求解迷宫-回溯法-A算法.docx_第2页
第2页 / 共41页
数据结构课程设计java求解迷宫-回溯法-A算法.docx_第3页
第3页 / 共41页
数据结构课程设计java求解迷宫-回溯法-A算法.docx_第4页
第4页 / 共41页
数据结构课程设计java求解迷宫-回溯法-A算法.docx_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《数据结构课程设计java求解迷宫-回溯法-A算法.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计java求解迷宫-回溯法-A算法.docx(41页珍藏版)》请在三一办公上搜索。

1、算法与数据结构课程设计课题:求解迷宫通路的图形界面演示程序作者:吴昊QQ:328035823目录1 .题目及需求分析42 .概要设计43 .详细设计104 .调试分析395 .课程设计总结421 .题目及需求分析1.1 题目编制个求解迷宫通路的图形界面演示程序。1.2需求分析1 .输入一个任意大小的迷宫,任设起点、终点、障碍,用栈求出一条走出迷宫的路径,并显示在屏幕上;2 .根据用户界面提示,用键盘输入,HomC键设置迷宫起点,End键设终点,上下左右箭头键移动,Enter键添加墙,Del键删除墙,完成后按F9键演示,演示完毕后可F5刷新题图,重新对地图的起点、终点、障碍进行设置,ESC键退出

2、;3 .本程序要求至少得出一条成功的通路,也可求得全部路径。此外,也可尝试保存或载入测试文件(此功能不做强行要求)。4 .当未输入起点时,消息显示“Error:YoumustsettheSTART.,;未输入终点时,显示“Error:YoumustsettheEND.找到路径时,屏幕显示足迹,并在消息框出现Pathfound,否则消去足迹,显示Pathnotfoundo5 .用户可以通过界面上提供的菜单选项,选择“帮助”查看操作说明。6 .(算法选优)用户可以通过界面上提供的菜单选项,选择“A*算法求最短路径”演示求解迷宫最短路径。2.概要设计根据需求分析的用户界面的设计要求,考虑到我们在Ja

3、Va课程中学习过GUI设计,对JaVa的GUl的比较熟悉,所以我们用JaVa语言来开发本项目。在设计求解迷宫的程序时,要求编写8个Java源文件:Dialog.java、MaZe.java、MazeGUI.java、PoSition.javaRollback.javastack.javastar.java和Aposition.java。该程序除了上述6个Java源文件所给出的类以外,还需呀Java系统提供的一些重要的类,如java.awt包中的容器类、画图类、事件类及监听器接口、javax.swing包中的各种轻量组件类和java.Iang包中线程类等。2.1UML类图程序的所用到的一些重要的

4、类以及之间的关联关系如图2-1所示。CkBSSMaZeCa58/图2-1UML类图2.2DialOg.java(主类)Dialog.java(主类)是JDialog类的一个子类。该类负责创建提示用户输入迷宫大小的对话框,通过用户输入的参数来确定所要创建的迷宫图形界面的窗口的大小。该类含有main方法,程序从该类开始执行。BCgin类的成员变量有JTeXtFieId、JButtonJFrameBegin类的主要成员和成员方法的作用将在后面的详细设计中阐述。2.3Maze,javaMaZe类创建的对象是MaZeGUl类和RonbaCk类最重要的成员之一,代表迷宫。该类负责接收在迷宫窗口所设置起点、

5、终点、障碍的位置参数来绘制迷宫图像并存储迷宫结构的信息。该类的主要成员变量有3种类型的对象:Position.Image以及存放整型数的二维数组。MaZe类的主要成员和成员方法的作用将在后面的详细设计中阐述。2.4MazeGULjavaMazeGUI类是Frame类的个子类,创建的对象是RoIlbaCk类最重要的成员之一。该类负责创建迷宫图形窗口界面,方便用户在界面上设置起点、终点、障碍等并展现求解迷宫的过程。该类的主要成员变量有4种类型的对象:Maze、Rollback、Position和Threado该类还包含一个内部类SOlVeThread,该内部类实现了nmnable接口。MaZeGU

6、I类的主要成员和成员方法的作用将在后面的详细设计中阐述。2.5Position,java(图形界面坐标的存储结构)Position类创建的对象是MaZe类、MazeGUI类和Rollback类最重要的成员之一。该类负责在Maze类、MaZeGUl类和RonbaCk类之间传递消息,其对象存有当前位置的坐标信息。该类包含两个整型的成员变量X和y,记录当前位置在迷宫图形界面的横、纵坐标。POSition类的主要成员和成员方法的作用将在后面的详细设计中阐述。2. 6Stack.java(数据类型结构)为了体现算法与数据结构的课程特点,我们并没有用Java系统类库中java.Util.Stack类,而是

7、编写了一个通用的StaCk存储结构。Stack类创建的对象是Rollback类的最重要的成员之一。该类负责保存在求解迷宫过程中所走过的路径信息。该类包含一个内部类Node,定义了栈中存储的节点元素的类型。另外还含有一个整型成员变量n和一个Node类型的成员变量top,分别记录栈中元素的个数以及栈顶元素的信息。而Node类定义的是栈中节点的类型,包含当前节点的信息info(Object类型)和以及栈中下一个元素的引用next(相当在C语言中的指针)。StaCk类的主要成员和成员方法的作用将在后面的详细设计中阐述。2.7RoIIbackjava(核心算法一回溯算法)Rollback类创建的对象是是

8、MaZeGUl类最重要的成员之一。该类负责根据Maze类中的迷宫数组的信息采用回溯算法,控制并绘制人物在迷宫图形界面窗口中的位置。该类的主要成员变量有4种类型的对象:Maze、MazeGUIPoSition和StaCk。RoIlbaCk类的主要成员和成员方法的作用将在后面的详细设计中阐述。2. 8Astar.java(核心算法一A*算法)AStar类创建的对象是是MaZeGUl类最重要的成员之一。该类负责根据MaZe类中的迷宫数组的信息采用A*算法,找到起点到终点的最短路径并打印出来。该类的主要成员变量有4种类型的对象:Maze、APositionStaCk和LinkedList。AStar类

9、的主要成员和成员方法的作用将在后面的详细设计中阐述。3. 9Aposition(A*算法的存储结构)APOSition类是POSitiOn类的派生类,APOSition类创建的对象是AStar类、MazeGUI类和Rollback类最重要的成员之一。该类负责在Astar类、MazeGUI类和Rollback类之间传递消息,其对象存有当前位置的坐标信息、A*算法的评估函数值、开关标记和父节点等。APoSition类的主要成员和成员方法的作用将在后面的详细设计中阐述。2.9事件跟踪图2.9.1用户启动迷宫图形界面sdMazeCase图2-2用户启动迷宫图形界面5dMaZeCaSe/弓户崇作Maze

10、GUlactionPerfofmedO坏乱drawPos生悻draw()绘制aCtionPerfofmedO!draw()Enter.Deldraw()图2-3用户设置迷宫参数setBegi11O设置会点、终点2.9.3回溯法求解迷宫5dMaZeCaSe/图2-4回溯法求解迷宫3.详细设计3.1工程文件视图,冷MazeCase/0src,由maze团Apositionjavat团AstarJavatJDialogjavat团MazejavaD团MazeGULjava0团PositionJavaQlRollbackjava团Stackjava国JRESystemLibrary(jre6.Lgif

11、EjSajpg晅begin.jpgend.jpg0gojpgB0a,maze.jpgCjHroad.jpg国Thumbs.db0wall.jpg4. 2Dialog,java(主类)3.2.1效果图Dialog创建的对话框效果如图1所示。图1Dialog创建的对话框对象3. 2.2UML图Dialog类是javax.SWing包中JDialog的一个子类,标明该类的主要成员变量和方法的UML图如图2所示。图2Dialog类的UMI图以下是UML图中有关数据和方法的详细说明。1)成员变量 tfl、tf2是JTextField类创建的文本框。用来接收用户输入的设置迷宫的大小参数,即行和列的数目。当

12、用户没有输入时,tfl、tf2的默认文本内容为10。 b是JBUttOn类创建的按钮,名字为“生成迷宫”。b被放置在对话框的右下角。b还为自己注册了ACtionEVent的事件监听器。当点击按钮时,根据tfl、tf2的文本内容创建一个MaZeGUl的对象,生成迷宫图形界面窗口。2)成员方法 Dialog()是构造方法,负责完成对话框的初始化操作。初始化操作包括:将内容为“列数:的JLabel对象、内容为列数:的JLabel对象、b添加到对话框中,并设置对话框的布局,设置背景颜色,设置对话框的标题为“课程设计一求解迷宫”。另外还为对话框注册了WindoWEVent的事件监听器。main(Stri

13、ngSrgd口)方法是程序运行的入口方法。3.2.3代码(Dialog,java)packagemaze;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;/*启动窗口SuppresSWarnings(,serialu)publicclassDialogextendsJDialogprivateJTextFieldtfl=newJTextField(10,10);privateJTextFieldtf2=newJTextField(,10,10);privateJButtonb=newJBUttQn(生成迷宫;publics

14、taticvoidmain(Stringsrgd)try(Thread.sleep(300);catch(Exceptione)e.PrintStackTrace();)newDialog();)publicDialog()SetTitle(”课程设计一求解迷宫”);SetLayout(newBorderLayout();JPanelp=newJPanel(newGridLayout(4z1);FlowLayoutflowLayout=newFlowLayout();flowLayout.SetAlignment(FlowLayout.LEFT);fIowLayout.setHgap(10);

15、FlowLayoutflowLayoutl=newFlowLayout();flowLayoutl.SetAlignment(FlowLayout.RIGHT);JPanelpl=newJPanel(flowLayout);JPanelp2=newJPanel(flowLayout);JPanelp3=newJPanel();JPanelp4=new JPanel ();JPanelp5=new JPanel(flowLayoutl);pl. add(new JLabel( pl. add(tf1);p2. add(new JLabel(行数:);列数:);p2. add(tf2);pl.Se

16、tBackground(new p2.SetBackground(new p3.SetBackground (new p4.SetBackground(newColor(226,244,255);Color(226,244,255);Color(226,244,255);Color(226,244,255);P.add(p3);P.add(pl);P.add(p2);P.add(p4);p5.add(b);Color(196,227,248);p5.SetBackground(newadd(newJLabel(newImageicon(maze.jpgn),BorderLayout.NORTH

17、);add(p,BorderLayout.CENTER);add(p5,BorderLayout.SOUTH);setSize(345,250);SetLocation(400,100);SetVisible(true);b.addActionListener(newActionListener()publicvoidactionPerformed(ActionEvente)newMazeGUI(Integer.parselnt(tf1.getText(),Integer.parselnt(tf2.getText();SetVisible(false););addWindowListener(

18、newWindowAdapter()publicvoidwindowclosing(WindowEvente)System.exit(0););3.3Maze,java3.3.1效果图MaZe类绘制的墙、通路、路径、起点和终点的效果图如图3所示。仇n图3墙、通路、路径、起点和终点3.3.2UML图MaZe类创建的对象是MaZeGUl类和ROnbaCk类最重要的成员之一,代表迷宫。标明MaZe类的主要成员变量、成员方法的UM图如图4所示。DHanOmr*Mp:Wob*911:Pocltionond:Podtiono4wPoM(tnptPotfaon):ini mon.rm1nrtW)vod图4M

19、aze类的UML图以下是UML图中有关数据和方法的详细说明。D成员变量 mazeMap是int类型的二维数组,数组的元素的值表示迷宫对应位置的内容。若元素的值为O表示迷宫对应位置可通过,即为通路;若元素的值为1表示迷宫对应位置为墙;若元素的值为2表示迷宫对应位置为已经走过的足迹;若元素的值为3,表示迷宫对应位置是从栈中弹出的点,并且不能再次通过;若元素的值为4,表示迷宫对应位置为起点,保证起点不可通过。 begin和end是Position类创建的对象,其存储了起点和终点在迷宫图形界面上的坐标信息。 drawPos是Position类创建的对象,在迷宫图形界面上表现为一个方框,起到定位的作用,

20、其存储了在设置起点、终点、障碍在迷宫图形界面的位置时当前的坐标信息。 WaIIPic、roadPicgoPicbeginPic和endPic是Image类创建的对象,其内容分别为墙、通路、路径、起点和终点的图片。 row和co是int类型的变量,其值分别表示迷宫数组的行数和列数。2)成员方法 Maze(introw,intCOI)是MaZe类的构造方法,通过调用SetMaZe方法来创建maze对象,其参数row,col是从MaZeGUl类中传来的参数。 setMazc(introw,intCOl)方法,maze对象可调用该方法完成迷宫数组的初始化操作:创建指定行数和列数的迷宫数组,将迷宫图形界

21、面外围位置对应迷宫数组的元素的值设为1,将其余元素的值设为0。 isPass(PositionP)方法,maze对象可调用该方法判断传入的参数P点周围的四个方向是否能通过,并返回一个整型数。根据P点坐标,确定该点在迷宫数组中的元素位置,然后再根据该位置四个方向上相邻位置元素的值判断该P点周围的四个方向是否能通过。若元素的值为0表示可以通过。对于返回值,若返回表示P点四周没有通路(包括从栈中弹出的点);若返回0,表示P点东方向有通路;若返回L表示P点南方向有通路;若返回2,表示P点西方向有通路;若返回3,表示P点北方向有通路。 mark(Positionp,intIn)方法,maze对象可调用该

22、方法将传入的参数p点在迷宫数组的对应位置的元素设为限 draw(Graphicsg)方法,maze对象可调用该方法根据迷宫数组元素的值来绘制墙、通路、路径图像和用于在迷宫图形界面定位的方框,此外该方法还根据begin和end中存储的坐标信息来绘制对应位置的起点和终点图像。 setBegin(intx,inty)和SetEnd(intx,inty)方法,maze对象可调用该方法根据传入的参数xy来创建Position类的对象begin和Cndo3.3.3代码(Maze,java)packagemaze;importjava.awt.*;importjavax.swing.*;/*迷宫参数publ

23、icclassMazeint)mazeMap;/十也图数据Positionbegin;起始坐标Positionend;结束坐标PositiondrawPos=newPosition(1,1);ImagewallPic=newImageicon(,wall.jpg11).getlmage();ImageroadPic=newImageicon(road.jpg11).getlmage();Imagea=newImageicon(,a.jgu).getlmage();ImagegoPic=newImageicon(go.jpg).getlmage();ImageendPic=newImageico

24、n(,end.jpgu).getlmage();ImagebeginPic=newImageicon(,begin.jgn).getlmage();introw=0,col=0;publicMaze(introw,intcol)this.row=row;this.col=col;mazeMap=newintrowcol;for(inti=0;irow;i+)for(intj=0;jcol;j+)if(i=0IIj=0IIj=col-li=row-l)/迷宫最外层设为墙this.mazeMapi(j=1;elsethis.mazeMapij=0;publicMaze()publicvoidmar

25、k(Positionpzintm)/标记位置已走过this.mazeMapp.yp.x=m;publicvoiddraw(Graphicsg)/绘制地图图片for(inti=0;irow;i+)for(intj=0;jcol;j+)if(begin!=null&i=begin.y&j=begin.x)/起点g.drawlmage(beginPic,j*50,24+i*50,50,50,null);elseif(end!=null&i=end.y&j=end.x)/Ag.drawlmage(endPic,j*50,24+i*50,50,50znull);elseif(this.mazeMapij

26、=1)/墙壁g.drawlmage(wallPic,j*50,24+i*50,50,50,null);elseif(this.mazeMapij=2)/已走过的路径g.drawlmage(goPic,j*50,24+i*50,50,50,null);elseif(this.mazeMapij=3)已走过的路径,消除脚印g.drawlmage(roadPic,j*50,24+i*50,50,50,null);elseif(this.mazeMapij=5)A*方法路径g.drawlmage(a,j*50,24+i*50,50,50,null);)else/通道g.drawlmage(roadPi

27、c,j*50,24+i*50,50,50,null);)g.drawRect(drawPos.x*50,24+drawPos.y*50,50,50);publicvoidresume()/恢复迷宫for(inti=0;irow;i+)for(intj=0;jcol;j+)if(this.mazeMapij=2IIthis.mazeMapij=3)this.mazeMapij=0;)publicvoidsetEnd(intx,inty)end=newPosition(x,y);publicvoidSetBegin(intx,inty)begin=newPosition(x,y);)3.4Maze

28、GULjava3.4.1效果图MazeGUI类创建的迷宫图形界面窗口的效果图如图5所示。图5MazeGUI类创建的迷宫图形界面窗口的效果图3.4. 2UML图MazeGUI类是Frame类的一个子类,创建的对象是Rollback类最重要的成员之一。该类负责创建迷宫图形窗口界面,方便用户在界面上设置起点、终点、障碍等并展现求解迷宫的过程。该类还包含两个内部类SoIVeThead、AThread,该内部类实现了runnable接口。标明Maze类的主要成员变量、成员方法的UMl图如图6所示。 ICrf ltMrI njrrollback.back()等求解迷宫的核心算法,并调用repaint()重

29、绘。3.4.3代码(MazeGULjava)packagemaze;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;/*迷宫图形界面SuppressWarnings(serial”)publicclassMazeGUIextendsFrameimplementsKeyListener,ActionListener/迷宫GU工finalObjectobj=newObjeCt();/锁对象introw=0zcol=0;Imageoffscreen=null;Mazemaze;/构建迷宫参数Rollbackrollback;As

30、tarastar;Threadtl=newThread(newSolVeThread(),SolVeThread);/寻路进程,在初始化Thread类时,把目标对象传递给这个线程实例Threadt2=newThread(newAThread(),uAThreadu);publicvoidpaint(Graphicsg)/调用绘制地图的draw()方法和绘制人物位置的draw()方法maze.draw(g);rollback.draw(g);)publicvoidupdate(Graphicsg)/双缓冲防止屏幕闪烁if(offscreen=null)offscreen=this.CreateI

31、mage(col*50,row*50);)Graphicsoffg=OffScreen.getGraphics();Colorc=offg.getColor();offg.setcolor(Color.BLUE);offg.fillRect(O,O,col*50,row*50);offg.setColor(c);paint(offg);g.drawlmage(offscreen,O,O,null);)publicMazeGUI()()publicMazeGUI(introw,intCOl)/初始化窗体七his.setTitle(”算法课程设计-求解迷宫问题”);this.setSize(col

32、*50,row*50);this.SetLocation(200,80);this.SetResizable(false);this.addWindowListener(newWindowAdapter()ptblicvoidwindowclosing(WindowEvente)System.exit(O););this.row=row;this.col=col;maze=newMaZe(row,col);/构建迷宫参数rollback=newRollback(maze,this);this.SetVisible(true);MenuBarmenuBar=newMenuBar();Menufi

33、leMenu=newMenU(文件,);MenusettingMenu=newMenU(操作“);Menuitemexitltem=newMenuItem(,il,);Menuitemmapltem=newMenU工tem(刷新地图;Menuitemaltem=newMenU工tem(A*算法寻找最短路径”);Menuitemhelpltem=newMenuitem(,S);fileMenu.add(exititem);SettingMenu.add(mapitem);SettingMenu.add(altem);SettingMenu.add(helpitem);menuBar.add(fi

34、leMenu);menuBar.add(SettingMenu);SetMenuBar(menuBar);addKeyListener(this);exititem.addActionListener(this);mapitem.addActionListener(this);altem.addActionListener(this);helpitem.addActionListener(this);privateclassSolveThreadimplementsRUnnable/提供一个实现借口RUnnable接口的类的实例,作为一个线程的目标对象PubIiCvoidrun()while(

35、!rollback.isver()/寻路结束后,线程结束synchronized(obj)try(Thread.sleep(200);catch(InterruptedExceptione)e.PrintStackTrace();if(!rollback.forward()rollback.back();)repaint();)privateclassAThreadimplementsRUnnabIe/展示用A*算法求解迷宫过程的线程publicvoidrun()while(!astar.as.isEmpty()synchronized(obj)try(Thread.sleep(200);ca

36、tch(InterruptedExceptione)e.PrintStackTrace();)Apositiontemp=(Aposition)astar.as.top();astar.as.pop();maze.mazeMaptemp.ytemp.x=5;rollback.curPos.x=temp.x;rollback.curPos.y=temp.y;)repaint();if(astar.as.isEmpty()JOptionPane.ShowMessageDialog(null,”找到最短路径最短路径!);)publicvoidkeyTyped(KeyEvente)publicvoid

37、ReyReleased(KeyEvente)publicvoidkeyPressed(KeyEvente)if(e.getKeyCode()=KeyEvent.VK_DELETE)maze.mark(maze.drawPos,0);)elseif(e.getKeyCode()=KeyEvent.VK_ENTER)maze.mark(maze.drawPos,1);)elseif(e.getKeyCode()=KeyEvent.VK_F9)if(maze.begin=null)JOptionPane.ShowMessageDialog(null,”起点没有设置“);elseif(maze.end

38、=null)JOptionPane.ShoifMessageDiaIog(null,”终点没有设置,);elseif(tl.getState().equals(Thread.State.NEW)当没有线程处于运行态时tl.start();/启动寻路线程System,out.print(,new);elseif(tl.getState().equals(Thread.State.TERMINATED)/当该线程处于终止态时,又点击了F9,即重新演示tl=newThread(newSoIVeThread(),SolVeThread);/新建线程rollback,flush()/刷新maze,resume();恢复迷宫到初始状态tl.start();)else/在寻路过程中,如果点击了

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号