2017-05-07 88 views
0

我正在pygame中开发一款游戏,其中敌方船只将从屏幕开始,然后沿着Y轴向玩家垂直移动。将范围值转换为整数

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

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'函数发送适当的坐标?

+0

如果您正在使用Python 3,在这里看到:http://stackoverflow.com/questions/13318083/python-unsupported-types-range-and-range – Gabriel

+0

你能发布整个堆栈跟踪,所以我们不必猜测会发生什么? – tdelaney

+0

您的代码是否实现该行?你想要它做什么?在Python 2中,'range'返回一个列表,并且它们会连接而没有错误。在python 3上,你可以'numbers = list(range(-5,-1))+ list(range(1,5))''。 – tdelaney

回答

2

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

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

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

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

如:

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

实际上,范围对象不是生成器,而是不可变的序列。答案的其余部分看起来不错。 – skrx

+0

你是对的。当我回到我的电脑时,我会编辑我的答案。 –