AttributeError: Game object has no attribute run 怎么办

python马里奥游戏

# 游戏主要入口
import pygame
from source import tools, setup
def main():
    game = tools.Game()
    game.run()
if __name__ == '__main__':
   main()
# 工具和游戏主控
import os

import pygame
import pygame
import random

class Game:
    def __init__(self):
        self.screen = pygame.display.get_surface()
        self.clock = pygame.time.Clock()

        def run(self):
            while True:
                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        pygame.display.quit()
                    elif event.type == pygame.KEYDOWN:
                        self.keys = pygame.key.get_pressed()
                    elif event.type == pygame.KEYUP:
                        self.keys = pygame.key.get_pressed()
                self.screen.fill((random.randint(0,255),random.randint(0,255),random.randint(0,255))) # 随机出一种颜色
                pygame.display.update()
                self.clock.tick(60)  # 每秒钟60帧

这两个代码分别是两个python file里面的,代码是正确的,但是会显示以下错误,我怎样都解决不了
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File "C:\Users\fbyzb\PycharmProjects\SuperMario\main.py", line 14, in
main()
File "C:\Users\fbyzb\PycharmProjects\SuperMario\main.py", line 9, in main
game.run()
^^^^^^^^
AttributeError: 'Game' object has no attribute 'run'

Process finished with exit code 1

这段代码中出现了一个错误。错误信息是"AttributeError: Game object has no attribute run",意思是Game对象没有run属性。

这个错误是因为在Game类中定义了一个run方法,但是该方法被放置在了init方法内部,导致无法访问到。要解决这个错误,需要将run方法移动到init方法的外部。

修正后的代码如下:

class Game:
    def __init__(self):
        self.screen = pygame.display.get_surface()
        self.clock = pygame.time.Clock()

    def run(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.display.quit()
                elif event.type == pygame.KEYDOWN:
                    self.keys = pygame.key.get_pressed()
                elif event.type == pygame.KEYUP:
                    self.keys = pygame.key.get_pressed()
            self.screen.fill((random.randint(0,255),random.randint(0,255),random.randint(0,255))) # 随机出一种颜色
            pygame.display.update()
            self.clock.tick(60)  # 每秒钟60帧

将run方法移动到init方法的外部后,再次运行代码应该就不会出现该错误了。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    针对该问题,考虑如下解决方案:

    1. 首先,需要理解“AttributeError: 'Game' object has no attribute 'run'”这个错误的含义。这个错误意味着一个名为'run'的属性不存在于'Game'对象中,可能是一个拼写错误或是缺少必要的引用。

    2. 接下来,检查代码中是否存在名字为“run”的属性。如果没有,那么需要检查代码中是否缺少必要的引用或者库。

    3. 如果代码中存在名字为“run”的属性,那么需要检查其是否存在于正确的对象中。具体来说,检查是否在'Game'对象中定义了一个名为'run'的方法或属性。

    4. 如果代码中确实存在'Game'对象中的'run'方法或属性,那么需要检查是否已经正确地初始化和创建'Game'对象。检查是否存在任何与'Game'对象相关的错误或其他异常情况。

    5. 最后,检查是否正确使用了pygame库中的相关功能。检查是否存在任何遗漏或错误的导入语句、语法错误或其他与pygame相关的问题。

    下面提供一些可能能够帮助解决问题的建议:

    1. 确认自己已经安装了pygame库,并且已经正确地引用了pygame库。

    2. 仔细检查代码中是否存在拼写错误或语法错误,注意检查方法和属性名字的拼写,确保完整引用方法。

    3. 尝试使用其他的马里奥游戏代码,或者从在线资源中获取已经被证明有效的代码。

    参考代码:

    # 导入 pygame 库
    import pygame
    
    # 初始化 pygame 库
    pygame.init()
    
    # 创建一个窗口
    screen = pygame.display.set_mode((800, 600))
    
    # 定义 Game 类
    class Game:
        def __init__(self):
            self.score = 0
    
        def run(self):
            while True:
                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        pygame.quit()
                        quit()
    
                # 绘制游戏内容
                pygame.display.flip()
    
    # 创建 Game 对象
    game = Game()
    
    # 运行游戏
    game.run()
    

    在以上代码中,我们使用pygame库创建一个基础的窗口,并定义了一个名为'Game'的类,该类具有一个名为'run'的方法。在创建Game对象后,我们调用game.run()启动游戏循环。当我们退出游戏时,我们使用pygame.quit()来关闭pygame库。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^