python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)


Posted in Python onJuly 11, 2014

完整代码下载:http://xiazai.3water.com/201407/tools/python-migong.rar

最近研究了下迷宫的生成算法,然后做了个简单的在线迷宫游戏。游戏地址和对应的开源项目地址可以通过上面的链接找到。开源项目中没有包含服务端的代码,因为服务端的代码实在太简单了。下面将简单的介绍下随机迷宫的生成算法。一旦理解后你会发现这个算法到底有多简单。

1.将迷宫地图分成多个房间,每个房间都有四面墙。
2.让“人”从地图任意一点A出发,开始在迷宫里游荡。从A房间的1/2/3/4个方向中的任选一个方向前进。在从A房间走到B房间的过程中,推倒A/B房间之间的墙。
3.如果方向x对面的房间已经走过,则选择其他方向。如果所有方向的房间都已经走过,则退回上一个房间看是否还有可选道路。
4.走到真正无路可走时,说明已经走过了所有房间,迷宫也生成好了。

下面是该算法的python实现(核心部分)

def gen_map(self, max_x=10, max_y=10):
 """ 生成迷宫 """
 self.max_x, self.max_y = max_x, max_y # 设置地图大小
 self.mmap = [[None for j in range(self.max_y)] for i in range(self.max_x)] # 生成原始地图
 self.solution = [] # 迷宫解法
 block_stack = [Block(self, 0, 0)] # 从0,0开始生成迷宫(同时将这点作为起点),将起点放到栈里
 while block_stack:
  block = block_stack.pop() #取出当前所在的房间
  next_block = block.get_next_block() # 获取下一个要去的房间
  if next_block: # 如果成功获取下一走发,将走过的房间放回到栈里
   block_stack.append(block)
   block_stack.append(next_block)
   if next_block.x == self.max_x - 1 and next_block.y == self.max_y - 1: # 走到终点了,栈里的路径就是解法
    for o in block_stack:
     self.solution.append((o.x, o.y))
 
def get_next_block_pos(self, direction):
 """ 获取指定方向的房间号 """
 x = self.x
 y = self.y
 if direction == 0: # Top
  y -= 1
 elif direction == 1: # Right
  x += 1
 if direction == 2: # Bottom
  y += 1
 if direction == 3: # Left
  x -= 1
 return x, y
 
def get_next_block(self):
 """ 获取下一要去的房间 """
 directions = list(range(4))
 random.shuffle(directions) # 随机获取一个要去的方向
 for direction in directions:
  x, y = self.get_next_block_pos(direction)
  if x >= self.mmap.max_x or x < 0 or y >= self.mmap.max_y or y < 0: # 房间号在许可范围内
   continue
  if self.mmap.mmap[x][y]: # 如果已经走过
   continue
  self.walls[direction] = False
  return Block(self.mmap, x, y, direction)
 return None # 没找到有可用的房间

注: 由于采用该方法生成的迷宫道路的分支数量并不是太多,coffeescript版在生成迷宫的过程中增加了随机处理,对应算法也稍微复杂一点点。

Python 相关文章推荐
python使用append合并两个数组的方法
Apr 28 Python
详解Python中heapq模块的用法
Jun 28 Python
总结用Pdb库调试Python的方式及常用的命令
Aug 18 Python
python3+PyQt5自定义视图详解
Apr 24 Python
django如何连接已存在数据的数据库
Aug 14 Python
Python设计模式之原型模式实例详解
Jan 18 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
Aug 28 Python
python实现获取单向链表倒数第k个结点的值示例
Oct 24 Python
Windows下实现将Pascal VOC转化为TFRecords
Feb 17 Python
Python虚拟环境virtualenv创建及使用过程图解
Dec 08 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 Python
python 对图片进行简单的处理
Jun 23 Python
python文件和目录操作函数小结
Jul 11 #Python
python实现的登陆Discuz!论坛通用代码分享
Jul 11 #Python
Python Socket编程入门教程
Jul 11 #Python
python使用正则搜索字符串或文件中的浮点数代码实例
Jul 11 #Python
Python实现的二维码生成小软件
Jul 11 #Python
让python同时兼容python2和python3的8个技巧分享
Jul 11 #Python
Python操作SQLite简明教程
Jul 10 #Python
You might like
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
php array_map使用自定义的函数处理数组中的每个值
2016/10/26 PHP
PHP编程实现阳历转换为阴历的方法实例
2017/08/08 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
innerHTML 和 getElementsByName 在IE下面的bug 的解决
2010/04/09 Javascript
潜说js对象和数组
2011/05/25 Javascript
jquery插件制作 提示框插件实现代码
2012/08/17 Javascript
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
JavaScript判断一个字符串是否包含指定子字符串的方法
2015/03/18 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
JavaScript面向对象编写购物车功能
2016/08/19 Javascript
移动端js图片查看器
2016/11/17 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
原生JavaScript实现remove()和recover()功能示例
2018/07/24 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
2020/03/08 Javascript
Python语言技巧之三元运算符使用介绍
2013/03/04 Python
Python中强大的命令行库click入门教程
2016/12/26 Python
python2.6.6如何升级到python2.7.14
2018/04/08 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
Python datetime模块的使用示例
2021/02/02 Python
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
法国最大的在线眼镜店:EasyLunettes
2019/08/26 全球购物
美国爆米花工厂:The Popcorn Factory
2019/09/14 全球购物
精彩自我鉴定
2014/01/16 职场文书
保卫科工作岗位职责
2014/03/01 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
预备党员公开承诺书
2014/05/28 职场文书
教师求职自荐书
2014/06/14 职场文书
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python
生命的关键成分来自太空?陨石说是的
2022/04/29 数码科技