python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
作者:junjie 发布时间:2022-01-01 08:19:10
标签:python,迷宫算法
完整代码下载:http://xiazai.jb51.net/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版在生成迷宫的过程中增加了随机处理,对应算法也稍微复杂一点点。


猜你喜欢
- argparse1import argparseimport sysFLAGS = Nonedef main(): print(
- 准备软件版本Django2.1.3Python3.7.1默认使用的是sqlite3DATABASES = { 'def
- 在开始编写应用之前,我们先从最基本的程序开始。就像你造房子之前不知道什么是地基一样,编写程序也不知道如何开始。因此,在本节中,我们要学习用最
- 1. File->Setting 打开如下所示的对话框,可以在Editor->General->Font下设置
- 这篇文章主要介绍了python异常处理try except过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 代码如下:--代码一DECLARE @cc INT SELECT NewsId,ROW_NUMBER() OVER(ORDER
- 本文实例讲述了Oracle删除死锁进程的方法。分享给大家供大家参考。具体如下:步骤1:用以下SQL查看进程列表,判断出被锁定的表SELECT
- 前言因为工作中经常用到这些方法,所有便把这些方法进行了总结。JavaScript 1. type 类型判断isString (o) { //
- 今天打算通过绘制正弦和余弦函数,从默认的设置开始,一步一步地调整改进,让它变得好看,变成我们初高中学习过的图象那样。通过这个过程来学习如何进
- 本文分别介绍了安装python2和python3的详细方法,分享给大家。一、Windows系统很多童鞋问之前的教程怎么没有介绍安装pytho
- 这是Pyhon系列文章的第二篇,本文主要介绍如何运行Python程序以及安装PyCharm开发工具。干货满满,建议收藏,需要用到时常看看。
- 我们知道SQLSERVER的数据行的存储有两种数据结构:A: 堆 B :B树(binary 二叉树)数据按照这种两种
- logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等。其主
- 如果你想开始学习GO语法前,请先背熟下述4点:1. 环境变量:使用go env查看环境变量GOARCH/GOHOSTARCH: 体系架构,
- 概述OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界.梯度运算梯度:
- 自我描述的语句指这样一种语句:它的内容就是对它本身的描述。(废话……)比如下面这句句子:这是一段自我描述的语句,除了标点符号外,它共包含12
- 现状≠将来?程序员做设计本身就很悲哀,纠结于客户与坚持之间就更是如此。无论我今后的路会怎么走,我想始终不变的事情就是与客户博弈了。无论是放弃
- 其实图像识别技术与我们平时做的密码验证之类的没有什么区别,都是事先把要校验的数据入库,然后使用时将录入(识别)的数据与库中的数据做对比,只不
- TNS简要介绍与应用 Oracle中TNS的完整定义:transparence Network Substrate透明网络底层,监听服务是它
- 关于oracle 优化的内容很多,概念庞杂,不过可以总结出一个大纲性的东西作为需要考虑的方向,然后再逐步细化。oracle优化按重要性需要考