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 相关文章推荐
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
详解Python中的正则表达式的用法
Apr 09 Python
Python函数式编程指南(三):迭代器详解
Jun 24 Python
tensorflow 加载部分变量的实例讲解
Jul 27 Python
python调用支付宝支付接口流程
Aug 15 Python
使用python实现离散时间傅里叶变换的方法
Sep 02 Python
基于python的列表list和集合set操作
Nov 24 Python
手动安装python3.6的操作过程详解
Jan 13 Python
Python 实现一行输入多个数字(用空格隔开)
Apr 29 Python
使用Keras中的ImageDataGenerator进行批次读图方式
Jun 17 Python
理解python中装饰器的作用
Jul 21 Python
Python语言中的数据类型-序列
Feb 24 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连接Oracle for NT 远程数据库
2006/10/09 PHP
php生成随机数的三种方法
2014/09/10 PHP
php自动更新版权信息显示的方法
2015/06/19 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
PHP使用PDO访问oracle数据库的步骤详解
2017/09/29 PHP
javascript 关闭IE6、IE7
2009/06/01 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
Javascript 跨域知识详细介绍
2016/10/30 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
2017/06/09 jQuery
微信小程序 POST请求的实例详解
2017/09/29 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
JavaScript字符串转数字的简单实现方法
2020/11/27 Javascript
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
在Python中移动目录结构的方法
2016/01/31 Python
python中日志logging模块的性能及多进程详解
2017/07/18 Python
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
利用python 下载bilibili视频
2020/11/13 Python
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
职专应届生求职信
2013/11/16 职场文书
应届生如何写自荐信
2014/01/05 职场文书
项目委托协议书(最新)
2014/09/13 职场文书
员工工作自我评价
2014/09/26 职场文书
经典爱情感言
2015/08/03 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python
在Python 中将类对象序列化为JSON
2022/04/06 Python
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技