追逐游戏 - 错误消息:"'模块'对象没有属性'显示'"

时间:2015-08-30 18:32:12

标签: python pygame attributeerror

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

在代码中我把圈子称为随机移动"鼠标"和圈子追逐" 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行,in     mouse.display() AttributeError:'模块'对象没有属性'显示'"

我无法在网上找到关于我出错的地方的答案,所以如果有人有一些建议/想法,我将不胜感激任何帮助!

3 个答案:

答案 0 :(得分:3)

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

if __name__ == "__main__":
    main()

所以当你运行代码时发生的事情就是它跳过main()方法(在你的代码中从不调用)并在缩进返回后运行这些东西,从{{开始1}}。当它到达running = True 时,您还没有实际运行mouse.display(),因此它使用从pygame导入的mouse = Mouse()mouse没有mouse方法,因此您的错误消息。

修复后,您的代码中会出现更多错误,但此更改会让您超过此错误。下一个至少有一个更有用的错误消息,所以你应该能够弄明白。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

确保当前目录或PYTHONPATH中没有其他pygame模块。尝试打印

print(str(pygame.__file__))

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