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的print用法示例
Feb 11 Python
python实现bitmap数据结构详解
Feb 17 Python
使用pyecharts无法import Bar的解决方案
Apr 23 Python
python 去除txt文本中的空格、数字、特定字母等方法
Jul 24 Python
Windows下Anaconda2安装NLTK教程
Sep 19 Python
python中break、continue 、exit() 、pass终止循环的区别详解
Jul 08 Python
在vscode中配置python环境过程解析
Sep 28 Python
Python实现中值滤波去噪方式
Dec 18 Python
Django 自定义404 500等错误页面的实现
Mar 08 Python
Python读取VOC中的xml目标框实例
Mar 10 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
Sep 29 Python
Python pathlib模块使用方法及实例解析
Oct 05 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 header Content-Type类型小结
2011/07/03 PHP
浅析PHP递归函数返回值使用方法
2013/02/18 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
Javascript读取cookie函数代码
2010/10/16 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
javascript实现图片循环渐显播放的方法
2015/02/24 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
JavaScript中Boolean对象的属性解析
2015/10/21 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
JavaScript来实现打开链接页面的简单实例
2016/06/02 Javascript
JS操作JSON方法总结(推荐)
2016/06/14 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
JS 终止执行的实现方法
2016/11/24 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
老生常谈jacascript DOM节点获取
2017/04/17 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
在vue项目创建的后初始化首次使用stylus安装方法分享
2018/01/25 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
angularjs通过过滤器返回超链接的方法
2018/10/26 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
如何在Shell脚本中使用函数
2015/09/06 面试题
房地产开盘策划方案
2014/02/10 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
图书馆标语
2014/06/19 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书