python - add() 不会将类的实例添加到组中,因为它不可迭代,但它正在迭代

2023-12-10

我学习 Python 一段时间了,并且正在阅读 Python 速成课程教科书,以防万一您可能熟悉该文本中的练习。

第一个项目是《太空入侵者》的克隆版,到目前为止一直运行顺利。当我将外星人绘制到屏幕上时,我有一些代码可以检查窗口尺寸并将其与外星人和飞船的尺寸进行比较,以计算每行上应该出现多少个外星人以及可以有多少行是。据我所知,这也运行良好。

当我调用 create_fleet 函数时出现错误。创建舰队与几个函数一起工作,其中一个创建外星人的实例并使用 add() 函数将其添加到组中。这是代码和回溯。

def get_number_rows(settings, ship_height, alien_height):
    available_space_y = (settings.screen_height - (3 * alien_height) - ship_height)
    number_rows = int(available_space_y / (2 * alien_height))
    return number_rows

def get_number_aliens_x(settings, alien_width):
    available_space_x = settings.screen_width - (alien_width * 2)
    number_aliens_x = int(available_space_x / (alien_width * 2))
    return number_aliens_x

def create_alien(settings, screen, aliens, alien_number, row_number):
    alien = Alien(settings, screen)
    alien_width = alien.rect.width
    alien.x = alien_width + 2 * alien_width * alien_number
    alien.rect.x = alien.x
    alien.rect.y = alien.rect.height + 2 * alien.rect.height + row_number
    aliens.add(alien)                                                   <-- Error refrenced here

def create_fleet(settings, screen, ship, aliens):
    alien = Alien(settings, screen)
    number_aliens_x = get_number_aliens_x(settings, alien.rect.width)
    number_rows = get_number_rows(settings, ship.rect.height, alien.rect.height)
    for row_number in range(number_rows):
        for alien_number in range(number_aliens_x):
            alien = Alien(settings, screen)
            create_alien(settings, screen, alien, alien_number, row_number) <-- In a loop 
Traceback (most recent call last):
  File "/Users/me/Desktop/Coding_Projects/Python_Space_Invaders/space_invaders.py", line 35, in <module>
    run_game()
  File "/Users/me/Desktop/Coding_Projects/Python_Space_Invaders/space_invaders.py", line 26, in run_game
    gf.create_fleet(settings, screen, ship, aliens)
  File "/Users/me/Desktop/Coding_Projects/Python_Space_Invaders/game_functions.py", line 90, in create_fleet
    create_alien(settings, screen, alien, alien_number, row_number)
  File "/Users/me/Desktop/Coding_Projects/Python_Space_Invaders/game_functions.py", line 81, in create_alien
    aliens.add(alien)
  File "/Users/me/Library/Python/3.7/lib/python/site-packages/pygame/sprite.py", line 142, in add
    self.add(*group)
TypeError: add() argument after * must be an iterable, not Alien

现在,外星人是一个在包含游戏主循环的文件中声明的组(声明的是正确的词吗?有很多术语需要记住)

import sys
#sys is used to exit the game when the player quits
import pygame
#pygame contains all the functionality to make a game
from pygame.sprite import Group
from settings import Settings
from ship import Ship
import game_functions as gf
from bullet import Bullet
from alien import Alien

def run_game():
    pygame.init()
    #Intialize pygame methods
    pygame.display.set_caption("Space Invaders")
    settings = Settings()
    screen = pygame.display.set_mode(
    (settings.screen_width, settings.screen_height))
    #Creates a display window for the game
    #The object screen is a surface. In pygame, a surface is a part of the -
    #screen where a game element is displayed
    ship = Ship(settings, screen)
    bullets = Group()
    aliens = Group()                                            #<--------- Right there
    #Background color
    gf.create_fleet(settings, screen, ship, aliens)
    while True:
    #Main loop of the game
        gf.check_events(settings, screen, ship, bullets)
        gf.update_events(settings, screen, ship)
        ship.update()
        bullets.update()
        gf.update_bullets(bullets)
        gf.update_screen(settings, screen, ship, bullets, aliens)
run_game()

对于我的一生,我无法弄清楚将我的外星人类的几个实例添加到我的外星人组中会出现什么问题。回溯说它需要是可迭代的,但它is在 create_fleet() 中的双 for 循环中进行迭代。所以我不知道。

您可能不需要所有这些代码来解决我的问题,但我认为信息太多总比信息不够好。哦,这是 Alien() 类,以防万一您也需要它。

