在线迷宫生成器 python_在Python/Pygame中创建迷宫,但不确定如何创建墙

以下是我所知道的两种最简单的筑墙方法。这两种方法都适用于图结构和图搜索算法,因此如果您愿意,可以在将来实现“路径查找”。这都是我的头顶,所以我很抱歉,如果有任何不清楚,但我也提供了相关文件的链接,你可以检查,如果你感到困惑。

方法一:瓷砖迷宫

这可能是在中生成地图的最简单方法,因为只需制作一个ASCII字符数组并用Python处理它们,就可以生成正方形的“wall”对象。

以这个网格为例:###########

# #

# ###### #

#S #F #

###########

“S”表示起点,“F”表示终点。是的,这可能是世界上最容易解决的“迷宫”,但这只是一个例子。假设我可怕的ASCII数组中的每个字符都代表一个大小为N x N的正方形平铺。空格表示平铺可以行走的字符,散列字符表示墙“35;”。

在这类游戏中,墙本身就是游戏实体。特别是在Pygame的上下文中,它们继承自Sprite class。Sprite类是表示实体的特殊类,或者基本上表示游戏中的现有对象。它们非常特别,因为它们可以代表障碍物、墙壁、地板、天花板、玩家、敌人,你可以命名它们。基本上,游戏中的每个对象都可以从Sprite类继承。

是什么让雪碧班如此特别?首先,你提到你在理解墙壁碰撞的概念上有困难。Pygame中的每个精灵都有自己的Rect attribute。rect属性基本上只是一个不可见的矩形,用于确定碰撞检测和绘制精灵等。根据定义,在纯平铺贴图中,实体之间的“碰撞”定义如下:如果两个实体的矩形彼此重叠,则两个实体发生碰撞。然后有一个Sprite类的方法叫做^{}。上面ASCII地图中的每面墙都有一个宽度、高度和位置,由它们在数组中的位置决定。因此,每个标签字符直接表示一个矩形,该矩形也是一个正方形,并且具有正方形的“表面”图像。

让你的玩家从精灵类继承,并把他放在一个精灵组,即“玩家组”。让你的墙实体从sprite类继承并将它们放在另一个sprite组中,称之为“障碍组”或类似的东西。然后,您只需在游戏循环的每一帧中调用^{},并使用它返回的字典来判断玩家是否与任何精灵碰撞。如果不清楚的话,我已经提供了文档的链接。阅读Pygame文档可能比我的答案更能帮助您理解这一点。

总之,你最终得到的是一本字典。我将直接引用文档来解释我的观点:groupcollide(group1, group2, dokill1, dokill2, collided = None) -> Sprite_dict

This will find collisions between all the Sprites in two groups. Collision is

determined by comparing the Sprite.rect attribute of each Sprite or by using the

collided function if it is not None.

Every Sprite inside group1 is added to the return dictionary. The value

for each item is the list of Sprites in group2 that intersect.

你可以在你的游戏循环的每个迭代中直接调用这个函数,在你更新玩家的动作之后,在你绘制你的所有实体之前,用玩家的组作为参数,障碍组作为参数。最后你会得到一本以下形式的字典:{player_in_group1: [] }

那你怎么处理这个名单呢?好吧,它建议您定义自己的本地函数(如果愿意,您也可以将其作为player类的方法)来处理这个问题。下面是我的高级伪代码实现,它与实际代码根本不接近:def handle_collisions(sprite_dict):

'''given sprite dict, moves all entities in group1 out of group2's

rectangle area'''

for p in sprite_dict:

for o in sprite_dict[p]:

# move p in such a way that its rectangle is no longer overlapping

# with the rectangle of o with the additional constraint that p must

# be moved **as minimally as possible.**

我不会为你实现这个功能,因为我觉得最好把挑战留给你。:)不过,我要警告你,逻辑并没有那么简单。

顺便说一句,这种迷宫/地图结构在很多流行的游戏中都有使用,包括塞尔达传奇、帕克曼、轰炸机侠、俄罗斯方块等等。除了你,我不可能把它们都命名为说到点子上。这是一个被证明的方法,因为它将自己无缝地集成到游戏设计中。但别相信我的话,这里有an entire website which explains why tile-based games are so powerful.

方法二:基于顶点边缘的迷宫

注意这个方法很难实现。它纯粹是Graph based.图中的每个空间都是一个节点,玩家可以遍历它。决定一个实体是否允许在两个节点之间移动(换句话说,基于限制的原则的冲突)的是,在底层无向(或有向,如果您愿意)图中,这两个节点之间是否存在边。

我不打算详细解释,因为一个答案很难涵盖。如果你想使用这种方法,你只需要做你自己的研究,但要记住这是很难的,因为Pygame实际上并不支持你的这种策略。如果你真的对此感兴趣,最好从Google开始。

