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中用max()方法求最大值的介绍
May 15 Python
python判断字符串编码的简单实现方法(使用chardet)
Jul 01 Python
python距离测量的方法
Mar 06 Python
深入浅析Python传值与传址
Jul 10 Python
Python 3 判断2个字典相同
Aug 06 Python
python实现七段数码管和倒计时效果
Nov 23 Python
opencv-python 提取sift特征并匹配的实例
Dec 09 Python
Python pandas库中的isnull()详解
Dec 26 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
Feb 12 Python
解决TensorFlow程序无限制占用GPU的方法
Jun 30 Python
Python OpenCV读取中文路径图像的方法
Jul 02 Python
python 实现socket服务端并发的四种方式
Dec 14 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
在字符串中把网址改成超级链接
2006/10/09 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
PHP文件操作方法汇总
2015/07/01 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
JS特效实现图片自动播放并可控的效果
2015/07/31 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
jquery ui sortable拖拽后保存位置
2017/04/27 jQuery
js定时器实现倒计时效果
2017/11/05 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
Vue中对拿到的数据进行A-Z排序的实例
2018/09/25 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
python实现外卖信息管理系统
2018/01/11 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
Python Opencv实现图像轮廓识别功能
2020/03/23 Python
在python中做正态性检验示例
2019/12/09 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
使用PyOpenGL绘制三维坐标系实例
2019/12/24 Python
Python3 assert断言实现原理解析
2020/03/02 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
django-csrf使用和禁用方式
2020/03/13 Python
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
Speedo速比涛德国官方网站:世界领先的泳装品牌
2019/08/26 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
医院见习报告范文
2014/11/03 职场文书
2014年初级职称工作总结
2014/12/08 职场文书
初中班级口号霸气押韵
2015/12/24 职场文书
《揠苗助长》教学反思
2016/02/20 职场文书
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js