python pygame在射击外星人时更新分数

python pygame在射击外星人时更新分数,python,pygame,Python,Pygame,我正在做拍摄外星人的功能,然后更新屏幕上的分数 我的想法是 在class Game\u状态下为初始设置self.score=0 在添加分数的类设置中设置self.alien_分数=50 设置self.score=pygame.font.font(无,80)。渲染(str(state.score),True,self.color)在类记分板中将分数显示在屏幕上 检查class函数中的collisions=pygame.sprite.groupcollisde(子弹、外星人、假、真) 如果发生碰撞:

我正在做拍摄外星人的功能,然后更新屏幕上的分数

我的想法是

  • class Game\u状态下为初始设置
    self.score=0
  • 在添加分数的
    类设置中设置
    self.alien_分数=50
  • 设置
    self.score=pygame.font.font(无,80)。渲染(str(state.score),True,self.color)
    类记分板中
    将分数显示在屏幕上
  • 检查
    class函数中的
    collisions=pygame.sprite.groupcollisde(子弹、外星人、假、真)
  • 如果发生碰撞:
    state.score+=setting.alien_score
    sb=记分牌(设置、状态)`
    
    当子弹射中外星人后,在屏幕上添加分数并更新分数

    班级记分板
    如下所示:

    class记分板():
    定义初始化(自身、设置、状态):
    self.color=(0,0,0)
    self.score=pygame.font.font(无,80).render(str(state.score),True,self.color)
    self.rect=self.score.get_rect()
    self.rect.top=setting.screen\u rect.top
    self.rect.right=setting.screen_rect.right-30
    def blit_分数(自身、设置):
    setting.screen.blit(self.score、self.rect)
    
    现在我这样做了,但是当子弹射中外星人时,屏幕上没有分数更新,值总是0,我不知道是什么原因造成的? 使用
    sb=Scoreboard(设置,状态)
    安装课堂的方法是否错误

    如果我在
    \uuuu init\uuuu

    当我将
    课堂记分板修改为:

    class Scoreboard():
        def __init__(self,setting,state):
            self.color = (0,0,0)
            self.prep_score(setting,state)
        def prep_score(self,setting,state):
            self.score = pygame.font.Font(None,80).render(str(state.score),True,self.color)
            self.rect = self.score.get_rect()
            self.rect.top = setting.screen_rect.top
            self.rect.right = setting.screen_rect.right-30
        def blit_score(self,setting):
            setting.screen.blit(self.score,self.rect)
    
    然后在
    类函数中更改check
    collisions=pygame.sprite.groupcollisde(子弹、外星人、假、真)

    if collisions :
        state.score += setting.alien_score
        sb.prep_score(setting,state)
    
    分数显示正确,当
    \uuuuu init\uuuuu
    中的整个参数如我显示的第一个错误示例所示时,我可以通过哪种方式更新分数

    以下是代码:

    #!/usr/bin/python
    import sys,os
    import pygame
    from time import sleep
    
    
    class Setting():
        def __init__(self,width,height):
            self.w=width
            self.h=height
            self.flag=pygame.RESIZABLE
            self.color=(255,255,255)
            self.speed=1.5
            self.ship=3
            self.screen=pygame.display.set_mode((self.w,self.h),self.flag)
            self.screen_rect=self.screen.get_rect()
            pygame.display.set_caption("Muhaha")
            self.dynamic_setting()
        def dynamic_setting(self):
            self.alien_score = 50
    class Game_state():
        def __init__(self,setting):
            self.reset(setting)
    
        def reset(self,setting):
            self.ship_left = setting.ship
            self.score = 0
    
    class Scoreboard():
        def __init__(self,setting,state):
            self.color = (0,0,0)
            self.score = pygame.font.Font(None,80).render(str(state.score),True,self.color)
            self.rect = self.score.get_rect()
            self.rect.top = setting.screen_rect.top
            self.rect.right = setting.screen_rect.right-30
        def blit_score(self,setting):
            setting.screen.blit(self.score,self.rect)
    
    class Ship():
        def __init__(self,screen,setting):
            temp=pygame.image.load("/home/finals/python/alien/image/title.jpg").convert_alpha()
            self.ship=pygame.transform.smoothscale(temp,(200,200))
            self.rect=self.ship.get_rect()
    
    
            '''setting the ship position''' 
            self.rect.center=setting.screen_rect.center
            self.rect.bottom=setting.screen_rect.bottom
            '''setting the temp x,y to store value'''
            self.x=float(self.rect.centerx)
            self.y=float(self.rect.centery)
    
    
    
    class Bullet(pygame.sprite.Sprite):
        def __init__(self,setting,ship):
            super().__init__()
            self.rect=pygame.Rect(0,0,3,10)
            self.rect.centerx=ship.rect.centerx
            self.rect.top=ship.rect.top
            self.color=(0,0,0)
            self.speed=2
            '''setting the temp y to store speed'''
            self.y=float(self.rect.centery)
        def move_bullet(self):
            self.y -= self.speed
            self.rect.y= self.y
        def draw_bullet(self,setting):
            pygame.draw.rect(setting.screen,self.color,self.rect)
    
    class Alien(pygame.sprite.Sprite):
        def __init__(self):
            super().__init__()
            pic=pygame.image.load("/home/finals/python/alien/image/ship.jpg").convert_alpha()
            self.image=pygame.transform.smoothscale(pic,(100,100))
            self.rect=self.image.get_rect()
            self.x = float(self.rect.x)
            self.rect.x=(self.rect.width)
            self.speed=1
            self.direction = 1
    
        def create(self,setting,aliens):
            '''calculate how many aliens can be placed on screen''' 
            spacex=setting.w-(self.rect.x)*2
            spacey=(setting.h)/2-self.rect.y
            alien_number=int(spacex/(2*(self.rect.width)))
            alien_row=int(spacey/(2*(self.rect.height)))
            for row in range(alien_row):
               for number in range(alien_number):
                   alien=Alien()
                   '''setting position for every alien'''
                   alien.x=alien.rect.x+2*alien.rect.width*number
                   alien.rect.x=alien.x
    
                   alien.rect.y=alien.rect.y+2*alien.rect.height*row
                   aliens.add(alien)
    
        def update(self):
          '''update alien position '''
          self.x += (self.speed*self.direction)
          self.rect.x =self.x
    
    
    class Function():
        def __init__(self):
           '''setting lable for ship move'''
           self.moving_up   = False
           self.moving_down = False
           self.moving_left = False
           self.moving_right = False
        def event(self,bullets,setting,ship):      
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    if event.key ==pygame.K_z:
                        if len(bullets) < 10:
                           bullets.add(Bullet(setting,ship))
                    elif event.key == pygame.K_UP:
                        self.moving_up=True
                    elif event.key == pygame.K_DOWN:
                        self.moving_down=True
                    elif event.key == pygame.K_LEFT:
                        self.moving_left=True
                    elif event.key == pygame.K_RIGHT:
                        self.moving_right=True
                    elif event.key == pygame.K_ESCAPE:
                           sys.exit()
    
                elif event.type == pygame.KEYUP:
                    if event.key == pygame.K_UP:
                        self.moving_up=False
                    elif event.key == pygame.K_DOWN:
                        self.moving_down=False
                    elif event.key == pygame.K_LEFT:
                        self.moving_left=False
                    elif event.key == pygame.K_RIGHT:
                        self.moving_right=False
    
        def move(self,setting,ship):
            '''set the ship not move out of the screen'''
            if self.moving_up == True and ship.rect.top >= 0:
               ship.y -= setting.speed
            if self.moving_down == True and ship.rect.bottom <= setting.h:
                ship.y += setting.speed
            if self.moving_left == True and ship.rect.left >= 0:
                ship.x -= setting.speed
            if self.moving_right == True and ship.rect.right <= setting.w:
                ship.x += setting.speed
            '''update ship position'''
            ship.rect.centerx=ship.x
            ship.rect.centery=ship.y
    
        def check_bullet_collide(setting,alien,state,sb,bullets,aliens):
            '''check bullets and aliens collide'''
            collisions=pygame.sprite.groupcollide(bullets,aliens,False,True)
            '''add the score and update it'''
            if collisions :
                state.score += setting.alien_score
                sb=Scoreboard(setting,state)
            '''reset the bullets and aliens '''
            if len(aliens) ==0:
                bullets.empty()
                alien.create(setting,aliens)
    
        def blit_bullet(setting,alien,state,sb,bullets,aliens):
            '''create bullet'''           
            for bullet in bullets.sprites():
                 pygame.draw.rect(setting.screen,bullet.color,bullet.rect)
                 bullet.y -= bullet.speed
                 bullet.rect.y=bullet.y
            '''check the bullets whether in screen'''
            for bullet in bullets:
                if bullet.rect.y <= 0:
                    bullets.remove(bullet)
            Function.check_bullet_collide(setting,alien,state,sb,bullets,aliens)
    
        def check_alien_edge(setting,aliens):
            '''check the alien touch the edge of screen'''
            for alien in aliens.sprites():
                if alien.x > setting.w or alien.x < 0:
                   Function.change_alien_direction(aliens)
                   break
    
        def change_alien_direction(aliens):
            '''if touch the screen move down and change the direction'''
            for alien in aliens.sprites():
                alien.rect.y +=50
                alien.direction *= -1
    
        def update_alien(setting,alien,aliens):
            Function.check_alien_edge(setting,aliens)
            aliens.update()
    
        def blit_alien(setting,alien,aliens):
            aliens.draw(setting.screen)
    
    
    
        def ckeck_ship_collide(setting,ship,alien,state,aliens):
            if pygame.sprite.spritecollideany(ship,aliens):
               state.ship_left -= 1
               if state.ship_left >= 0:
                   aliens.empty()
                   alien.create(setting,aliens)
                   state.ship_left -= 1
    
                   ship.rect.center = ship.screen_rect.center
                   ship.rect.bottom = ship.screen_rect.bottom
    
                   ship.x = float(ship.rect.centerx)
                   ship.y = float(ship.rect.centery)
    
                   sleep(0.5)
               else:
                   print("Gamer over")
    
        def blit_screen(self,setting,ship,alien,sb,bullets,aliens):
            setting.screen.fill((255,255,255))
            setting.screen.blit(ship.ship,ship.rect)
            setting.screen.blit(sb.score,sb.rect)
            self.event(bullets,setting,ship)
            Function.blit_alien(setting,alien,aliens)
    
    
    def game():
        pygame.init()
        setting=Setting(1200,800)
        screen=setting.screen 
        state=Game_state(setting)
        sb=Scoreboard(setting,state)
        ship=Ship(screen,setting)
        function=Function()
        bullet=Bullet(setting,ship)
        bullets=pygame.sprite.Group()
        alien=Alien()
        aliens=pygame.sprite.Group()
        alien.create(setting,aliens)                  
    
        while True:
            function.blit_screen(setting,ship,alien,sb,bullets,aliens)
            function.move(setting,ship)
            Function.update_alien(setting,alien,aliens)
            Function.blit_bullet(setting,alien,state,sb,bullets,aliens)
            Function.ckeck_ship_collide(setting,ship,alien,state,aliens)
            pygame.display.flip()
    game()
    
    #/usr/bin/python
    导入系统,操作系统
    导入pygame
    从时间上导入睡眠
    类设置():
    定义初始值(自身、宽度、高度):
    self.w=宽度
    self.h=高度
    self.flag=pygame.RESIZABLE
    self.color=(255255)
    自身速度=1.5
    self.ship=3
    self.screen=pygame.display.set_模式((self.w,self.h),self.flag)
    self.screen\u rect=self.screen.get\u rect()
    pygame.display.set_标题(“Muhaha”)
    self.dynamic_设置()
    def动态_设置(自身):
    self.u分数=50
    类Game_state():
    定义初始化(自我,设置):
    自复位(设置)
    def重置(自我,设置):
    self.ship_left=设置.ship
    self.score=0
    班级记分板():
    定义初始化(自身、设置、状态):
    self.color=(0,0,0)
    self.score=pygame.font.font(无,80).render(str(state.score),True,self.color)
    self.rect=self.score.get_rect()
    self.rect.top=setting.screen\u rect.top
    self.rect.right=setting.screen_rect.right-30
    def blit_分数(自身、设置):
    setting.screen.blit(self.score、self.rect)
    船舶等级():
    定义初始化(自身、屏幕、设置):
    temp=pygame.image.load(“/home/finals/python/alien/image/title.jpg”).convert_alpha()
    self.ship=pygame.transform.smoothscale(temp,(200200))
    self.rect=self.ship.get_rect()
    “设置船舶位置”
    self.rect.center=setting.screen\u rect.center
    self.rect.bottom=setting.screen\u rect.bottom
    ''将温度x,y设置为存储值''
    self.x=浮动(self.rect.centerx)
    self.y=浮动(self.rect.centery)
    类子弹(pygame.sprite.sprite):
    定义初始(自我、设置、装运):
    super()。\uuuu init\uuuuu()
    self.rect=pygame.rect(0,0,3,10)
    self.rect.centerx=ship.rect.centerx
    self.rect.top=ship.rect.top
    self.color=(0,0,0)
    自身速度=2
    ''将温度y设置为存储速度''
    self.y=浮动(self.rect.centery)
    def move_项目符号(自身):
    self.y-=自速度
    self.rect.y=self.y
    def draw_项目符号(自身,设置):
    pygame.draw.rect(设置.屏幕,self.color,self.rect)
    类外星人(pygame.sprite.sprite):
    定义初始化(自):
    super()。\uuuu init\uuuuu()
    pic=pygame.image.load(“/home/finals/python/alien/image/ship.jpg”).convert_alpha()
    self.image=pygame.transform.smoothscale(图,(100100))
    self.rect=self.image.get_rect()
    self.x=float(self.rect.x)
    self.rect.x=(self.rect.width)
    自身速度=1
    自我定向=1
    def创建(自身、设置、外部):
    ''计算屏幕上可以放置多少外星人''
    spacex=设置.w-(自校正x)*2
    spacey=(setting.h)/2-self.rect.y
    异形数=int(空格x/(2*(自矩形宽度)))
    异形行=int(空格Y/(2*(自校正高度)))
    对于范围内的行(外星行):
    对于范围内的编号(外来编号):
    外星人
    ''为每个外国人设置位置''
    alien.x=alien.rect.x+2*alien.rect.width*数字
    alien.rect.x=alien.x
    alien.rect.y=alien.rect.y+2*alien.rect.height*行
    外星人。添加(外星人)
    def更新(自我):
    ''更新外星位置''
    self.x+=(自速度*自方向)
    self.rect.x=self.x
    类函数():
    定义初始化(自):
    ''为船舶移动设置标签''
    self.moving_up=False
    self.moving_down=False
    self.moving_left=False
    self.moving_right=False
    def事件(自身、项目符号、设置、装运):
    对于pygame.event.get()中的事件:
    如果event.type==pygame.QUIT:
    sys.exit()
    elif event.type==pygame.KEYDOWN:
    如果event.key==pygame.K_z:
    如果透镜(子弹)<10:
    项目符号。添加(项目符号(设置,装运))
    elif event.key==pygame.K_UP:
    self.moving_up=True
    
    import sys,os
    import pygame
    from time import sleep
    
    
    class Setting():
        def __init__(self,width,height):
            self.w=width
            self.h=height
            self.flag=pygame.RESIZABLE
            self.color=(255,255,255)
            self.speed=1.5
            self.ship=3
            self.screen=pygame.display.set_mode((self.w,self.h),self.flag)
            self.screen_rect=self.screen.get_rect()
            pygame.display.set_caption("Muhaha")
            self.dynamic_setting()
        def dynamic_setting(self):
            self.alien_score = 50
    class Game_state():
        def __init__(self,setting):
            self.reset(setting)
    
        def reset(self,setting):
            self.ship_left = setting.ship
            self.score = 0
    
    class Scoreboard():
        def __init__(self,setting,state):
            self.color = (0,0,0)
            self.score = pygame.font.Font(None,80).render(str(state.score),True,self.color)
            self.rect = self.score.get_rect()
            self.rect.top = setting.screen_rect.top
            self.rect.right = setting.screen_rect.right-30
        def blit_score(self,setting):
            setting.screen.blit(self.score,self.rect)
    
    class Ship():
        def __init__(self,screen,setting):
            temp=pygame.image.load("/home/finals/python/alien/image/title.jpg").convert_alpha()
            self.ship=pygame.transform.smoothscale(temp,(200,200))
            self.rect=self.ship.get_rect()
    
    
            '''setting the ship position''' 
            self.rect.center=setting.screen_rect.center
            self.rect.bottom=setting.screen_rect.bottom
            '''setting the temp x,y to store value'''
            self.x=float(self.rect.centerx)
            self.y=float(self.rect.centery)
    
    
    
    class Bullet(pygame.sprite.Sprite):
        def __init__(self,setting,ship):
            super().__init__()
            self.rect=pygame.Rect(0,0,3,10)
            self.rect.centerx=ship.rect.centerx
            self.rect.top=ship.rect.top
            self.color=(0,0,0)
            self.speed=2
            '''setting the temp y to store speed'''
            self.y=float(self.rect.centery)
        def move_bullet(self):
            self.y -= self.speed
            self.rect.y= self.y
        def draw_bullet(self,setting):
            pygame.draw.rect(setting.screen,self.color,self.rect)
    
    class Alien(pygame.sprite.Sprite):
        def __init__(self):
            super().__init__()
            pic=pygame.image.load("/home/finals/python/alien/image/ship.jpg").convert_alpha()
            self.image=pygame.transform.smoothscale(pic,(100,100))
            self.rect=self.image.get_rect()
            self.x = float(self.rect.x)
            self.rect.x=(self.rect.width)
            self.speed=1
            self.direction = 1
    
        def create(self,setting,aliens):
            '''calculate how many aliens can be placed on screen''' 
            spacex=setting.w-(self.rect.x)*2
            spacey=(setting.h)/2-self.rect.y
            alien_number=int(spacex/(2*(self.rect.width)))
            alien_row=int(spacey/(2*(self.rect.height)))
            for row in range(alien_row):
            for number in range(alien_number):
                alien=Alien()
                '''setting position for every alien'''
                alien.x=alien.rect.x+2*alien.rect.width*number
                alien.rect.x=alien.x
    
                alien.rect.y=alien.rect.y+2*alien.rect.height*row
                aliens.add(alien)
    
        def update(self):
        '''update alien position '''
        self.x += (self.speed*self.direction)
        self.rect.x =self.x
    
    
    class Function():
        def __init__(self,setting):
        '''setting lable for ship move'''
        self.moving_up   = False
        self.moving_down = False
        self.moving_left = False
        self.moving_right = False
        self.setting = setting
    
        def event(self,bullets,ship):      
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    if event.key ==pygame.K_z:
                        if len(bullets) < 10:
                        bullets.add(Bullet(setting,ship))
                    elif event.key == pygame.K_UP:
                        self.moving_up=True
                    elif event.key == pygame.K_DOWN:
                        self.moving_down=True
                    elif event.key == pygame.K_LEFT:
                        self.moving_left=True
                    elif event.key == pygame.K_RIGHT:
                        self.moving_right=True
                    elif event.key == pygame.K_ESCAPE:
                        sys.exit()
    
                elif event.type == pygame.KEYUP:
                    if event.key == pygame.K_UP:
                        self.moving_up=False
                    elif event.key == pygame.K_DOWN:
                        self.moving_down=False
                    elif event.key == pygame.K_LEFT:
                        self.moving_left=False
                    elif event.key == pygame.K_RIGHT:
                        self.moving_right=False
    
        def move(self,ship):
            '''set the ship not move out of the screen'''
            if self.moving_up == True and ship.rect.top >= 0:
            ship.y -= self.setting.speed
            if self.moving_down == True and ship.rect.bottom <= self.setting.h:
                ship.y += self.setting.speed
            if self.moving_left == True and ship.rect.left >= 0:
                ship.x -= self.setting.speed
            if self.moving_right == True and ship.rect.right <= self.setting.w:
                ship.x += self.setting.speed
            '''update ship position'''
            ship.rect.centerx=ship.x
            ship.rect.centery=ship.y
    
        def check_bullet_collide(self,alien,state,sb,bullets,aliens):
            '''check bullets and aliens collide'''
            collisions=pygame.sprite.groupcollide(bullets,aliens,False,True)
            '''add the score and update it'''
            if collisions :
                state.score += self.setting.alien_score
                sb=Scoreboard(self.setting,state)
            '''reset the bullets and aliens '''
            if len(aliens) ==0:
                bullets.empty()
                alien.create(self.setting,aliens)
    
        def blit_bullet(self,alien,state,sb,bullets,aliens):
            '''create bullet'''           
            for bullet in bullets.sprites():
                pygame.draw.rect(self.setting.screen,bullet.color,bullet.rect)
                bullet.y -= bullet.speed
                bullet.rect.y=bullet.y
            '''check the bullets whether in screen'''
            for bullet in bullets:
                if bullet.rect.y <= 0:
                    bullets.remove(bullet)
            self.check_bullet_collide(alien,state,sb,bullets,aliens)
    
        def check_alien_edge(self,aliens):
            '''check the alien touch the edge of screen'''
            for alien in aliens.sprites():
                if alien.x > self.setting.w or alien.x < 0:
                self.change_alien_direction(aliens)
                break
    
        def change_alien_direction(self,aliens):
            '''if touch the screen move down and change the direction'''
            for alien in aliens.sprites():
                alien.rect.y +=50
                alien.direction *= -1
    
        def update_alien(self,alien,aliens):
            self.check_alien_edge(aliens)
            aliens.update()
    
        def blit_alien(self,alien,aliens):
            aliens.draw(self.setting.screen)
    
        def ckeck_ship_collide(self,ship,alien,state,aliens):
            if pygame.sprite.spritecollideany(ship,aliens):
            state.ship_left -= 1
            if state.ship_left >= 0:
                aliens.empty()
                alien.create(self.setting,aliens)
                state.ship_left -= 1
    
                ship.rect.center = ship.screen_rect.center
                ship.rect.bottom = ship.screen_rect.bottom
    
                ship.x = float(ship.rect.centerx)
                ship.y = float(ship.rect.centery)
    
                sleep(0.5)
            else:
                print("Gamer over")
    
        def blit_screen(self,ship,alien,sb,bullets,aliens):
            self.setting.screen.fill((255,255,255))
            self.setting.screen.blit(ship.ship,ship.rect)
            self.setting.screen.blit(sb.score,sb.rect)
            self.event(bullets,ship)
            self.blit_alien(alien,aliens)
    
    
    def game():
        pygame.init()
        setting=Setting(1200,800)
        screen=setting.screen 
        state=Game_state(setting)
        sb=Scoreboard(setting,state)
        ship=Ship(screen,setting)
        function=Function(setting)
        bullet=Bullet(setting,ship)
        bullets=pygame.sprite.Group()
        alien=Alien()
        aliens=pygame.sprite.Group()
        alien.create(setting,aliens)                  
    
        while True:
            function.blit_screen(ship,alien,sb,bullets,aliens)
            function.move(ship)
            function.update_alien(alien,aliens)
            function.blit_bullet(alien,state,sb,bullets,aliens)
            function.ckeck_ship_collide(ship,alien,state,aliens)
            pygame.display.flip()
    game()