Pygame继承Block类触发__init__参数不匹配TypeError问题求助
错误产生原因
- 直接触发报错的原因是
Player类初始化方法的参数数量不匹配:你定义Player.__init__时仅设置了x、y两个入参(不算隐式传递的self),但实例化Player对象时你传入了RED, 20, 20三个参数,加上自动传递的self,总计向__init__方法传入了4个参数,和定义的参数数量不符,因此抛出该TypeError。 - 其次是子类调用父类初始化的逻辑存在错误:
Player继承自Block类,父类Block.__init__要求必须传入color、width、height三个参数,但你在Player.__init__中调用super().__init__()时没有传递任何参数,哪怕修复了实例化参数问题,这里也会继续抛出参数不匹配错误。 - 另外还存在两处隐藏逻辑错误:一是循环创建
Block实例时,Block(200, 20,20)的第一个参数传入了数值200,不符合父类要求的颜色元组格式,后续会触发填充颜色的错误;二是键盘控制逻辑尚未补全,也没有调用update方法更新玩家位置,无法实现预期的移动效果。
修复方案
你可以按以下步骤修改代码:
- 调整
Player类的初始化逻辑,调用父类构造方法时传入正确的参数,同时可以复用父类的代码减少冗余:
class Player(Block): def __init__(self, x, y): # 给父类传入玩家固定的颜色、宽度、高度参数 super().__init__(RED, 15, 15) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.change_x = 0 self.change_y = 0 # 剩余的changespeed、update方法保持不变即可
- 修改
Player实例化的代码,传入正确的初始坐标参数:
# 传入初始的x、y坐标,比如放在画面左上角 player = Player(50, 50)
- 修复
Block实例化的参数错误,传入合法的颜色值:
block = Block(RED, 20,20)
- 补全键盘控制逻辑,删除原有的鼠标控制相关代码:
- 事件循环中补全按键按下、松开的判断逻辑:
elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: player.changespeed(-3, 0) if event.key == pygame.K_RIGHT: player.changespeed(3, 0) if event.key == pygame.K_UP: player.changespeed(0, -3) if event.key == pygame.K_DOWN: player.changespeed(0, 3) elif event.type == pygame.KEYUP: if event.key == pygame.K_LEFT: player.changespeed(3, 0) if event.key == pygame.K_RIGHT: player.changespeed(-3, 0) if event.key == pygame.K_UP: player.changespeed(0, 3) if event.key == pygame.K_DOWN: player.changespeed(0, -3)
- 在画面填充白色之后、碰撞检测之前,添加精灵更新的调用,同时删除无用的鼠标位置获取、无效坐标赋值代码:
screen.fill(WHITE) # 删掉下面这三行没用的代码 # pos = pygame.mouse.get_pos() # player.rect.x = player.rect.x # player.rect.y = player.rect.y # 新增调用update方法更新所有精灵位置 all_sprites_list.update()
修改完成后运行代码就不会再出现参数错误,也可以通过方向键控制玩家方块移动收集其他方块。
内容的提问来源于stack exchange,提问作者user15401554
相关产品推荐
相关产品推荐

