Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我的精灵检查器没有';行不通_Python_Python 2.7_Pygame_Sprite - Fatal编程技术网

Python 我的精灵检查器没有';行不通

Python 我的精灵检查器没有';行不通,python,python-2.7,pygame,sprite,Python,Python 2.7,Pygame,Sprite,我已经创建了代码来查看我的外星人是否已经死亡,但是它不起作用,任何人都能看到这个问题 代码: 敌人=pygame.sprite.Group(外星人) 如果len(敌人)=(screenrect.right-5): self.speed=-1 self.rect.top+=self.rect.height 如果self.rect.left screenrect.bottom: self.kill() i=随机。随机范围(1000) j=self.rect.centerx 如果i==1: 激光炸弹=

我已经创建了代码来查看我的外星人是否已经死亡,但是它不起作用,任何人都能看到这个问题

代码:

敌人=pygame.sprite.Group(外星人)
如果len(敌人)=(screenrect.right-5):
self.speed=-1
self.rect.top+=self.rect.height
如果self.rect.left screenrect.bottom:
self.kill()
i=随机。随机范围(1000)
j=self.rect.centerx
如果i==1:
激光炸弹=炸弹(j,自校正底部)
所有精灵。添加(激光炸弹)
外星人。添加(激光炸弹)
职业枪(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=加农炮
self.rect=self.image.get_rect()
self.rect.bottom=screenrect.bottom
self.rect.centerx=screenrect.centerx
自身速度=0
def更新(自我):
self.rect.centerx+=self.speed
如果self.rect.right>=screenrect.right:
self.rect.centerx=0
如果self.rect.right为0:
寿命-=1
#爆炸。玩()
explosion2=爆炸(player.rect.centerx,player.rect.centery)
所有精灵。添加(分解2)
player.kill()
射杀
如果寿命>0:
ready=Msg(“用力推!!。”)
ready.update()
allsprites.update()
所有精灵。绘制(屏幕)
score.update()
pygame.display.flip()
炸弹中的物品:
项目.kill()
而1:
event=pygame.event.wait()
如果event.type==pygame.KEYDOWN:
打破
玩家=枪()
爆炸
所有精灵。添加(玩家,快照)
如果shot.rect.top为0:
银幕布利特(男性,(0,0))
allsprites.update()
所有精灵。绘制(屏幕)
score.update()
#将循环设置为每秒“fps”个循环
时钟滴答声(fps)
#更新显示
pygame.display.flip()
#结束游戏
pygame.quit()
这是“pythonic”方式,因为空列表是假的:

if not enemies:
            print("game over")
            gameover()

杀死外星人的代码在哪里?

我注意到你在做外星人。添加(激光炸弹),但只有在hit2成功时,激光炸弹才会被清除。尝试在更新函数中为Bomb类添加一个self.kill(),就像在Pi类中一样。当我输入时,会出现此错误,代码:hit3=pygame.sprite.sprite.groups(Pi),如果len(hit3)错误:TypeError:unbound method groups()必须以Sprite实例作为第一个参数调用(改为使用类型instance)I beleieve是否要使用hit3=pygame.Sprite.Group(Pi)?
#MathsVaders

import pygame, random, time
from pygame.locals import *
import Databaseconnector
import tkMessageBox

pygame.init()

# set up the graphics window
size = [800, 595]
screen = pygame.display.set_mode(size, 0)
screenrect = screen.get_rect()
pygame.display.set_caption("Mathsvaders")



# set some variables
done = False
life = 3

aliens = pygame.sprite.Group()
allsprites = pygame.sprite.Group()
bombs = pygame.sprite.Group()
green = [0, 255, 0]
white = [255, 255, 255]

# create a timer to control how often the screen updates
clock = pygame.time.Clock()
fps = 100

# loads images to use in the game which link in with my classes(further down)
cannon = pygame.image.load("spaceship.png").convert()
cannon.set_colorkey(white)
blast = pygame.image.load("blast.png").convert_alpha()
boom = pygame.image.load("expl.png").convert_alpha()
bomb = pygame.image.load("missile_player.png").convert_alpha()
back = pygame.image.load("rsz_space.png").convert()
enemy = pygame.image.load("sii.png").convert_alpha()
lives2 = pygame.image.load("alien2.png").convert()
lives2.set_colorkey(white)
lives3 = pygame.image.load("alien3.png").convert()
lives3.set_colorkey(white)
lives1 = pygame.image.load("alien1.png").convert()
lives1.set_colorkey(white)

# (Classes)
# the explosion class
class Explosion(pygame.sprite.Sprite):
        def __init__(self, x, y):
                pygame.sprite.Sprite.__init__(self)
                self.image = boom
                self.rect = self.image.get_rect()
                self.rect.centerx = x
                self.rect.centery = y
                self.count = 6

        def update(self):
                self.count -= 1
                if self.count < 1:
                        self.kill()

class scoreClass:
        def __init__(self):
                self.value = 0
                # set a font, default font size 28
                self.font = pygame.font.Font(None, 28)

        def update(self):
                text = self.font.render("Score: %s" % self.value, True, (green))
                textRect = text.get_rect()
                textRect.centerx = screenrect.centerx
                screen.blit(text, textRect)

class Msg:
        def __init__(self, words):
                # set a font, default font size 28
                self.font = pygame.font.Font(None, 28)
                self.text = self.font.render(words, True, (green))
                self.textRect = self.text.get_rect()

        def update(self):
                self.textRect.centerx = screenrect.centerx
                self.textRect.centery = screenrect.centery
                screen.blit(self.text, self.textRect)

# the invader class
class Pi(pygame.sprite.Sprite):
        def __init__(self, x, y):
                pygame.sprite.Sprite.__init__(self)
                aliens.add(self)
                self.image = enemy
                self.rect = self.image.get_rect()
                self.rect.left = x
                self.rect.top = y
                self.speed = 1

        def update(self):
                self.rect.right += self.speed
                if self.rect.right >= (screenrect.right -5):
                        self.speed = -1
                        self.rect.top += self.rect.height
                if self.rect.left <= (screenrect.left +5):
                        self.speed = 1
                        self.rect.top += self.rect.height
                if self.rect.top > screenrect.bottom:
                        self.kill()
                i = random.randrange(1000)
                j = self.rect.centerx
                if i == 1:
                        laser_bomb = Bomb(j, self.rect.bottom)
                        allsprites.add(laser_bomb)
                        aliens.add(laser_bomb)

class Gun(pygame.sprite.Sprite):
        def __init__(self):
                pygame.sprite.Sprite.__init__(self)
                self.image = cannon
                self.rect = self.image.get_rect()
                self.rect.bottom = screenrect.bottom
                self.rect.centerx = screenrect.centerx
                self.speed=0

        def update(self):
                self.rect.centerx += self.speed
                if self.rect.right >= screenrect.right:
                        self.rect.centerx = 0
                if self.rect.right <= 0:
                        self.rect.right = screenrect.right

# bomb class
class Bomb(pygame.sprite.Sprite):
        def __init__(self, x, y):
                pygame.sprite.Sprite.__init__(self)
                self.image = bomb
                self.rect = self.image.get_rect()
                self.rect.centerx = x
                self.rect.centery = y
                bombs.add(self)

        def update(self):
                self.rect.centery +=1

# the laser blast class
class Blast(pygame.sprite.Sprite):
        def __init__(self):
                pygame.sprite.Sprite.__init__(self)
                self.image = blast
                self.image.set_colorkey(white)
                self.rect = self.image.get_rect()
                self.rect.top = (player.rect.top + 5)
                self.rect.centerx = player.rect.centerx
                self.speed = 0

        def update(self):
                if self.speed == 0:
                        self.rect.centerx = player.rect.centerx
                self.rect.top -= self.speed

# function to make a sheet of invaders
def invade():
        for j in range(10, 200, 120):
                for i in range(10):
                        aliens.add(Pi((i*70)+10, j))


def gameover():
        message = Msg("Game Over")
        message.update()
        player.kill()
        shot.kill()
        SQL = 'INSERT INTO TblScore(Score, StudentID) VALUES (' + str(score.value) + ', ' + str(8) + ')'
        Databaseconnector.INSERT(SQL)

        #pygame.quit()

##def gameover():
##      message = Msg("Game Over")
##      message.update()
##      player.kill()
##      shot.kill()
##        SQL = 'INSERT INTO TblScore(Score, StudentID) VALUES (' + str(score.value) + ', ' + str(8) + ')'
##        Databaseconnector.INSERT(SQL)
##
##        #pygame.quit()

def gamewon():
   # sprites(aliens) == 0
    #sprites.aliens == 0
    message = Msg("YOU WON, YOUR SCORE WAS " + score +  " WELL DONE")
    message.update
    aliens.kill()
    shot.kill()
    pygame.quit()



# pre-game window
invade()

message = Msg("Press a key to play.")
allsprites.add(aliens)
key = True

while key:
        screen.blit(back, (0,0))
        for event in pygame.event.get():
                if event.type == pygame.QUIT:
                        pygame.quit()
                if event.type == pygame.KEYDOWN:
                        for item in (aliens):
                                item.kill()
                        key = False

        allsprites.update()
        allsprites.draw(screen)
        message.update()

                # set the loop to 40 cycles per second
        clock.tick(fps)

                #  update the display
        pygame.display.flip()


# Main Game Starts Here

score = scoreClass()
player = Gun()
shot = Blast()
invade()
allsprites.add(player, aliens, shot)


while done==False:
        screen.blit(back, (0,0))

        for event in pygame.event.get():
                if event.type == pygame.QUIT:
                        done=True

        if life <= 0:
                gamewon()

##        elif allsprites == 0:
##            gamewon()

        else:
                # shoots laser missile
                if event.type == pygame.KEYDOWN:
                        if event.key == pygame.K_UP:
                                if shot.speed == 0:
                                        shot.speed = 7
                                        #laser.play()

                        if event.key == pygame.K_LEFT:
                                player.speed = -3
                        if event.key == pygame.K_RIGHT:
                                player.speed = 3

                if event.type == pygame.KEYUP:
                        if event.key == pygame.K_LEFT:
                                player.speed = 0
                        if event.key == pygame.K_RIGHT:
                                player.speed = 0

                hit = pygame.sprite.spritecollide(shot, aliens, 1)
                if len(hit) > 0:
                        explosion1 = Explosion(shot.rect.centerx, shot.rect.top)
                        score.value += 1500
                        shot.kill()
                        #explode.play()
                        shot = Blast()
                        allsprites.add(shot, explosion1)


                hit2 = pygame.sprite.spritecollide(player, aliens, 1)
                if len(hit2) > 0:
                        life -= 1
                        #explode.play()
                        explosion2 = Explosion(player.rect.centerx, player.rect.centery)
                        allsprites.add(explosion2)
                        player.kill()
                        shot.kill()
                        if life > 0:
                                ready = Msg("Push Harder !!.")
                                ready.update()
                                allsprites.update()
                                allsprites.draw(screen)
                                score.update()
                                pygame.display.flip()
                                for item in bombs:
                                        item.kill()
                                while 1:
                                        event = pygame.event.wait()
                                        if event.type == pygame.KEYDOWN:
                                                break
                                player = Gun()
                                shot = Blast()
                                allsprites.add(player, shot)

                if shot.rect.top <= screenrect.top:
                        shot.kill()
                        shot = Blast()
                        allsprites.add(shot)

        if life == 2:
                men = lives2
        if life == 1:
                men = lives1
        if life == 3:
                men = lives3

        if life > 0:
                screen.blit(men, (0,0))

        allsprites.update()
        allsprites.draw(screen)
        score.update()

        # set the loop to "fps" cycles per second
        clock.tick(fps)
        #  update the display
        pygame.display.flip()



# close pygame
pygame.quit()
if not enemies:
            print("game over")
            gameover()