欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

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

    • 资源ID:725296       资源大小:356.34KB        全文页数:41页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    算法与数据结构课程设计课题:求解迷宫通路的图形界面演示程序作者:吴昊QQ:328035823目录1 .题目及需求分析42 .概要设计43 .详细设计104 .调试分析395 .课程设计总结421 .题目及需求分析1.1 题目编制个求解迷宫通路的图形界面演示程序。1.2需求分析1 .输入一个任意大小的迷宫,任设起点、终点、障碍,用栈求出一条走出迷宫的路径,并显示在屏幕上;2 .根据用户界面提示,用键盘输入,HomC键设置迷宫起点,End键设终点,上下左右箭头键移动,Enter键添加墙,Del键删除墙,完成后按F9键演示,演示完毕后可F5刷新题图,重新对地图的起点、终点、障碍进行设置,ESC键退出;3 .本程序要求至少得出一条成功的通路,也可求得全部路径。此外,也可尝试保存或载入测试文件(此功能不做强行要求)。4 .当未输入起点时,消息显示“Error:YoumustsettheSTART.,;未输入终点时,显示“Error:YoumustsettheEND.找到路径时,屏幕显示足迹,并在消息框出现Pathfound,否则消去足迹,显示Pathnotfoundo5 .用户可以通过界面上提供的菜单选项,选择“帮助”查看操作说明。6 .(算法选优)用户可以通过界面上提供的菜单选项,选择“A*算法求最短路径”演示求解迷宫最短路径。2.概要设计根据需求分析的用户界面的设计要求,考虑到我们在JaVa课程中学习过GUI设计,对JaVa的GUl的比较熟悉,所以我们用JaVa语言来开发本项目。在设计求解迷宫的程序时,要求编写8个Java源文件:Dialog.java、MaZe.java、MazeGUI.java、PoSition.java>Rollback.javastack.javastar.java和Aposition.java。该程序除了上述6个Java源文件所给出的类以外,还需呀Java系统提供的一些重要的类,如java.awt包中的容器类、画图类、事件类及监听器接口、javax.swing包中的各种轻量组件类和java.Iang包中线程类等。2.1UML类图程序的所用到的一些重要的类以及之间的关联关系如图2-1所示。CkBSSMaZeCa58/图2-1UML类图2.2DialOg.java(主类)Dialog.java(主类)是JDialog类的一个子类。该类负责创建提示用户输入迷宫大小的对话框,通过用户输入的参数来确定所要创建的迷宫图形界面的窗口的大小。该类含有main方法,程序从该类开始执行。BCgin类的成员变量有JTeXtFieId、JButtonJFrameBegin类的主要成员和成员方法的作用将在后面的详细设计中阐述。2.3Maze,javaMaZe类创建的对象是MaZeGUl类和RonbaCk类最重要的成员之一,代表迷宫。该类负责接收在迷宫窗口所设置起点、终点、障碍的位置参数来绘制迷宫图像并存储迷宫结构的信息。该类的主要成员变量有3种类型的对象:Position.Image以及存放整型数的二维数组。MaZe类的主要成员和成员方法的作用将在后面的详细设计中阐述。2.4MazeGULjavaMazeGUI类是Frame类的个子类,创建的对象是RoIlbaCk类最重要的成员之一。该类负责创建迷宫图形窗口界面,方便用户在界面上设置起点、终点、障碍等并展现求解迷宫的过程。该类的主要成员变量有4种类型的对象:Maze、Rollback、Position和Threado该类还包含一个内部类SOlVeThread,该内部类实现了nmnable接口。MaZeGUI类的主要成员和成员方法的作用将在后面的详细设计中阐述。2.5Position,java(图形界面坐标的存储结构)Position类创建的对象是MaZe类、MazeGUI类和Rollback类最重要的成员之一。该类负责在Maze类、MaZeGUl类和RonbaCk类之间传递消息,其对象存有当前位置的坐标信息。该类包含两个整型的成员变量X和y,记录当前位置在迷宫图形界面的横、纵坐标。POSition类的主要成员和成员方法的作用将在后面的详细设计中阐述。2. 6Stack.java(数据类型结构)为了体现算法与数据结构的课程特点,我们并没有用Java系统类库中java.Util.Stack类,而是编写了一个通用的StaCk存储结构。Stack类创建的对象是Rollback类的最重要的成员之一。该类负责保存在求解迷宫过程中所走过的路径信息。该类包含一个内部类Node,定义了栈中存储的节点元素的类型。另外还含有一个整型成员变量n和一个Node类型的成员变量top,分别记录栈中元素的个数以及栈顶元素的信息。而Node类定义的是栈中节点的类型,包含当前节点的信息info(Object类型)和以及栈中下一个元素的引用next(相当在C语言中的指针)。StaCk类的主要成员和成员方法的作用将在后面的详细设计中阐述。2.7RoIIbackjava(核心算法一回溯算法)Rollback类创建的对象是是MaZeGUl类最重要的成员之一。该类负责根据Maze类中的迷宫数组的信息采用回溯算法,控制并绘制人物在迷宫图形界面窗口中的位置。该类的主要成员变量有4种类型的对象:Maze、MazeGUIPoSition和StaCk。RoIlbaCk类的主要成员和成员方法的作用将在后面的详细设计中阐述。2. 8Astar.java(核心算法一A*算法)AStar类创建的对象是是MaZeGUl类最重要的成员之一。该类负责根据MaZe类中的迷宫数组的信息采用A*算法,找到起点到终点的最短路径并打印出来。该类的主要成员变量有4种类型的对象:Maze、APosition>StaCk和LinkedList。AStar类的主要成员和成员方法的作用将在后面的详细设计中阐述。3. 9Aposition(A*算法的存储结构)APOSition类是POSitiOn类的派生类,APOSition类创建的对象是AStar类、MazeGUI类和Rollback类最重要的成员之一。该类负责在Astar类、MazeGUI类和Rollback类之间传递消息,其对象存有当前位置的坐标信息、A*算法的评估函数值、开关标记和父节点等。APoSition类的主要成员和成员方法的作用将在后面的详细设计中阐述。2.9事件跟踪图2.9.1用户启动迷宫图形界面sdMazeCase图2-2用户启动迷宫图形界面5dMaZeCaSe/弓户崇作MazeGUlactionPerfofmedO坏乱drawPos生悻draw()绘制aCtionPerfofmedO!draw()Enter.Deldraw()图2-3用户设置迷宫参数setBegi11O设置会点、终点2.9.3回溯法求解迷宫5dMaZeCaSe/图2-4回溯法求解迷宫3.详细设计3.1工程文件视图,冷MazeCase/0src,由maze团Apositionjavat>团AstarJavat>JDialogjavat>团MazejavaD团MazeGULjava0团PositionJava>QlRollbackjava团Stackjava»国JRESystemLibrary(jre6.LgifEjSajpg晅begin.jpgend.jpg¢0gojpgB0a,maze.jpgCjHroad.jpg国Thumbs.db¢0wall.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类创建的文本框。用来接收用户输入的设置迷宫的大小参数,即行和列的数目。当用户没有输入时,tfl、tf2的默认文本内容为10。 b是JBUttOn类创建的按钮,名字为“生成迷宫”。b被放置在对话框的右下角。b还为自己注册了ACtionEVent的事件监听器。当点击按钮时,根据tfl、tf2的文本内容创建一个MaZeGUl的对象,生成迷宫图形界面窗口。2)成员方法 Dialog()是构造方法,负责完成对话框的初始化操作。初始化操作包括:将内容为“列数:的JLabel对象、内容为列数:"的JLabel对象、b添加到对话框中,并设置对话框的布局,设置背景颜色,设置对话框的标题为“课程设计一求解迷宫”。另外还为对话框注册了WindoWEVent的事件监听器。main(StringSrgd口)方法是程序运行的入口方法。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("生成迷宫;publicstaticvoidmain(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(tf2);pl.SetBackground(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);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(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:Podtiono4wPo<:PiicnOWanP)CIlm*9。f4dtcjlm9o90pte:Im490CndPK1lmge0b«9c1ImF0rowtM。col;iniQMaM(inrow1r4jncoiB)M(Ma2«Onrow1CJnCci1rM)VOtdiff>M(tnptPotfaon):ini m<fc(inp:Povt>on.rm1<M)1void dk*w(ngGiPkeS):vcdstEnd(inttrMyin*):void *911(gk:W>nrtW)»vod图4Maze类的UML图以下是UML图中有关数据和方法的详细说明。D成员变量 mazeMap是int类型的二维数组,数组的元素的值表示迷宫对应位置的内容。若元素的值为O表示迷宫对应位置可通过,即为通路;若元素的值为1表示迷宫对应位置为墙;若元素的值为2表示迷宫对应位置为已经走过的足迹;若元素的值为3,表示迷宫对应位置是从栈中弹出的点,并且不能再次通过;若元素的值为4,表示迷宫对应位置为起点,保证起点不可通过。 begin和end是Position类创建的对象,其存储了起点和终点在迷宫图形界面上的坐标信息。 drawPos是Position类创建的对象,在迷宫图形界面上表现为一个方框,起到定位的作用,其存储了在设置起点、终点、障碍在迷宫图形界面的位置时当前的坐标信息。 WaIIPic、roadPic>goPic>beginPic和endPic是Image类创建的对象,其内容分别为墙、通路、路径、起点和终点的图片。 row和co是int类型的变量,其值分别表示迷宫数组的行数和列数。2)成员方法 Maze(introw,intCOI)是MaZe类的构造方法,通过调用SetMaZe方法来创建maze对象,其参数row,col是从MaZeGUl类中传来的参数。 setMazc(introw,intCOl)方法,maze对象可调用该方法完成迷宫数组的初始化操作:创建指定行数和列数的迷宫数组,将迷宫图形界面外围位置对应迷宫数组的元素的值设为1,将其余元素的值设为0。 isPass(PositionP)方法,maze对象可调用该方法判断传入的参数P点周围的四个方向是否能通过,并返回一个整型数。根据P点坐标,确定该点在迷宫数组中的元素位置,然后再根据该位置四个方向上相邻位置元素的值判断该P点周围的四个方向是否能通过。若元素的值为0表示可以通过。对于返回值,若返回表示P点四周没有通路(包括从栈中弹出的点);若返回0,表示P点东方向有通路;若返回L表示P点南方向有通路;若返回2,表示P点西方向有通路;若返回3,表示P点北方向有通路。 mark(Positionp,intIn)方法,maze对象可调用该方法将传入的参数p点在迷宫数组的对应位置的元素设为限 draw(Graphicsg)方法,maze对象可调用该方法根据迷宫数组元素的值来绘制墙、通路、路径图像和用于在迷宫图形界面定位的方框,此外该方法还根据begin和end中存储的坐标信息来绘制对应位置的起点和终点图像。 setBegin(intx,inty)和SetEnd(intx,inty)方法,maze对象可调用该方法根据传入的参数x»y来创建Position类的对象begin和Cndo3.3.3代码(Maze,java)packagemaze;importjava.awt.*;importjavax.swing.*;/*迷宫参数publicclassMazeint)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=newImageicon(,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;i<row;i+)for(intj=0;j<col;j+)if(i=0IIj=0IIj=col-li=row-l)/迷宫最外层设为墙this.mazeMapi(j=1;elsethis.mazeMapij=0;publicMaze()publicvoidmark(Positionpzintm)/标记位置已走过this.mazeMapp.yp.x=m;publicvoiddraw(Graphicsg)/绘制地图图片for(inti=0;i<row;i+)for(intj=0;j<col;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=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(roadPic,j*50,24+i*50,50,50,null);)g.drawRect(drawPos.x*50,24+drawPos.y*50,50,50);publicvoidresume()/恢复迷宫for(inti=0;i<row;i+)for(intj=0;j<col;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.4MazeGULjava3.4.1效果图MazeGUI类创建的迷宫图形界面窗口的效果图如图5所示。图5MazeGUI类创建的迷宫图形界面窗口的效果图3.4. 2UML图MazeGUI类是Frame类的一个子类,创建的对象是Rollback类最重要的成员之一。该类负责创建迷宫图形窗口界面,方便用户在界面上设置起点、终点、障碍等并展现求解迷宫的过程。该类还包含两个内部类SoIVeThead、AThread,该内部类实现了runnable接口。标明Maze类的主要成员变量、成员方法的UMl图如图6所示。 <<Mwfxe>>ICrf< l<tMrI njr<) : vd%HwTbra4AIkr*4rJQ I图6MazeGUI类的UML图以下是UML图中有关数据和方法的详细说明。1)成员变量 Obj是ObjeCt类型的对象,该对象用于充当线程问题中的同步锁。 row.Col是int类型的变量,用来设置值迷宫图形界面的大小(不是指长度和宽度)。 OffSCreCn是Ilnage类的对象,用于双缓冲技术防止屏幕闪烁。 maze是Maze类的对象。该对象是在MazeGUI类的构造方法中根据i'ow和COI的值来创建的。 rollback是RonbaCk类的对象,该对象负责求解迷宫,并绘制人物在迷宫图形界面中的位置。 tl、t2是Thread线程类的对象,该对象负责控制求解迷宫的线程,便于展现求解迷宫的过程。2)成员方法 paint(Graphicsg)方法,该方法调用了maze对象的draw(Graphicsg)和rollback对象的draw(Graphicsg),分别绘制迷宫内容图像和人物图像。 update(Graphicsg) MazeGUI(introw,intcol)是MaZeGIJl类的构造方法,负责完成创建迷宫图形界面窗口的初始化操作。初始化操作包括:根据row和col创建maze对象,并根据创建的maze对象和MaZeGUl自身的一个引用来创建rollback对象;为迷宫图形窗口注册KeyEVent的事件监听器;设置窗口的大小,以及窗口在屏幕上显示的位置,设置菜单栏和菜单选项的内容,放入窗口中,并为菜单选项注册ACtiOnEVent的事件监听器。 threadSleepO方法,在求解迷宫的过程结束时,MazeGUI类的对象可调用该方法暂停求解迷宫线程,便求解迷宫线程等待。具体来说是,求解迷宫线程拥有.MazeGUI类的对象的监视器,当对象调用该方法时,放弃对此监视器的所有权并等待,直到其他线程通过调用notify方法,或notifyAll方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。 keyTyped(KeyEvente)方法为KeyListener接口中的抽象方法,必须要实现,但在本程序中没有实际用处,故在MaZeGUl类中该方法为空方法; kcyRcleascd(KeyEVeITte)方法为KeyLiStener接口中的抽象方法,必须要实现,但在本程序中没有实际用处,故在MaZeGUl类中该方法为空方法; kcyPressed(KeyEvente)方法为KeyListener接口中的抽象方法,必须要实现。该方法的操作如下:当按下键盘上的按键时,将会调用repaintO方法。根据所按下键的键值分成一下几种情况:若按下键盘的Enter键,将会把迷宫图形界面中定位方框位置对应的迷宫数组的元素值改为1,InaZe对象将在该位置绘制墙的图像;若按下键盘的DCletC键,将会把迷宫图形界面中定位方框位置对应的迷宫数组的元素值改为O,maze对象将在该位置绘制通路的图像;若按下键盘方向键的上犍,将会把迷宫图形界面中定位方框上移一个单位;若按下键盘方向键的下键,将会把迷宫图形界面中定位方框下移一个单位;若按下键盘方向键的左键,将会把迷宫图形界面中定位方框左移一个单位;若按下键盘方向键的右键,将会把迷宫图形界面中定位方框右移一个单位;若按下键盘的Home键,将会调用maze对象的SetBCgin(intx,inty)方法,把当前定位方框所在位置的坐标传给sctBegin(intx,inty)方法,创建Maze类中的begin对象,并且maze对象将在该位置绘制起点图像;若按下键盘的End键,将会调用maze对象的SetEnd(intX,inty)方法,把当前定位方框所在位置的坐标传给SetEnd(intx,inty)方法,创建Maze类中的Cnd对象,并且maze对象将在该位置绘制终点图像;若按下键盘的F9键,如果迷宫图形界面没有设置起点或终点,将会提示设置起点或终点,否则不能演示求解迷宫,如果迷宫设置完毕,将启动求解迷宫线程,演示求解迷宫的过程; actionPerformcd(ActionEvent。)方法,当鼠标点击菜单选项时将把产生的事件传给该方法,鼠标点击菜单选项“退出”时,将会关闭窗口并退出程序;鼠标点击刷新地图时,将会清空迷宫里内容,让用户重新设置。3)内部类SOlVeThread 内部类SolVeThread实现了runnable接口,是在MaZeGUI内部定义的一个线程类。该线程根据rollback,isver()返回的值判断求解迷宫过程是否结束,若没有结束,则不断在求解过程中不断地使线程睡眠200亳秒,可使求解迷宫的过程能清楚地展现给用户,此外还调用rollback.forward()>rollback.back()等求解迷宫的核心算法,并调用repaint()重绘。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;Astarastar;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.CreateImage(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*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();MenufileMenu=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(fileMenu);menuBar.add(SettingMenu);SetMenuBar(menuBar);addKeyListener(this);exititem.addActionListener(this);mapitem.addActionListener(this);altem.addActionListener(this);helpitem.addActionListener(this);privateclassSolveThreadimplementsRUnnable/提供一个实现借口RUnnable接口的类的实例,作为一个线程的目标对象PubIiCvoidrun()while(!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);catch(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)publicvoidReyReleased(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=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/在寻路过程中,如果点击了

    注意事项

    本文(数据结构课程设计java求解迷宫-回溯法-A算法.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开