使用Pygame开发乒乓球游戏时遇TypeError:draw()缺少必填参数
Pygame乒乓球游戏位置参数错误修复
问题根源
- draw函数参数缺失:main循环里重复调用了
draw,其中draw(WIN)未传递paddles参数,但draw()函数定义明确要求接收win和paddles两个参数,这直接触发了TypeError。 - handle_paddle_movement参数传递错误:调用该函数时,你把两个paddle打包成列表传入,但函数定义需要分别传入
left_paddle和right_paddle两个独立对象,不修复的话后续移动逻辑会报错。
修复步骤
- 删除main循环中多余的
draw(WIN)调用,只保留正确的draw(WIN, [left_paddle, right_paddle])。 - 修改
handle_paddle_movement的调用方式,从handle_paddle_movement(keys, [left_paddle, right_paddle])改为handle_paddle_movement(keys, left_paddle, right_paddle)。
修复后的完整代码
import pygame pygame.init() WIDTH, HEIGHT = 700, 500 WIN = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Ping Pong!") FPS = 60 WHITE = 255,255,255 BLACK = 0,0,0 PADDLE_WIDTH, PADDLE_HEIGHT = 20, 100 class Paddle: color = WHITE VEL = 4 def __init__(self, x, y, width, height): self.x = x self.y = y self.width = width self.height = height def draw(self,win): pygame.draw.rect(win, self.color, (self.x, self.y, self.width,self.height)) #x and y coords will be the top left corner of the object rectangle #The other variables will be in respect of the top left coordinate def move(self, up=True): if up: self.y -= self.VEL else: self.y += self.VEL def draw(win, paddles): win.fill(BLACK) for paddle in paddles: paddle.draw(win) pygame.display.update() #Updates the display def handle_paddle_movement(keys, left_paddle, right_paddle): if keys[pygame.K_w]: left_paddle.move(up=True) if keys[pygame.K_s]: left_paddle.move(up=False) if keys[pygame.K_UP]: right_paddle.move(up=True) if keys[pygame.K_DOWN]: right_paddle.move(up=False) def main(): run = True clock = pygame.time.Clock() left_paddle = Paddle(10, HEIGHT//2 - PADDLE_HEIGHT//2, PADDLE_WIDTH, PADDLE_HEIGHT) right_paddle = Paddle(WIDTH - 10 - PADDLE_WIDTH, HEIGHT//2 - PADDLE_HEIGHT//2, PADDLE_WIDTH, PADDLE_HEIGHT) while run: #Limits Frames per Second clock.tick(FPS) draw(WIN, [left_paddle, right_paddle]) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False break keys = pygame.key.get_pressed() handle_paddle_movement(keys, left_paddle, right_paddle) pygame.quit() if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者Nick badger
相关产品推荐
相关产品推荐

