随机迷宫的生成,以及路径寻找

这几天刚刚学完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上,链接在这里

你可能感兴趣的:(随机迷宫的生成,以及路径寻找)