如何通过 while/for 循环创建类的许多精确实例(以访问其属性)?

2024-04-15

我正在尝试使用 pygame 制作 atari 突破风格游戏,并且我希望可破坏的块是具有某些属性的对象,我可以随着游戏的进行而更改这些属性。 因此,我创建了一个“Block”类和一个后续函数,该函数多次循环遍历该类,将实例分配给列表。 我遇到的问题是,我没有为每个对象提供不同的“名称”,因此很难访问它们各自的属性。

这是一个例子:

class Block:
    def __init__(self):
        self.brick = pygame.sprite.Sprite()
        pygame.sprite.Sprite.__init__(self.brick)
        self.brick.image = pygame.Surface([width, height])
        self.brick.image.fill(RED)
        self.brick.rect = self.brick.image.get_rect()
    def blockType (self, hardness):
        self.hardness = hardness  

def lay ():
    layoutm = []
    for x in range (0, 5):
        layoutl = []
        for y in range (0, 12):
            layoutl.append (Block())
        layoutm.append (layoutl)
    return layoutm  

layoutm=lay()

horIndex = -1
for x in range(20, 195, 35):
    horIndex += 1
    verIndex = -1
    for y in range (20, 660, 55):
        verIndex += 1
        #set_trace ()
        brick = (layoutm[horIndex][verIndex]).brick
        brick.rect.topleft = (y,x)
        block_list.add(brick)
        list_of_sprites.add(brick)

你们中的一些人可能会指出,我可以简单地继承pygame.sprite.Sprite()父类,这可能是一个解决方案(可能有太多属性或其他东西),但由于某种原因,这对我不起作用。

之后的一切layoutm=lay()是各个块的位置代码,我包含它的唯一原因是为了显示我计划如何访问每个各自的 self.brick 的位置属性。可能不是最好的方法,但是构造函数之后的所有方法对于我打算添加到游戏中的功能都是必需的(这就是为什么我留在 blockType () 中以简化问题)。

我的问题基本上是我是否总是必须使用后面的代码set_trace()(这是运行调试器的命令pudb)是否访问这些单独的实例。

仅供参考:我浏览所有这些内容的原因是因为我计划列出一些清单,例如

level_1 = [  
[1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1]] 

level_2 = [
[0,1,1,2,2,3,3,2,2,1,1,0],
[1,1,2,2,3,3,3,3,2,2,1,1],
[1,2,2,3,3,4,4,3,3,2,2,1],
[1,1,2,2,3,3,3,3,2,2,1,1],
[0,1,1,2,2,3,3,2,2,1,1,0]]