import pygame
from pygame.sprite import Sprite

class Alien(Sprite):
    def __init__(self, settings, screen):
        super(Alien, self).__init__()
        self.settings = settings
        self.screen = screen
        self.image = pygame.image.load('Desktop/Coding_Projects/Python_Space_Invaders/alien.bmp')
        self.rect = self.image.get_rect()
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height
        self.x = float(self.rect.x)

    def blitme(self):
        self.screen.blit(self.image, self.rect)

感谢任何花时间浏览这个问题的人,我相信这对于经验丰富的程序员来说可能是显而易见的。


该代码正在传递一个Alien,而你的create_alien()函数需要一个组作为该参数。

def create_fleet(settings, screen, ship, aliens):
    alien = Alien(settings, screen)
    number_aliens_x = get_number_aliens_x(settings, alien.rect.width)
    number_rows = get_number_rows(settings, ship.rect.height, alien.rect.height)
    for row_number in range(number_rows):
        for alien_number in range(number_aliens_x):
            alien = Alien(settings, screen)
            create_alien(settings, screen, alien, alien_number, row_number) # <-- HERE 'alien'

核心问题是你的变量名太相似了。也许一些更具描述性的名称会有所帮助:

def create_alien( settings, screen, aliens_group, alien_number, row_number ):
    alien = Alien( settings, screen )
    alien_width = alien.rect.width
    alien.x = alien_width + 2 * alien_width * alien_number
    alien.rect.x = alien.x
    alien.rect.y = alien.rect.height + 2 * alien.rect.height + row_number
    aliens_group.add( alien ) 

def create_fleet( settings, screen, ship, aliens_group ):
    alien = Alien(settings, screen)
    number_aliens_x = get_number_aliens_x( settings, alien.rect.width )
    number_rows = get_number_rows( settings, ship.rect.height, alien.rect.height )
    for row_number in range( number_rows ):
        for alien_number in range( number_aliens_x ):
            alien = Alien( settings, screen )
            create_alien( settings, screen, aliens_group, alien_number, row_number) 

我会移动create_alien()函数进入Alien类,因为它似乎主要是移动精灵。

