Python Crash Course练手报错:三类函数相关问题求助
《Python Crash Course》代码练习问题解决方案
问题1:TypeError: check_events() takes 0 positional arguments but 1 was given
报错根源是game_functions.py里的check_events函数定义未接收参数,但调用时传入了ship对象。
修复方法:
修改game_functions.py中的check_events函数,添加ship参数并补充事件处理逻辑:
def check_events(ship): for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # 处理飞船移动的按键事件 elif event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT: ship.moving_right = True elif event.type == pygame.KEYUP: if event.key == pygame.K_RIGHT: ship.moving_right = False
问题2:Pylint提示Too many positional arguments for function call
该提示由两处问题引发:
- 重复调用
pygame.display.set_mode:代码中先通过ai_settings参数创建屏幕,随后又调用一次传入固定尺寸,属于冗余操作,会触发参数匹配提示。 update_screen函数参数不匹配:调用时传入了ai_settings、screen、ship三个参数,需确保game_functions.py中该函数的定义对应接收这三个参数。
修复步骤:
- 删除代码中多余的
pygame.display.set_mode((1200, 800))行,保留基于ai_settings的屏幕初始化即可。 - 确保
update_screen函数定义与调用参数一致:
def update_screen(ai_settings, screen, ship): screen.fill(ai_settings.bg_color) ship.blitme() pygame.display.flip()
问题3:函数run_game标注为NotReturn
原因是run_game函数的while True无限循环内,递归调用了run_game(),导致函数永远无法正常返回,同时会引发栈溢出风险,Pylint因此标注为NotReturn。
修复方法:
删除while True循环内的run_game()调用,主循环本身已实现无限执行,无需递归调用函数。
修正后的完整代码
import sys import pygame from settings import Settings from ship import Ship import game_functions as gf def run_game(): # 初始化游戏并创建屏幕对象 ai_settings = Settings() screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height)) pygame.display.set_caption("Alien Invasion") # 创建飞船 ship = Ship(screen) # 开始游戏主循环 while True: gf.check_events(ship) ship.update() gf.update_screen(ai_settings, screen, ship) run_game()
内容的提问来源于stack exchange,提问作者Noof
相关产品推荐
相关产品推荐

