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性能优化的20条建议
Oct 25 Python
python实现备份目录的方法
Aug 03 Python
python调用百度REST API实现语音识别
Aug 30 Python
在python 不同时区之间的差值与转换方法
Jan 14 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
Jun 14 Python
分析运行中的 Python 进程详细解析
Jun 22 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
python开启debug模式的方法
Jun 27 Python
python、Matlab求定积分的实现
Nov 20 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
Mar 24 Python
用python写一个带有gui界面的密码生成器
Nov 06 Python
Python FuzzyWuzzy实现模糊匹配
Apr 28 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/08/08 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
从面试题学习Javascript 面向对象(创建对象)
2012/03/30 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
详细解读JavaScript的跨浏览器事件处理
2015/08/12 Javascript
理解javascript中try...catch...finally
2015/12/25 Javascript
js表单验证实例讲解
2016/03/31 Javascript
JQuery遍历元素的后代和同胞实现方法
2016/09/18 Javascript
详解JavaScript跨域总结与解决办法
2016/10/31 Javascript
详解堆的javascript实现方法
2016/11/29 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
vue npm install 安装某个指定的版本操作
2020/08/11 Javascript
Python学习笔记_数据排序方法
2014/05/22 Python
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
西安众合通用.net笔试题
2013/03/18 面试题
大学生职业生涯规划书前言
2014/01/09 职场文书
班级活动策划书
2014/02/06 职场文书
关于运动会广播稿50字
2014/10/18 职场文书
学生上课说话检讨书
2014/10/25 职场文书
颐和园导游词
2015/01/30 职场文书
叶问观后感
2015/06/15 职场文书
葬礼主持词
2015/07/02 职场文书
会议承办单位欢迎词
2019/07/09 职场文书
全网非常详细的pytest配置文件
2022/07/15 Python