class Alien:

     ...

    def rePosition( settings, alien_number, row_number ):
        new_x = self.rect.width  + 2 * self.rect.width * alien_number
        new_y = self.rect.height + 2 * self.rect.height + row_number
        alien.rect.topleft = ( new_x, new_y )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python - add() 不会将类的实例添加到组中,因为它不可迭代,但它正在迭代 的相关文章

  • 动态组装 Python 模块,动态导入

    我正在努力让自己熟悉importlib钩子 我想实现直接导入用其他语言编写的非Python文件并维护源映射的能力 因此提高SyntaxError带有行号的 s 仍然会给出有意义的堆栈跟踪 我加载外部文件的方法是组装 Pythonic 源代码
  • 没有名为 pandas_datareader 的模块

    我刚刚安装了pandas datareader using pip install pandas datareader运行成功 现在我尝试将它用于教程 当我尝试导入时出现此错误 import pandas datareader as pdr
  • python中多个页面的数据串联时出现错误

    我在连接多个页面的数据并将其导出到单个 CSV 文件中时遇到错误 根据我的代码 数据导出到第 10 页 但在第 10 页之后它正在工作 import urllib request from bs4 import BeautifulSoup
  • pandas 数据框列表的列表列表

    我有一个列表的列表 最外层列表的长度为 20 单独的类别 中间列表的长度可变 时间戳列表 内部列表的长度为 5 分割每个时间戳 例如 sTimestamps 0 5 Tue Feb 7 10 06 30 2017 Tue Feb 7 10
  • 列表子类的 Python 类型

    我希望能够定义列表子类的内容必须是什么 该类如下所示 class A list def init self list init self 我想包括打字 这样就会发生以下情况 import typing class A list typing
  • 如何在Python中测量时间?

    我想启动我的程序 测量程序启动的时间 然后等待几秒钟 按下按钮 K RIGHT 并测量按下按钮的时间 我正在使用 Pygame 来注册 Keydown 但在我下面的代码中它没有注册我的 Keydown 我在这里做错了什么 start tim
  • Python3.5 BeautifulSoup4从div中的'p'获取文本

    我试图从 div 类 caselawcontent searchable content 中提取所有文本 此代码仅打印 HTML 不打印网页中的文本 我缺少什么来获取文本 以下链接位于 finteredcasesdoc text 文件中 h
  • 除下一行的值并在数据框中创建列

    我有一个像这样的csv id value 1 100 1 150 1 200 1 250 2 300 2 350 2 400 2 450 我想根据每个唯一 ID 的值生成一列 例如 id 1 的前 2 行值为 100 150 我正在尝试创建
  • 如何在一段时间后停止执行?

    我想在一定时间后停止执行 Dash 程序 当我关闭浏览器窗口时效果更好 尽管我怀疑这是否可能 有没有办法通过python中断它 我已经尝试过放一个 sys exit 打电话后app run server 虽然据我了解app run serv
  • 如何使用 win32com.client api 访问 MS Word 的脚注

    我正在尝试使用 win32com client api 访问 MS Word 文件的脚注 我已经用谷歌搜索过 但没能找到合适的方法 我使用 python docx 来实现上述目的 但我发现当前版本的 python docx 无法访问 MS
  • xlwings: 删除一个列 | Excel 中的行

    如何删除 Excel 中的一行 wb xw Book Shipment xlsx wb sheets Page1 1 range 1 1 clear clear 用于删除内容 我想删除该行 我很惊讶 clear 函数有效 但 delete
  • FastAPI/Pydantic 接受任意 post 请求正文吗?

    我想创建一个 FastAPI 端点 它只接受任意的 post 请求正文并返回它 如果我发送 foo bar 我想得到 foo bar 后退 但我也希望能够发送 foo1 bar1 foo2 bar2 并把它拿回来 我试过 from fast
  • 导入错误:无法导入名称线程

    这是我第一次学习Python 我继续尝试线程这篇博文 http www saltycrane com blog 2008 09 simplistic python thread example 问题是它似乎已经过时了 import time
  • 无法使用 beautifulsoup 模块 python 从 HTML 检索温度值

    我正在使用 BeautifulSoup4 来解析此 HTML 查看源代码 https weather com en IN weather today l 17 39 78 49 https weather com en IN weather
  • 如何在Python中获取声音级别?

    对于我正在进行的项目 我需要获取麦克风的实时分贝级别 我见过阴谋家 Print out realtime audio volume as ascii bars import sounddevice as sd import numpy as
  • 初始化 dask 分布式工作线程的状态

    我正在尝试做类似的事情 resource MyResource def fn x something dosemthing x resource return something client Client results client m
  • 如何在 python 3.x 中使用 string.replace()

    The string replace 在 python 3 x 上已弃用 这样做的新方法是什么 与 2 x 一样 使用str replace https docs python org library stdtypes html str r
  • shap.TreeExplainer 和 shap.Explainer 条形图之间的区别

    对于下面给出的代码 我得到了不同的条形图shap values 在此示例中 我的数据集为 1000train样本有 9 个类别和 500 个test样品 然后 我使用随机森林作为分类器并生成模型 当我开始生成shap条形图在这两种情况下得到
  • ipython/ pylab/ matplotlib安装和初始化错误

    我在 OS X El Captain 上安装了 matplotlib anaconda ipython 然而 即使在尝试以所有可能的方式设置环境变量之后 我仍无法启动 ipython shell pylab 版本 这是错误 ImportEr
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File