代表关卡布局来说明哪种类型的块是(当然,代码将被修改以使其工作。

另外,我的术语有时可能是错误的(我用法语上这门课),例如令人困惑的实例与对象(我称它们相同,但它们可能不是),所以如果有不清楚的地方,请随时问我。


你的例子似乎发生了很多事情,所以我将向你展示我将如何组织它。我对 PyGame 的经验很少,所以我会将 Brick 类的提示留给其他人,但我会尽力帮助您存储 Brick。

这就是我的定义lay:

def lay():
    return [[Brick() for y in range(12)] for x in range(5)]
layoutm = lay()

这个构造被称为列表理解 https://docs.python.org/3.4/tutorial/datastructures.html#list-comprehensions。它比使用“for”和“append”更快,而且我认为它看起来更清晰。它将创建一个包含 5 个列表的列表,这些列表将代表行。每行将包含 12 块砖块。

现在要处理创建后编辑砖块的属性:

for (row, y) in zip(layoutm, range(20, 195, 35)):
    for (brick, x) in zip(row, range(20, 660, 55)):
        brickSprite = brick.brick
        brickSprite.rect.topleft = (y, x)

这个有点复杂。首先,Python 允许您迭代任何可迭代对象中的对象,如下所示:

for num in [0, 1, 2]:
    print(num)

这将打印出值 0、1 和 2。现在,zip是一个函数,它接受两个可迭代对象,并返回一个包含对象对的可迭代对象。例如:

for num_name in zip([0, 1, 2], ["zero", "one", "two"]:
    print(num_name)

这将打印值(0,“零”)、(1,“一”)和(2,“二”)。现在回到我的代码片段:首先,外部循环将迭代每一行及其 y 坐标。然后,内部循环将迭代该行中的每个砖块及其 x 坐标。之后我们就可以对砖块进行操作了。

请注意,我没有在 for 循环中构建 block_list 和 list_of_sprites。我会用另一个来做到这一点列表理解 https://docs.python.org/3.4/tutorial/datastructures.html#list-comprehensions:

block_list      = [brick       for row in layoutm for brick in row]
list_of_sprites = [brick.brick for brick in block_list]

block_list 现在应该包含布局列表中的每个 Brick,并且 list_of_sprites 应包含与每个 Brick 对应的 Sprite。如果您决定将 Brick 子类化为 Sprite 类,那么您可以相应地更改它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 while/for 循环创建类的许多精确实例(以访问其属性)? 的相关文章

  • python 使用 shapefile 掩码 netcdf 数据

    我正在使用以下软件包 import pandas as pd import numpy as np import xarray as xr import geopandas as gpd 我有以下存储数据的对象 print precip d
  • Python:“取消导入”、“重新导入”、“重置导入”?

    我调试 在 PyCharm 中 一个脚本 我在断点处停止 然后转到调试控制台窗口 然后从那里调用导入行 如下所示 import my util1 from my utils 然后我调用 my util1 到目前为止 一切都还好 然后我更改
  • 是否存在应明确跟踪或忽略的事件?

    在做研究解决问题的同时如何在处理程序之后自动重新引发异常 https stackoverflow com q 56084252 216356 开发了一个异常类 具有在处理后自动再次抛出自身的能力 受到ThreadAbortException
  • Kivy pygame错误

    我一直在尝试让 Kivy 在我的 Mac Lion 上运行 但遇到了问题 我按照 Kivy 网站上的说明进行操作 由于 Kivy 1 8 支持 Python 3 所以我想使用 3 3 运行它 最后通过编辑 kivy 文件以指向 3 3 而不
  • 如何使用方法更改类属性?

    我有一个 Django 模型类 它有一些默认属性 我想更改complete通过调用函数来改变变量 class Foo complete False def set complete true complete True 但打电话后set c
  • 将 numpy 数组中低于阈值 # 的数字替换为零

    所以我有一个非常大的 Numpy 数组 2560x1920 它实际上来自灰度图片 其中每个像素都被赋予一个 0 1 之间的数字 表示其亮度 我试图用零替换低于阈值 例如 0 5 的所有值 这可能是一个简单的任务 但我是 Numpy 的初学者
  • pyqt5调用url时处于无响应状态

    我刚刚在 pyqt 中实现了登录 但在调用 url 和获取响应之间 qt 窗口显示无响应状态 谁能建议我如何避免不响应状态 code class Login QDialog def init self height width parent
  • 如何动态构造方法?

    我设计了一个类 它非常标准 具有一些方法属性 class foo def f1 self print f1 def f2 self print f2 def fn self print fn 现在我想创建一个包含一组 foo 实例的类 cl
  • 在Python子目录中创建文件?

    在我的 Python 脚本中 我需要在子目录中创建一个新文件而不更改目录 并且需要从当前目录不断编辑该文件 My code os mkdir datetime dst for ip in open list txt with open ip
  • Python - 重写 print()

    我正在使用 mod wsgi 想知道是否可以覆盖 print 命令 因为它没用 这样做是行不通的 print myPrintFunction 因为这是一个语法错误 Print 不是 Python 2 x 中的函数 因此这不能直接实现 但是
  • 初始化父类时如何返回子类的新实例?

    给定一个类层次结构如下 class A def initialize param if param 1 then initialize and return instance of B else initialize and return
  • 为什么找不到ImageView类?

    当我转到图形布局时 我在创建第一个 Android 应用程序 pdf Android Application Development for For Dummies 中的静默切换模式 时遇到了麻烦 在 main xml 文件中插入了 Ima
  • Actionscript 对象的属性数量

    如何获取通用 Actionscript 对象中的属性数量 如数组长度 您必须循环所有元素才能对它们进行计数 function objectLength myObject Object int var cnt int 0 for var s
  • 计算一个类的实例?

    我一直在清理我正在扩展的模块中的一些代码 但我似乎找不到 Pythonify 这段代码的方法 global next id 1 class Obj def init self global global next id self id gl
  • 从“stdin”读取文件后如何使用“input()”?

    Context 我想要一个简单的脚本 它可以选择多个管道输入中的一个 而不需要EOF when reading a lineUnix Linux 上的错误 它试图 接受多行管道文本 等待用户选择一个选项 将该选项打印到标准输出 所需用途 p
  • 猴子修补@property

    是否有可能对 a 的值进行猴子修补 property我无法控制的类的实例 class Foo property def bar self return here be dragons f Foo print f bar baz f bar
  • python/pandas - 将列标题转换为索引

    我必须处理的数据将每小时数据视为列 我想将其转换为索引 示例如下所示 year month day 1 2 3 4 5 24 2015 1 1 a b c 2015 1 2 d e f 2015 1 3 g h i 我想让输出文件像这样 y
  • 什么时候会在 dict 上使用键值对作为 dict.update 方法?

    我注意到你可以做两件事来更新字典 并且它们似乎有相同的结果 a a update foo 1 a a update foo 1 两者都会产生如下所示的字典结果 foo 1 是否有任何理由更喜欢使用字典或键 值对作为更新方法 它们在功能上是否
  • django 2.0 中的错误 404 静态文件

    我试图在 django 2 0 中找到我的所有静态文件 但是当我只运行服务器时 我收到 404 错误 这是我的设置代码 STATIC URL static STATIC ROOT var www example com static STA
  • AttributeError:“MainRouter”对象没有属性“_disabled_count”

    我正在创建一个 kivy 应用程序 其中我使用了显示此错误的路由器 AttributeError MainRouter 对象没有属性 disabled count 有什么解决办法吗 我也得到了这个 但使用 super 修复了它 使用以下命令

随机推荐