Python 太空入侵者-pygame-AttributeError

Python 太空入侵者-pygame-AttributeError,python,pygame,Python,Pygame,我想让敌人射击,首先是用tab butten,在我完成这项工作后,我想让他们随机射击。当我按下tab按钮时,它会显示AttributeError:“Group”对象没有属性“ShootEfriend”。 出什么事了? 此时没有碰撞检测。我稍后会补充这一点 import pygame, sys from pygame.locals import * import random screenWidth = 800 screenHeight = 600 FPS = 60 pygame.init()

我想让敌人射击,首先是用tab butten,在我完成这项工作后,我想让他们随机射击。当我按下tab按钮时,它会显示AttributeError:“Group”对象没有属性“ShootEfriend”。 出什么事了? 此时没有碰撞检测。我稍后会补充这一点

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

screenWidth = 800
screenHeight = 600
FPS = 60

pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((screenWidth,screenHeight))
pygame.display.set_caption("Space Invaders")
clock = pygame.time.Clock()

shipWidth = 78

#colors
black=(0,0,0)
blue=(0,0, 255)
green=(0,128,0)
red=(255,0,0)
white=(255,255,255)
yellow=(255,255,0)

def app_quit():
    pygame.quit()
    sys.exit("System exit.")

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("spaceship7.png").convert()
        self.image.set_colorkey(white)#make white transparant
        self.rect = self.image.get_rect()
        self.rect.centerx = screenWidth / 2
        self.rect.bottom = screenHeight - 10
        self.speedx = 0

    def update(self):
        self.speedx = 0
        if event.type == KEYDOWN and event.key == K_LEFT:
            self.speedx = -2
        elif event.type == KEYDOWN and event.key == K_RIGHT:
            self.speedx = 2
        self.rect.x += self.speedx
        if self.rect.right > screenWidth:
            self.rect.right = screenWidth
        if self.rect.left < 0:
            self.rect.left = 0

    def shootPlayer(self):
        bulletPlayer = BulletPlayer(self.rect.centerx, self.rect.top)
        allSprites.add(bulletPlayer)
        bulletsPlayer.add(bulletPlayer)

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("enemy.png").convert()
        self.image.set_colorkey(white)
        self.rect = self.image.get_rect()
        self.rect.x = 0
        self.rect.y = random.randrange(0, 200)
        self.speedx = random.randrange(1,2)

    def update(self):
        self.rect.x += self.speedx
        if self.rect.right > screenWidth:
            self.rect.x = 50
            self.rect.y = random.randrange(0, 250)
            self.speedx = random.randrange(1,3)
        if self.rect.x > screenWidth:
            self.kill()

    def shootEnemy(self):
         bulletEnemy = BulletEnemy(self.rect.centerx, self.rect.bottom)
         allSprites.add(bulletEnemy)
         bulletsEnemy.add(bulletEnemy)