随机推荐

  • Elmah 无法使用 ASP.NET 网站

    我尝试在我的 asp net 网站上使用 elmah 但每当我尝试访问http localhost 端口 elmah axd我得到资源未找到异常 我的 web config 如下
  • Git Config 仅排除一个分支的文件

    我想在我的公共分支中排除一个名为 config dbconfig js 的文件 我用它推送到 github 但仍然能够从 master 推送到我的 noester com git 存储库以推送到生产环境 我将配置文件更改为 core rep
  • Typescript 给出“找不到模块‘xmlhttprequest’的声明文件。”

    Using import XMLHttpRequest from xmlhttprequest 在 Node 上 当我使用以下命令进行编译时 出现以下错误tsc index ts 4 col 32 错误 7016 QF 可用 找不到模块 的
  • JVM 缺少 Rhino

    我有一个使用 ScriptEngine 处理一些 javascript 的项目 并且在我的机器上运行良好 但是当我将项目的 jar 发送到服务器时 我发现服务器的 JVM 没有内置 Rhino 当该代码调用 new ScriptEngine
  • 发送至:网络无法访问

    我有两台机器正在测试我的代码 一台工作正常 另一台我遇到了一些问题 我不知道为什么会这样 我正在使用一个对象 C 作为我项目的网络部分 在服务器端 我这样做 为了清楚起见 删除了错误检查 res getaddrinfo NULL port
  • 在 Android 中完成父级和当前活动

    我有 3 项活动 活动 A 会导致活动 B 活动 B 又可以返回活动 A 或启动活动 C 但是 如果我在活动 C 中按返回 应用程序应该关闭 总结 活动 A 启动活动 B 紧迫Back活动 B 应该导致 A 活动 B 开始活动 C 紧迫Ba
  • 使用星号 * 量词的奇怪结果

    我正在尝试在一个简单的字符串上练习星号 量词 但是虽然我只有两个字母 但结果包含第三个匹配项 结果出来了 array 1 0 gt array 3 0 gt string 1 a 1 gt string 0 2 gt string 0 据我
  • 如何在不同的系统文化中转换日期时间?

    我需要转换DateTime不同文化格式中的值 无论系统中设置如何 没有选择任何特定的时区进行转换 任何区域性格式都使用转换日期时间值 DateTimeFormatInfo ukDtfi new CultureInfo CultureInfo
  • MFMailComposeViewController 和隐私 - 隐藏“收件人:”字段?

    我正在创建我的第二个 iPhone 应用程序 并且我已经使用 MFMailComposeViewController 包含了一个反馈表单 这可以正常显示和工作 但我不确定是否希望所有用户都能看到我的电子邮件地址 有没有办法将 to 字段设置
  • CSS - 渐变文本阴影

    I want to make a gradient text shadow like this Is it possible to do that with CSS or and Javascript Thanks for help 你可以
  • 如何在Asp.Net MVC中导出到Excel?

    SCRIPT function PostExportValues meter id range type id start date end date returnUrl var meter meter selection val 0 aj
  • 在 OpenGL 着色器的 main 之外进行计算是否合理?

    我有一些类似于以下的顶点着色器代码 这是一个简化的示例 attribute vec2 aPosition attribute vec4 aColor varying lowp vec4 vColor uniform vec4 uViewpo
  • 从 Ada 调用 scanf

    如何从 Ada 调用 scanf 也就是说 大概有一个适当的 pragma import 声明 但是声明会是什么样子呢 我感兴趣的是如何从 Ada 调用更难以驾驭的 C 函数 而不是如何解析字符串本身 所以我不是在寻找纯粹的 Ada 解决方
  • 使用 jQuery 更改依赖于滚动位置的类

    我有一个单页网站 有固定的浮动导航 我希望能够通过向相关导航标签添加一类 on 来突出显示用户所在的部分 当用户不再位于该部分时 需要删除此类 并且新的当前部分需要反映在导航中 这无法通过点击功能来完成 因为用户仍然可以上下滚动页面 我知道
  • 确定Word单元格是否合并

    我需要以编程方式在 Word 2010 表中添加和删除行 不幸的是 表的标题包含合并的单元格 水平和垂直合并 使用 Row Add 和 Row Delete 方法时这会导致错误 我已经测试并发现我可以以编程方式删除合并的单元格 Cell S
  • 我的控制器的 rspec 测试返回 nil(+工厂女孩)

    我正在用 rspec 和 Factory Girl 在 Rails 上学习测试 但我无法让它们工作 我的用户控制器如下所示 class UsersController lt ApplicationController def index u
  • 400 Hibernate @Valid 的错误请求

    当我验证我的表单时 我有一个奇怪的行为 一旦我添加 Hibernate Valid 注释 如果发布的数据无效 Tomcat 就会将我的请求视为 错误 如果数据有效 就不用担心 I use 雄猫7 0 52 Javax 验证 API 1 1
  • Jasper Report - 在 PDF 文档中设置作者属性

    有没有办法在从 Java 调用 Jasper 时通过设置参数来设置 PDF 文档的 Author 属性 这就是我从 Java 生成 Jasper 报告的方法 JasperPrint jasperPrint String outFile 39
  • 如何正确使用ObjectBox flutter store的打开和关闭?

    我希望使用 Flutter 和 ObjectBox 1 1 1 gt Flutter 定义最佳开发实践 我想建立一个由Repository组成的架构来实现对数据库中存储的对象的查询功能 这是一个对象人的示例 存储库主要从 viewModel
  • python - add() 不会将类的实例添加到组中,因为它不可迭代,但它正在迭代

    我学习 Python 一段时间了 并且正在阅读 Python 速成课程教科书 以防万一您可能熟悉该文本中的练习 第一个项目是 太空入侵者 的克隆版 到目前为止一直运行顺利 当我将外星人绘制到屏幕上时 我有一些代码可以检查窗口尺寸并将其与外星