【问题标题】:Converting Range Values to Integers将范围值转换为整数
【发布时间】:2017-05-07 17:01:47
【问题描述】:

我正在 pygame 中开发一款游戏,敌舰将从屏幕外开始,然后沿 Y 轴垂直移动到玩家。

但是,我在访问敌人的位置时遇到了一些麻烦,因为它都是相对于一个范围的。我不太清楚如何解释它,但这是我对 Enemy Class 的看法:

class EnemyActive(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        enemy_img_list = ['enemyshipone.png', 'enemyshiptwo.png',
                      'enemyshipthree.png','enemyshipfour.png']
        enemy_img = random.choice(enemy_img_list)
        self.image = pygame.image.load(enemy_img)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(0,400)
        self.rect.y = random.randrange(-200,-10)
        self.speed = random.randrange(1,3)

    def update(self):
        self.rect.y += self.speed

    def getCoord(self):
        return (self.rect.x, self.rect.y)

所以,当我尝试使用另一个函数访问位置时,该函数接受 (x,y) 坐标:

particle_list = particles.create_particles(particle_list,enemy.getCoord())

它返回一个错误说明:

数字 = 范围(-5, -1) + 范围(1, 5)

TypeError:+ 的不支持的操作数类型:“范围”和“范围”

我不会撒谎说我完全理解这个错误,但我确实看到了其推理背后的逻辑。我怎样才能真正让我的“getCoord”函数发送适当的坐标?

【问题讨论】:

  • 如果您使用的是 Python 3,请参见此处:stackoverflow.com/questions/13318083/…
  • 您能否发布整个堆栈跟踪,这样我们就不必猜测会发生什么?
  • 您的代码是否实现了该行?你想让它做什么?在 python 2 中,range 返回一个列表,它们将毫无错误地连接起来。在 python 3 上,你可以numbers = list(range(-5, -1)) + list(range(1, 5)).

标签: python random pygame range


【解决方案1】:

在 python 3 中,range 是一个惰性序列,而不是一个列表。也就是说,当被要求时,它像生成器(惰性)一样一次生成一个值,而不是一次将它们全部存储在内存中(eageR)。

您不能将范围相加,因为它们没有定义 + 的方法。 list 确实:它连接。

我们可以通过调用列表类将范围转换为列表。即list(range(1, 5))

您可以构造两个列表,然后用 + 连接它们,也可以将生成器链接在一起,然后创建一个列表。这被认为是更好的样式,因为它避免了创建中间列表。

例如:

from itertools import chain
my_list = list(chain(range(-5, -1), range(1, 5)))

【讨论】:

  • 其实范围对象不是生成器而是不可变序列。其余的答案看起来不错。
  • 你是对的。当我回到我的电脑时,我会编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 2021-08-05
  • 2011-06-05
  • 1970-01-01
相关资源
最近更新 更多