Pygame分数计数器无法运行,出现NameError错误求助
Pygame分数计数器NameError问题解决
我是编程新手,靠搜资料自学开发,代码可能不规范。尝试在Pygame里做分数计数器,达到指定分数(比如2000米)解锁新角色,但碰到了无法解决的问题。
我的代码如下:
import pygame import time from pygame.locals import ( RLEACCEL, K_UP, K_DOWN, K_LEFT, K_RIGHT, ) pygame.init() timer_interval= 500 timer_event = pygame.USEREVENT+1 pygame.time.set_timer(timer_event, timer_interval) #Define a player calss that extends pygame.sprite.Sprite class Player(pygame.sprite.Sprite): def __init__(self): super(Player, self).__init__() self.surf = pygame.transform.scale(pygame.image.load("PixelArtBike.png").convert(), (105,64.2)) self.surf.set_colorkey((255, 255, 255), RLEACCEL) self.rect = self.surf.get_rect() self.speed = 10 self.score = 0 def update(self, pressed_keys, screenHeight, screenWidth): if pressed_keys[K_UP]: self.rect.move_ip(0, -self.speed) if pressed_keys[K_DOWN]: self.rect.move_ip(0, self.speed) if pressed_keys[K_LEFT]: self.rect.move_ip(-self.speed, 0) if pressed_keys[K_RIGHT]: self.rect.move_ip(self.speed, 0) if self.rect.left < 0: self.rect.left = 0 if self.rect.right > screenWidth: self.rect.right = screenWidth if self.rect.top <= 0: self.rect.top = 0 if self.rect.bottom >= screenHeight: self.rect.bottom = screenHeight Player.score += Player.speed running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == timer_event: self.score += self.speed
运行代码时出现如下错误:
name 'self' is not defined File "C:\Users\ethan\Documents\coder dojo\Python\New folder\Player.py", line 54, in <module> self.score += self.speed ^^^^ NameError: name 'self' is not defined
问题解决方法
错误根源
self是类实例的专属引用,只能在类的方法内部使用。你在全局的主循环里直接写self.score,Python找不到这个变量,所以抛出NameError。- 另外你还没创建Player类的实例,就算要操作分数,也得先实例化一个Player对象。
- 你的Player类update方法里还有一处错误:
Player.score += Player.speed,这里用类名访问实例属性是错误的,score和speed是每个Player实例自己的属性,应该用self来访问。
修复步骤
- 先创建Player实例:在进入主循环前添加
player = Player(),同时补充屏幕尺寸定义(因为update方法用到了相关参数),比如screenWidth = 800、screenHeight = 600和screen = pygame.display.set_mode((screenWidth, screenHeight))。 - 修改主循环里的分数更新代码:把
self.score += self.speed改成player.score += player.speed。 - 修正Player类update方法里的错误:把
Player.score += Player.speed改成self.score += self.speed。
- 先创建Player实例:在进入主循环前添加
修复后的完整代码
import pygame import time from pygame.locals import ( RLEACCEL, K_UP, K_DOWN, K_LEFT, K_RIGHT, ) pygame.init() # 定义屏幕尺寸 screenWidth = 800 screenHeight = 600 screen = pygame.display.set_mode((screenWidth, screenHeight)) timer_interval= 500 timer_event = pygame.USEREVENT+1 pygame.time.set_timer(timer_event, timer_interval) #Define a player calss that extends pygame.sprite.Sprite class Player(pygame.sprite.Sprite): def __init__(self): super(Player, self).__init__() self.surf = pygame.transform.scale(pygame.image.load("PixelArtBike.png").convert(), (105,64)) self.surf.set_colorkey((255, 255, 255), RLEACCEL) self.rect = self.surf.get_rect() self.speed = 10 self.score = 0 def update(self, pressed_keys, screenHeight, screenWidth): if pressed_keys[K_UP]: self.rect.move_ip(0, -self.speed) if pressed_keys[K_DOWN]: self.rect.move_ip(0, self.speed) if pressed_keys[K_LEFT]: self.rect.move_ip(-self.speed, 0) if pressed_keys[K_RIGHT]: self.rect.move_ip(self.speed, 0) if self.rect.left < 0: self.rect.left = 0 if self.rect.right > screenWidth: self.rect.right = screenWidth if self.rect.top <= 0: self.rect.top = 0 if self.rect.bottom >= screenHeight: self.rect.bottom = screenHeight # 修正:用self访问实例属性 self.score += self.speed # 创建Player实例 player = Player() running = True while running: # 填充屏幕背景(避免画面残留) screen.fill((0,0,0)) # 绘制玩家 screen.blit(player.surf, player.rect) # 更新显示 pygame.display.flip() for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == timer_event: # 修正:用实例对象访问score属性 player.score += player.speed # 可以打印分数查看效果 print(f"当前分数: {player.score}") # 获取按键状态并更新玩家位置 pressed_keys = pygame.key.get_pressed() player.update(pressed_keys, screenHeight, screenWidth) pygame.quit()
内容的提问来源于stack exchange,提问作者Ethan A.K.
相关产品推荐
相关产品推荐

