追逐游戏 - 错误信息:“'module' 对象没有属性 'display'”

Chasing game - Error message: "'module' object has no attribute 'display'"

我是编程新手,我正在尝试建立一个模拟,其中一个圆圈以随机模式移动并被第二个圆圈追赶。最终我希望添加 5 个圆圈作为随机移动的干扰物。

在代码中我调用了随机移动的圆 "Mouse" 和追逐的圆 "Cat"。

我在网上进行了研究并查看了其他人的代码以获取想法,这就是我到目前为止的想法:

from pygame import *
import random
import sys, pygame, math, random
from pygame.locals import *

pygame.init()
background_colour = (255,255,255)
(width, height) = (1024, 768)
screen = pygame.display.set_mode((width, height),pygame.FULLSCREEN)


class Mouse(pygame.sprite.Sprite):
    def __init__(self, (x, y), size):
        pygame.sprite.Sprite.__init__(self)
        self.x = MX
        self.y = MY
        self.size = 30
        self.colour = (0, 0, 0)
        self.thickness = 2
        self.speed = 2
        self.angle = random.uniform(0, math.pi*2)


    def display(self):
        pygame.draw.circle(screen, self.colour, (int(MX), int(MY)), self.size, self.thickness)

    def move(self):
        self.x += math.sin(self.angle) * self.speed
        self.y -= math.cos(self.angle) * self.speed


class Cat(pygame.sprite.Sprite):
    def __init__(self, (x, y), size):
        pygame.sprite.Sprite.__init__(self)
        self.x = CX
        self.y = CY
        self.size = 30
        self.colour = (0, 0, 0)
        self.thickness = 2
        self.speed = 2
        self.angle = random.uniform(0, math.pi*2)
        pixChangeC = 2

    def display(self):
        pygame.draw.circle(screen, self.colour, (int(CX), int(CY)), self.size, self.thickness)

    def move(self):
        if MX >= CX:
            CX += pixChangeC    
        else:
            CX -= pixChangeC
        if MY >= CY:
            CY += pixChangeC
        else:
            CY -= pixChangeC

def main():

    pygame.display.set_caption('Chase')
    mouse = Mouse()
    cat = Cat()


running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
            pygame.quit()
            sys.exit()


    screen.fill(background_colour)

    mouse.display()
    mouse.move()
    cat.display()
    cat.move()

    pygame.display.flip() 

不幸的是,当我尝试 运行 这样的代码时,我收到以下错误消息:

" 文件 "C:...",第 75 行,位于 mouse.display() AttributeError: 'module' 对象没有属性 'display'"

我无法在网上找到我哪里出错的答案,所以如果有人有一些 advice/ideas,我将不胜感激!

我认为问题是因为 pygame 也有一个 class mouse,并且由于您是用 from 导入 pygame,所以它是覆盖您的鼠标 class。通过将 class 实例名称更改为其他名称来解决此问题。 (例如 myMouse)

Pydude 走在正确的轨道上,但停得太快了。您收到一条非常无用的错误消息,因为当您使用 from blank import * 方法导入 pygame 时导入了 pygame.mouse(带有一个小的 m),但它应该覆盖那个你有 mouse = Mouse()。问题是你的缩进是错误的。 running = True 以下的所有内容都需要再次缩进,包括该行。然后,要使 main() 函数变为 运行,您需要在文件末尾包含:

if __name__ == "__main__":
    main()

所以当您 运行 代码时发生的事情是它直接跳过 main() 方法(您的代码中永远不会调用它)并且 运行s缩进后的内容返回,从 running = True 开始。当它到达 mouse.display() 你实际上还没有 运行 mouse = Mouse() 所以它使用从 [=36 导入的 mouse =]. mouse 没有 display() 方法,因此出现您的错误消息。

修复该错误后,您的代码中会出现更多错误,但这一更改将使您克服这一错误。下一个至少有一个更有帮助的错误消息,所以你应该能够弄明白。

另外,一些建议:from blank import * 正是因为这个原因而不鼓励。最好是做 import pygame 并引用所有内容,例如 pygame.sprite (你已经在做......这很奇怪你正在做这两个......)或者做 from pygame import sprite, foo, bar, ... 并明确列出您想要从该模块中获得的每个特定内容。这两种方法可以防止未知的东西使您的命名空间混乱,并且可以防止您收到您无法理解的令人困惑的错误消息。

确保您的当前目录或 PYTHONPATH 中没有另一个 pygame 模块。尝试打印

print(str(pygame.__file__))

检查您是否导入了正确的包。