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 cookielib 登录人人网的实现代码
Dec 19 Python
php使用递归与迭代实现快速排序示例
Jan 23 Python
python 文件操作删除某行的实例
Sep 04 Python
高质量Python代码编写的5个优化技巧
Nov 16 Python
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 Python
Python爬虫框架scrapy实现的文件下载功能示例
Aug 04 Python
python实现狄克斯特拉算法
Jan 17 Python
python每天定时运行某程序代码
Aug 16 Python
Python 安装 virturalenv 虚拟环境的教程详解
Feb 21 Python
使用Django的JsonResponse返回数据的实现
Jan 15 Python
Python实现我的世界小游戏源代码
Mar 02 Python
python 爬取京东指定商品评论并进行情感分析
May 27 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定时执行任务设置详解
2015/02/06 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
2016/12/31 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
react-native之ART绘图方法详解
2017/08/08 Javascript
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
JavaScript实现与web通信的方法详解
2020/08/07 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
详解js创建对象的几种方式和对象方法
2021/03/01 Javascript
Python模块的加载讲解
2019/01/15 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
Python分布式进程中你会遇到的问题解析
2019/05/28 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
Django中create和save方法的不同
2019/08/13 Python
python应用文件读取与登录注册功能
2019/09/23 Python
Python MySQL 日期时间格式化作为参数的操作
2020/03/02 Python
Python如何省略括号方法详解
2020/03/21 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
2020/05/27 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
2020/06/04 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
Python 如何对文件目录操作
2020/07/10 Python
Python脚本调试工具安装过程
2021/01/11 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
全球性的奢侈品梦工厂:Forzieri(福喜利)
2019/02/20 全球购物
自我评价200字分享
2013/12/17 职场文书
喜之郎果冻广告词
2014/03/20 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
在虚拟机中安装windows server 2008的图文教程
2022/06/28 Servers