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正则表达式 re模块使用说明
May 19 Python
Python对小数进行除法运算的正确方法示例
Aug 25 Python
python自动格式化json文件的方法
Mar 11 Python
在Python中使用poplib模块收取邮件的教程
Apr 29 Python
在Python程序中操作文件之isatty()方法的使用教程
May 24 Python
python 排序算法总结及实例详解
Sep 28 Python
Django自定义过滤器定义与用法示例
Mar 22 Python
Python单元测试简单示例
Jul 03 Python
python 输入一个数n,求n个数求乘或求和的实例
Nov 13 Python
python3通过qq邮箱发送邮件以及附件
May 20 Python
python 实现图片修复(可用于去水印)
Nov 19 Python
如何利用python正则表达式匹配版本信息
Dec 09 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
2020年4月放送!《Princess Connect Re:Dive》制作组 & 角色声优公开!
2020/03/06 日漫
linux下为php添加curl扩展的方法
2011/07/29 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
js 巧妙去除数组中的重复项
2010/01/25 Javascript
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
javascript常用对话框小集
2013/09/13 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
js纯数字逐一停止显示效果的实现代码
2016/03/16 Javascript
JS组件Bootstrap实现图片轮播效果
2016/05/16 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
2016/08/02 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
domReady的实现案例
2016/11/23 Javascript
jquery实现百叶窗效果
2017/01/12 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
Node.JS用纯JavaScript生成图片或滑块式验证码功能
2019/09/12 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
Python pickle模块用法实例分析
2015/05/27 Python
tensorflow实现softma识别MNIST
2018/03/12 Python
Python实现多线程的两种方式分析
2018/08/29 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
OnePlus加拿大官网:中国国际化手机品牌
2020/10/13 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
理工科学生的自我评价
2013/12/15 职场文书
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
陈欧广告词
2014/03/14 职场文书
委托书的样本
2015/01/28 职场文书
人事局接收函
2015/01/31 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
MySQL七种JOIN类型小结
2021/10/24 MySQL
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python