![906b95b2d6f3f96c447c6aef0c60c80a.png](https://img-blog.csdnimg.cn/img_convert/906b95b2d6f3f96c447c6aef0c60c80a.png)
公众号此前发过一个视频,关于寻找迷宫出路的问题,视频中使用的是深度优先搜索,当然搜索方式有很多,各自也有优缺点,而本系列作为数据结构课程设计的一个制作分享,仅谈论在制作过程中使用到的一些方法,以及课设的完成过程。
0 1分析题目关于数据结构课设,老师提供了七道例题,选题范围包括但不限于此。而我选择了上图中展示的迷宫求解问题。
选择题目之后,对题目我标记出的是以下几点
只能使用非递归程序
需要考虑迷宫无解的情况
结果输出时不仅要输出矩阵,还要输出三元组
可以考虑使用可视化界面,动态演示算法过程
至于一些题目中没有提出,但我觉得可以自己用于完善项目的几点如下:
可以实现多个算法,演示各种算法的不同效果
可视化可以加入按钮效果,不需要键盘输入
迷宫使用自动生成随机迷宫,不使用固定迷宫
由于布置课设任务时,明确要求过只能使用C/C++以及Java,所以本系列内容的代码展示不使用 Python。
0 2计划安排先完成迷宫的图形界面演示
其次完成好迷宫的随机生成
将上述两个步骤结果合起来,实现图形演示随机迷宫。
完成深度优先搜索的递归版本算法
将深搜和图形演示结合起来,完成第一个版本的课设
改用非递归深搜,重复上一步
扩展:使用其他的搜索算法
0 3图形界面计划都有了,那么就只剩下开工了。图形界面可以使用 Java 实现,似乎其他组是这么干的,但由于限制了使用 Python,个人对 Java 图形界面不是很熟悉,所以决定使用当初写 C 语言游戏时用过的 EasyX 插件来完成图形界面的绘制。
直接在搜索框输入 EasyX,第一条搜索结果就是了,点进去后找到下载按钮直接下载。
需要说明的是,电脑上需要装有 VC6 或者 Visual Studio (哪个版本似乎不太重要,我的是 VS2019)。
双击下载好的 EasyX ,在安装界面,点击下一步,进入下图所示界面
图中第一项是帮助文档,第二项就是我们需要的插件,它会安装到你的VC6 或 VS 的安装目录下,之后就可以很方便的使用了,不过还是建议安装下帮助文档,便于后续查阅。
接下来就是重点了,由于我是在 VS 中使用 EasyX 设计图形界面,之后再使用 Java 调用,所以需要生成一个可供给 Java 调用的接口文件,在创建工程时选择空项目,然后选择下图所示的一项。如果没有这一项,需要在VS中安装 C/C++桌面开发工具。
接下来的给工程命名等等都很简单了,不再赘述。此处我给工程起名为 DrawRect。
上图中展示的就是该工程的目录了,DrawRect.h 文件是头文件,声明一些函数,供外部调用,即之后的 Java 调用,DrawRect.cpp 里面则会对头文件中声明的函数进行实现,需要引入一个 “graphics.h" 的头文件,其中就有 EasyX 用于绘图的一些函数,以及鼠标点击相关的函数等等。
详细步骤都介绍完了,接下来解释下 EasyX 的坐标系,其中窗口左上角是原点,向右是 x 正轴,向下是 y 正轴,所以这与我们直观的第 x 行第 y 列恰好相反,成了第 y 行第 x 列,在函数画图传参数时,我们只需要把参数列表里面两个参数交换下位置就行了。
仿照 DrawRect.cpp 文件中的定义函数的方法,实现一个最简单的画矩形的函数,迷宫就是由这一个一个的矩形组成,而函数需要画在窗口里面,所以还要一个初始化窗口和关闭窗口的函数。这三个函数具体实现可以查看 EasyX 的帮助文档。
这里只展示最终课设作品中用到的所有函数,而刚开始做课设时,并没有考虑贴图与鼠标点击,只是简单画矩形,至于矩形如何画和画在哪里,就需要读者自行考虑了。
上图为最终的 DrawRect.h 中声明的函数,实际过程中经历过多次修改,由于不是本系列的重点,所以就不多讨论这个问题了。但是需要注意的是头文件中,函数前面要加上 extern "C" 这一句。接下来只要点击 VS 上方菜单栏的“生成”--> “生成解决方案”即可,在下方输出框找到生成的 dll 文件路径,之后将会进行调用。
但也要注意下,将上方有一个框,写着“x86”,改成“x64”,这是因为我的 Java 版本是 64位,所以生成的 dll 文件也必须是 64位 才能被调用。
关于图形界面介绍到这里,感兴趣的读者可以自行对照帮助文档学习,这个使用很简单,之后的内容将不会再介绍 EasyX,只是直接调用 VS 中写好的接口。
0 4Java项目这个项目我使用的是 IDEA 进行编写与调试运行。最开始并不急于完成某个算法,或者某个猜想,只是单纯的将一些基础的东西都处理好,为之后的算法铺好路。
前面有了生成的 dll 文件后,在 IDEA 的 Java 项目内新建一个接口文件,我这里取名为了 DrawMaze.java 。接下来需要到 Github 上下载 JNA ,网址在这里
https://github.com/java-native-access/jna
进入网址后,往下找到图中位置,点击蓝色部分的链接,两个 jar 文件都可以下载。
找到自己电脑中 Java 的安装目录下的 jre 文件夹,双击打开后有一个 lib 文件夹,将下载的两个文件放到这个 lib 文件夹里面即可。
接下来到 IDEA 中,左上角“File”--> “Project Structure”,进去后从左向右依次点击三个方框内的内容。
点 “+”号后选择第一项,然后找到刚才下载的两个文件,逐一添加进来即可。
在接口文件 DrawMaze.java 中写的代码如下,这个接口的实现就是前面在 VS 中写好的生成的 dll 文件
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface DrawMaze extends Library {
// 加载DLL文件,将其实例化为一个对象,此处必须使用绝对路径,经测试 相对路径会抛连接失败的异常
DrawMaze drawMaze = (DrawMaze) Native.load("E:\\DSA\\DrawMazeByC\\DrawRectDll\\DrawRect\\x64\\Debug\\DrawRect", DrawMaze.class); //.load("DrawRect", DrawMaze.class);
// 初始化一个图形窗口,设置窗口大小 630x700
void initWindow();
// 关闭窗口
void closeWindow();
// 绘制矩形
void drawRect(int y, int x, int level, int flag);
// 放置图片
void drawLattice(int y, int x, int level, int flag);
// 加载墙壁图片
void loadWall(int y, int x, int level);
// 加载地面图片
void loadFloor(int y, int x, int level);
// 加载路径图片
void loadPath(int y, int x, int level);
// 检测鼠标点击事件
int getMouseHit();
}
需要注意的是,这里的路径记得改成自己的,我使用的绝对路径是因为多次测试后发现自己的电脑写相对路径会出现链接不到文件的情况。
前面的 package 语句就没有粘贴上来了,自己的文件应该是有这个的。
到了这里,关于图形界面的就差不多了,之后只是介绍课设过程中的一些算法、感想与改进思路。
图形界面函数的使用,之后其他文件只要 DrawMaze.drawMaze.函数(参数列表) 即可,前两个名字分别为接口文件名和接口文件内的对象名。
END在最后Last but not least
本文只是初步分析了下课设题目,以及大致的规划,同时粗略介绍了图形界面的设置等。内容比较简单,只是课设中的选做加分项,必做重点还是如何生成随机地图和搜索出口。
限于篇幅,本文到此结束,下一篇推文将继续介绍随机迷宫生成,其中我选用的是随机Prim算法。
往期 精彩回顾Python数据结构——树(三)
Python数据结构——树(四)
Python数据结构——树(五)