You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题解决方法

  1. 错误根源

    • self是类实例的专属引用,只能在类的方法内部使用。你在全局的主循环里直接写self.score,Python找不到这个变量,所以抛出NameError。
    • 另外你还没创建Player类的实例,就算要操作分数,也得先实例化一个Player对象。
    • 你的Player类update方法里还有一处错误:Player.score += Player.speed,这里用类名访问实例属性是错误的,score和speed是每个Player实例自己的属性,应该用self来访问。
  2. 修复步骤

    • 先创建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。
  3. 修复后的完整代码

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:34:52