《数据结构课程设计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);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(t