无法为列表中每个Pipe对象修改Rect的X坐标问题求助
问题分析与解决
- 报错核心原因:你循环的
pipes是Pipe类的实例列表,循环变量i是一个个Pipe对象,并非整数,自然无法和100执行乘法运算,这就是'Pipe' and 'int'不支持相乘的根源。 - 你改成
range(pipes)后没问题,说明此时你把pipes换成了管道数量的整数(比如原来的列表改成了数字3),range(3)会生成0、1、2这类整数,能正常和100做乘法。
正确写法分两种场景:
场景1:基于管道列表的索引做X轴偏移
如果pipes是管道实例列表,需要遍历列表的索引来计算偏移:
def draw(self): # 用enumerate同时拿到索引和管道实例(实例不用的话也可以只拿索引) for idx, _ in enumerate(pipes): self.top_rect = pygame.draw.rect( DISPLAYSURF, YELLOW, (self.__x + (idx * 100), (self.__y - self.__h) - 185, self.__w, self.__h), )
或者直接遍历列表长度生成的索引:
def draw(self): for idx in range(len(pipes)): self.top_rect = pygame.draw.rect( DISPLAYSURF, YELLOW, (self.__x + (idx * 100), (self.__y - self.__h) - 185, self.__w, self.__h), )
场景2:让每个管道实例自带独立X坐标
更合理的设计是给每个Pipe实例分配专属的x属性,不用在draw方法里统一计算偏移:
# 初始化时给每个管道设置不同的x值 pipes = [Pipe(x=100 * i) for i in range(3)] # draw方法直接使用实例自身的x属性 def draw(self): for pipe in pipes: self.top_rect = pygame.draw.rect( DISPLAYSURF, YELLOW, (pipe.x, (self.__y - self.__h) - 185, self.__w, self.__h), )
本质上你是混淆了「管道实例对象」和「用来计算偏移的数字索引/数量」,循环拿到的是管道对象而非数字,这就是你忽略的关键问题。
内容的提问来源于stack exchange,提问作者Apple_Retainer
相关产品推荐
相关产品推荐

