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

方法一:瓷砖迷宫

这可能是在中生成地图的最简单方法,因为只需制作一个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上问另一个问题。在将来当你问一个这样的问题时,试着确保它是一个特定的编程问题否则你很可能会得到很多反对票。

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

  1. geany配置python_在python虚拟环境中使用geany

    首先创建一个位于venv文件夹中的项目文件.然后,使用构建配置功能指向位于venv文件夹中的Python解释器.这些操作将使您能够为创建的每个虚拟环境运行正确的Python解释器,而不会影响其他虚拟环 ...

  2. defaultdict python_理解 Python 语言中的 defaultdict

    原作者: Jason Kirtland 日期: January 13th, 2009 许可证: Creative Commons Attribution-Share Alike 3.0 原文链接(PP ...

  3. python pygame模块按键延迟_如何在python/pygame中延迟一件事情而不延迟其他事情?...

    最简单的方法是使用事件(无论如何都要检查事件)import pygame pygame.init() screen = pygame.display.set_mode((200, 200)) # ou ...

  4. pycharm引用python_在Python/Pycharm中找不到引用“xxx”

    我在Pycharm有一个项目组织如下:-- Sources |--__init__.py |--Calculators |--__init__.py |--Filters.py |--Controll ...

  5. 公众号 自动生成海报 python_用python一键生成一张全部微信好友的头像墙

    前言 用 python 代码写了一个一键生成合成微信好友头像的程序,效果如下: 不会写代码?没关系!只要你会使用电脑就 ok! 因为除了用代码方式生成外,还建了一个 .exe 的程序,在电脑点击运行就 ...

  6. python3在线-Python 3中的新功能

    教 程 目 录 __future__模块 Python 3.x介绍了一些Python 2不兼容的关键字和功能,可以通过Python 2中内置的__future__模块导入 .如果您计划对代码进行Pyt ...

  7. 站长在线Python精讲:在Python函数中的默认参数详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中的默认参数详解>.本文的主要内容有:默认参数的概念和默认参数的示例.默认参数不能设置可变对象. 目录 1 ...

  8. 站长在线Python精讲:在Python函数中理解形式参数和实际参数

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中理解形式参数和实际参数>.本文的主要内容有:Python中形式参数的概念和特点,Python中实际参数的 ...

  9. 站长在线Python精讲:在Python函数中参数传递的位置参数详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中参数传递的位置参数详解>.本文的主要内容有:实参和形参数量必须与定义时一致和实参和形参位置必须与定义时一 ...

最新文章

  1. 【救援过程】升级openssl导致libcrypto.so.1.1动态库不可用
  2. BZOJ 2140 稳定婚姻(强联通分量判环)【BZOJ修复工程】
  3. 【杂谈】Oracle里scott的由来
  4. lustre1.6.5+drbd主备切换
  5. 基于java的作业管理系统_基于java的作业管理系统
  6. 重拾强化学习的核心概念_强化学习的核心概念
  7. php中的控制器是什么意思,理解PHP中的MVC编程之控制器_php
  8. joomla tab 扩展_如何使用扩展功能扩展Joomla网站的功能
  9. java调用方法出现i 2a_性能-Java方法调用与使用变量
  10. SLAM 领域国内外优秀实验室/开源方案(汇总)
  11. [插件使用] SwitchHosts自动更新Github Hosts文件
  12. 怎么查看自己微信支付宝绑定银行卡号
  13. 给一段下雪的代码。。。
  14. MOS管损坏典型问题分析
  15. 一道关于扔球/扔鸡蛋/摔手机的DP问题(蓝桥杯题目/面试题)
  16. ROS话题通信自定义msg实现发送接收(六)c++、python
  17. gRPC 一揽子方案
  18. [渝粤教育] 中国地质大学 高等数学(二) 复习题
  19. Android 设置应用的底部导航栏(虚拟按键)背景颜色
  20. 怎样在Word 2010文档中选择纵向或横向

热门文章

  1. Spring MVC数据验证
  2. Struts2学习 表单校验——XML校验规则文件
  3. shell 编程条件语句实验
  4. 2.Switch语句的参数类型
  5. k8s使用EFK实现日志采集存储展示
  6. 物联网控制期末复习5:模糊控制
  7. iOS-iOS下的Masonry适配
  8. html游戏代码怎么写,HTML游戏的编写,代码的意思已经写上,请大佬们指导
  9. ES6中的Promis的使用方法
  10. 解决打印页面el-table打印不全问题