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中变量赋值的问题
Jan 12 Python
Python爬虫利用cookie实现模拟登陆实例详解
Jan 12 Python
使用Flask集成bootstrap的方法
Jul 24 Python
用python实现k近邻算法的示例代码
Sep 06 Python
numpy中的ndarray方法和属性详解
May 27 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
Django 设置多环境配置文件载入问题
Feb 25 Python
pycharm实现print输出保存到txt文件
Jun 01 Python
Python中zip函数如何使用
Jun 04 Python
python中openpyxl和xlsxwriter对Excel的操作方法
Mar 01 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
Mar 03 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
珊瑚虫IP库浅析
2007/02/15 PHP
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
2007/05/03 PHP
php设计模式 Template (模板模式)
2011/06/26 PHP
从手册去理解分析PHP session机制
2011/07/17 PHP
探讨多键值cookie(php中cookie存取数组)的详解
2013/06/06 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
HTML中事件触发列表与解说
2007/07/09 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
浅析JS抽象工厂模式
2017/12/14 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
python调用百度语音REST API
2018/08/30 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
Python中字符串与编码示例代码
2019/05/20 Python
python和php学习哪个更有发展
2020/06/17 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
django rest framework使用django-filter用法
2020/07/15 Python
python使用ctypes库调用DLL动态链接库
2020/10/22 Python
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
印尼网上商店:Alfacart.com
2019/03/11 全球购物
美国正宗设计师眼镜在线零售商:EYEZZ
2019/03/23 全球购物
酒店实习个人鉴定
2013/12/07 职场文书
职称评定自我鉴定
2014/03/18 职场文书
幼儿教师求职信
2014/05/24 职场文书
社区科普工作方案
2014/06/03 职场文书
观看信仰心得体会
2014/09/04 职场文书
甲乙双方合作协议书
2014/10/13 职场文书