就这样!尝试使用我给你的信息,如果你对此有任何问题,你可以在这里或在The GameDev StackExchange上问另一个问题。在将来当你问一个这样的问题时,试着确保它是一个特定的编程问题否则你很可能会得到很多反对票。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者写点废话哈: 1、先是看到手机上有个小游戏,填字游戏,横竖相连,像个迷宫 2、就用Delphi 做了个由 panel 数组 组成的迷宫都是方块,丑死了。 3、再查查网上有不少迷宫样式,其有的迷宫是单的,而且任意两处都是想通的。 4、再做了个四面都可打通的迷宫,甚至做了个斜线通道的。 5、觉得三角形迷宫更有挑战性,另外想试试以前学的数据结构指针、链表、树、连通图的知识是不是忘光了, 就做了个三角形迷宫,而且索性做成一个完善的 Delphi 控件,而且有不少属性。。。 6、有几个要解释下:1)迷宫是个连通图,每个正三角形与三个倒三角形相连,每个倒三角形与三个正三角形相连; 2)采用递归,从一个节点开始构造整个连通图;3)查找、遍历连通图时用外部二维数组标识来防止重复; 3)构造迷宫采用的是所谓 随机prim 算法;4)迷宫的宽与三角形边长、列数相互制约,迷宫的高由三角形的高 (正三角形的高通过边长计算的)与行数决定;5)使用指针时最容易丢掉 ^ 这个符号,例如某节点是 Pmm 指针型, 对其属性的引用就不能用 Pmm.Value 而必须用 Pmm^.Value ,机器编译时不会提示错误,但运行时老是出错! 6)绘图通过计算三角形的顶点坐标来构造;7)控件父类是 TGraphicControl ,试了好几种最后它最好, 要覆盖 paint 方法绘图;8)构造类时如 FGridWidth 的内部数据与属性 GridWidth 不要混淆使用, 记住 内部数据赋值,属性引用,属性(Published)是给运行期或者设计面板上别人使用的,内部数据是封装的; 9)发布自定义控件前先准备一个包含 类 一样名称的 ICO 的 DCR 文件,好像只有 Delphi7 里的 Image Editor 可以制作,这个工具包括两个文件 ImageEdit.exe 和 ImageD32.dll 两个文件 7、好像前后陆续花了近两个星期吧,终于基本完善了。该学点其他东西了 -- by chenxz
好的,我可以为您提供一些代码和思路。 首先,我们需要使用一个迷宫生成算法来创建一个迷宫。这里我们使用“递归分割”算法。该算法通过将迷宫递归地分成四个区域来创建迷宫。对于每个区域,我们随机选择一个并将其打开,以连接两个相邻的区域。 以下是一个示例实现: ```python import random def generate_maze(width, height): # Create grid maze = [[1] * width + [0] for _ in range(height)] + [[1] * (width + 1)] # Recursive division divide(maze, 0, 0, width, height) return maze def divide(maze, x, y, width, height): if width < 2 or height < 2: return # Choose orientation horizontal = random.choice([True, False]) # Create wall and opening wx = x + (0 if horizontal else random.randint(0, width - 2)) wy = y + (random.randint(0, height - 2) if horizontal else 0) px, py = wx + (horizontal), wy + (not horizontal) dx, dy = (1, 0) if horizontal else (0, 1) length = (height - 1) * horizontal + (width - 1) * (not horizontal) for i in range(length): if maze[wy][wx]: maze[py][px] = 0 wx += dx wy += dy px += dx py += dy # Recursive calls divide(maze, x, y, wx - x, wy - y) divide(maze, x, wy, wx - x, height - (wy - y)) divide(maze, wx, y, width - (wx - x), wy - y) divide(maze, wx, wy, width - (wx - x), height - (wy - y)) ``` 接下来,我们需要编写一个程序来解决迷宫。这里我们使用“深度优先搜索”算法。该算法从起点开始,不断选择一条未走过的路径,直到到达终点或无法继续前进。在此过程,我们需要记录所走过的路径,以便在绘制迷宫时使用。 以下是一个示例实现: ```python def solve_maze(maze, start, end): stack = [start] visited = set() path = {} while stack: x, y = stack.pop() if (x, y) == end: break if (x, y) in visited: continue visited.add((x, y)) for dx, dy in ((0, 1), (1, 0), (0, -1), (-1, 0)): nx, ny = x + dx, y + dy if maze[ny][nx] == 0 and (nx, ny) not in visited: stack.append((nx, ny)) path[(nx, ny)] = (x, y) # Reconstruct path x, y = end while (x, y) != start: maze[y][x] = 2 x, y = path[(x, y)] maze[y][x] = 2 ``` 最后,我们需要使用pygame库来绘制迷宫和解决方案。我们将使用黑色矩形表示壁,白色矩形表示通路,绿色矩形表示起点,红色矩形表示终点,蓝色矩形表示解决方案。 以下是一个示例实现: ```python import pygame WIDTH, HEIGHT = 800, 600 CELL_SIZE = 20 maze = generate_maze(WIDTH // CELL_SIZE, HEIGHT // CELL_SIZE) solve_maze(maze, (0, 0), (len(maze[0]) - 1, len(maze) - 1)) pygame.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) clock = pygame.time.Clock() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() screen.fill((255, 255, 255)) for y, row in enumerate(maze): for x, cell in enumerate(row): rect = pygame.Rect(x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE) if cell == 1: pygame.draw.rect(screen, (0, 0, 0), rect) elif cell == 2: pygame.draw.rect(screen, (0, 0, 255), rect) pygame.draw.rect(screen, (0, 255, 0), pygame.Rect(0, 0, CELL_SIZE, CELL_SIZE)) pygame.draw.rect(screen, (255, 0, 0), pygame.Rect(len(maze[0]) * CELL_SIZE - CELL_SIZE, len(maze) * CELL_SIZE - CELL_SIZE, CELL_SIZE, CELL_SIZE)) pygame.display.update() clock.tick(60) ``` 这个程序将生成一个随机的迷宫,然后使用深度优先搜索算法找到从左上角到右下角的最短路径,并用pygame库在屏幕上绘制迷宫和解决方案。 希望这可以帮助您实现您的项目!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值