这几天刚刚学完pygame,加上比较有空,于是就用pygame做了一个随机迷宫生成+路径寻找的演示,随机迷宫生成包括了DFS,以及随机kruscal算法,用并查集优化,截图大致如下
首先,简单说下网格视图的构建:
-
首先,为了建立这个网格视图,我是在整个窗口上一个一个画上正方形,而正方形的数量,则为对应宽,高除以网格数量,然后,画整个网格视图的主要代码如下:
:::python for y in range(0, self.height, self.grid_size): for x in range(0, self.width, self.grid_size): pygame.draw.rect(self.surface, self.grid_color, ((x, y), (self.grid_size, self.grid_size)), self.grid_width)
-
另外,为了填充特定的方格,先把整个网格视图看作一个二维数组,给出数组下标后,按照下列公式换算成对应在屏幕上的坐标:
:::python (x*self.grid_size, y*self.grid_size)
即为,数组下标乘以对应网格大小,即刻达到在填充对应的方格,至于在特定方格上画圆,也是采用差不多的原理
所使用的算法
-
a. 生成迷宫之前,首先把相隔开的网格看成是墙,两边则是可以通过的道路,而生成迷宫的过程,则为把墙推倒直到有道路能够使迷宫能够走通的过程,
-
b. 在DFS算法中,从随机的一个点开始,如果这个点相邻的点没有被标记为访问,则把相隔开的墙推到,直到所有的点都访问了为止,在DFS算法中,我使用的递归
-
c. 而在随机kruscal算法中,我参照了维基百科中的做法,并且使用了并查集来做优化,首先初始化成迷宫中所有点都属于自己的一个集合,当起点和终点不连通时,随机选取一个点,若这个点并没有被访问过,做以下判断:
- 1.如果两个点连通,则继续循环,否则进行第二步
- 2.否则,合并这两个集合,并把隔开这两个点的墙推倒
-
d. 而在路径寻找的过程中,我使用的是普通的BFS算法,比较简单,从起点开始,当搜到终点之后,搜索结束,并把路径整理出来
在做完这个小东西之后,发现pygame做这类工作还是挺方便的,就是华丽度不够,效果比较差。。。而代码,我放在了github上,链接在这里
网友评论