class BulletPlayer(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("bullet.png").convert()
        self.image.set_colorkey(white)
        self.rect = self.image.get_rect()
        self.rect.bottom = y
        self.rect.centerx = x
        self.speedy = -3

    def update(self):
        self.rect.y += self.speedy
        if self.rect.bottom < 0:
            self.kill()

class BulletEnemy(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("bulletenemy.png").convert()
        self.image.set_colorkey(white)
        self.rect = self.image.get_rect()
        self.rect.bottom = y
        self.rect.centerx = x
        self.speedy = 3

    def update(self):
        self.rect.y += self.speedy
        if self.rect.bottom > screenHeight:
            self.kill()

class Wall(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("wall.png").convert()
        self.rect = self.image.get_rect()
        self.rect.center = 100, 300

allSprites = pygame.sprite.Group()
player = Player()
enemy = pygame.sprite.Group()
bulletsPlayer = pygame.sprite.Group()
bulletsEnemy = pygame.sprite.Group()
wall = Wall()
allSprites.add(player, enemy, bulletsPlayer, bulletsEnemy, wall)

for i in range(1):
    e = Enemy()
    allSprites.add(e)
    enemy.add(e)

running = True
while True:
    for event in pygame.event.get():
        if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
            running = False
            app_quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                player.shootPlayer()
            if event.key == pygame.K_TAB:
                enemy.shootEnemy()

    allSprites.update()
    screen.fill(black)
    allSprites.draw(screen)
    pygame.display.flip()

pygame.quit()
import pygame,sys
从pygame.locals导入*
随机输入
屏幕宽度=800
屏幕高度=600
FPS=60
pygame.init()
pygame.mixer.init()
screen=pygame.display.set_模式((屏幕宽度、屏幕高度))
pygame.display.set_标题(“太空入侵者”)
clock=pygame.time.clock()
船宽=78
#颜色
黑色=(0,0,0)
蓝色=(0,0255)
绿色=(0128,0)
红色=(255,0,0)
白色=(255255)
黄色=(255255,0)
def app_quit():
pygame.quit()
系统退出(“系统退出”)
职业玩家(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“spaceship7.png”).convert()
self.image.set_colorkey(白色)#使白色透明
self.rect=self.image.get_rect()
self.rect.centerx=屏幕宽度/2
self.rect.bottom=屏幕高度-10
self.speedx=0
def更新(自我):
self.speedx=0
如果event.type==KEYDOWN和event.key==K_LEFT:
self.speedx=-2
elif event.type==KEYDOWN和event.key==K_RIGHT:
self.speedx=2
self.rect.x+=self.speedx
如果self.rect.right>屏幕宽度:
self.rect.right=屏幕宽度
如果self.rect.left<0:
self.rect.left=0
def shootPlayer(自我):
bulletPlayer=bulletPlayer(self.rect.centerx、self.rect.top)
所有精灵。添加(bulletPlayer)
bulletPlayer.add(bulletPlayer)
职业敌人(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“敌方.png”).convert()
self.image.set_颜色键(白色)
self.rect=self.image.get_rect()
self.rect.x=0
self.rect.y=random.randrange(0200)
self.speedx=random.randrange(1,2)
def更新(自我):
self.rect.x+=self.speedx
如果self.rect.right>屏幕宽度:
自校正x=50
self.rect.y=random.randrange(0250)
self.speedx=random.randrange(1,3)
如果self.rect.x>屏幕宽度:
self.kill()
def射击敌人(自身):
BulletForeign=BulletForeign(self.rect.centerx,self.rect.bottom)
所有精灵。添加(Bullet敌人)
bulletsEnemy.add(BulletForeign)
类BulletPlayer(pygame.sprite.sprite):
定义初始化(self,x,y):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“bullet.png”).convert()
self.image.set_颜色键(白色)
self.rect=self.image.get_rect()
self.rect.bottom=y
self.rect.centerx=x
self.speedy=-3
def更新(自我):
self.rect.y+=自加速
如果self.rect.bottom<0:
self.kill()
类(pygame.sprite.sprite):
定义初始化(self,x,y):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“bulletForeign.png”).convert()
self.image.set_颜色键(白色)
self.rect=self.image.get_rect()
self.rect.bottom=y
self.rect.centerx=x
self.speedy=3
def更新(自我):
self.rect.y+=自加速
如果self.rect.bottom>屏幕高度:
self.kill()
类墙(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“wall.png”).convert()
self.rect=self.image.get_rect()
self.rect.center=100300
allSprites=pygame.sprite.Group()
player=player()
敌人=pygame.sprite.Group()
bulletsPlayer=pygame.sprite.Group()
bulletsEnemy=pygame.sprite.Group()
墙=墙()
所有精灵。添加(玩家、敌人、bulletsPlayer、bulletsEnemy、墙)
对于范围(1)中的i:
e=敌人()
所有精灵。添加(e)
添加(e)
运行=真
尽管如此:
对于pygame.event.get()中的事件:
如果event.type==QUIT或(event.type==KEYUP和event.key==K_ESCAPE):
运行=错误
app_quit()
elif event.type==pygame.KEYDOWN:
如果event.key==pygame.K_空间:
player.shootPlayer()
如果event.key==pygame.K_选项卡:
敌人,敌人
allSprites.update()
屏幕填充(黑色)
所有精灵。绘制(屏幕)
pygame.display.flip()
pygame.quit()
更改行:

enemy.shoot()


这将调用
shoot()
方法,从你的
敌人

敌人
中随机抽取一个精灵
pygame.sprite.Group
。你凭什么认为它有这个属性?
random.choice(enemy.sprites()).shoot()