Pythonソース---航空機大戦ゲーム

6923 ワード

plane_sprites.pyファイルの内容:
import random
import pygame

#          
SCREEN_RECT = pygame.Rect(0,0,346,567)
#          
FRAME_PRE_SEC = 60

#             
CREATE_ENEMY_EVENT = pygame.USEREVENT
#               
HERO_FIRE_EVENT = pygame.USEREVENT + 1

"""        """

#        pygame.sprite.Sprite 
class GameSprite(pygame.sprite.Sprite):
    # 1.     :    
    def __init__(self,image_name,speed=1):
        #           
        super().__init__()
        #       ;  ,  ,  
        self.image = pygame.image.load(image_name)
        self.rect = self.image.get_rect()
        self.speed = speed
    # 2.    
    def update(self):
        #            
        self.rect.y += self.speed

"""    """

#   GameSprite 
class Background(GameSprite):
    def __init__(self,is_alt=False):
        # 1.              
        super().__init__("./images/background.png")
        # 2.        ,   ,        
        if is_alt:
            self.rect.y = -self.rect.height
    def update(self):
        # 1.       ,            
        super().update()
        # 2.        
        if self.rect.y >= SCREEN_RECT.height:
            #       ,            
            self.rect.y = -self.rect.height

"""    """

class Enemy(GameSprite):
    def __init__(self):
        # 1.      ,      
        super().__init__("./images/enemy1.png")
        # 2.           
        self.speed = random.randint(1,3)
        # 3.         
        #      y
        self.rect.bottom = 0
        #      x
        max_x = SCREEN_RECT.width - self.rect.width
        self.rect.x = random.randint(0,max_x)
    def update(self):
        # 1.      ,            
        super().update()
        # 2.        ,  ,          
        if self.rect.y >= SCREEN_RECT.height:
            # print("    ,           ...")
            #              ,         
            self.kill()
    def __del__(self):
        # print("     %s" % self.rect)
        pass

"""    """

class Hero(GameSprite):
    def __init__(self):
        # 1.      ,  image speed
        super().__init__("./images/me1.png",0)
        # 2.         
        #      x
        self.rect.centerx = SCREEN_RECT.centerx
        #      y
        self.rect.bottom = SCREEN_RECT.bottom -120
        # 3.        
        self.bullets_group = pygame.sprite.Group()
    def update(self):
        #       
        self.rect.x += self.speed
        #           
        #      
        if self.rect.x < 0:
            self.rect.x = 0
        #      
        elif self.rect.right > SCREEN_RECT.right:
            self.rect.right = SCREEN_RECT.right
    def fire(self):
        print("    ...")
        for i in range(3):
            # 1.      
            bullet = Bullet()
            # 2.         
            bullet.rect.bottom = self.rect.y - 20*i
            bullet.rect.centerx = self.rect.centerx
            # 3.         
            self.bullets_group.add(bullet)


"""    """

class Bullet(GameSprite):
    def __init__(self):
        #       ,           
        super().__init__("./images/bullet1.png",-2)
    def update(self):
        # 1.      ,            (       )
        super().update()
        # 2.          
        if self.rect.bottom < 0:
            # print("    ,           ...")
            #              ,         
            self.kill()
    def __del__(self):
        print("     ...")
        pass

plane_mian.pyファイルの内容:
import pygame
from plane_sprites import *

"""        """
class PlaneGame(object):
    def __init__(self):
        print("     ")
        # 1.      ;SCREEN_RECT.size:          
        self.screen = pygame.display.set_mode(SCREEN_RECT.size)
        # 2.      
        self.clock = pygame.time.Clock()
        # 3.      ,        
        self.__create_sprites()
        #        
        #     ;1000ms=1s
        pygame.time.set_timer(CREATE_ENEMY_EVENT,1000)
        #       ;500ms=0.5s
        pygame.time.set_timer(HERO_FIRE_EVENT,500)
    #       ,        
    def __create_sprites(self):
        #       
        bg1 = Background()
        bg2 = Background(is_alt=True)
        #        
        self.back_group = pygame.sprite.Group(bg1,bg2)
        #        
        self.enemy_group = pygame.sprite.Group()
        #           
        self.hero = Hero()
        self.hero_group = pygame.sprite.Group(self.hero)
    def start_game(self):
        print("    ...")
        #     
        while True:
            # 1.      
            self.clock.tick(FRAME_PRE_SEC)
            # 2.    
            self.__event_handler()
            # 3.    
            self.__check_collide()
            # 4.  /     
            self.__update_sprites()
            # 5.    
            pygame.display.update()
    def __event_handler(self):
        #     
        for event in pygame.event.get():
            #          "    "
            if event.type == pygame.QUIT:
                #       
                PlaneGame.__game__over()
            #       
            #          “          ”
            elif event.type == CREATE_ENEMY_EVENT:
                # print("    ...")
                #   Enemy ,      
                enemy = Enemy()
                #               
                self.enemy_group.add(enemy)
            #       
            #          “            ”
            elif event.type == HERO_FIRE_EVENT:
                self.hero.fire()
        #              
        keys_pressed = pygame.key.get_pressed()
        #               1
        #   
        if keys_pressed[pygame.K_RIGHT]:
            self.hero.speed = 2
        #   
        elif keys_pressed[pygame.K_LEFT]:
            self.hero.speed = -2
        else:
            self.hero.speed = 0

    def __check_collide(self):
        # 1.      
        pygame.sprite.groupcollide(self.hero.bullets_group,self.enemy_group,True,True)
        # 2.      ;       
        enemies = pygame.sprite.spritecollide(self.hero,self.enemy_group,True)
        #          
        if len(enemies) > 0:
            # 1.    
            self.hero.kill()
            # 2.    
            PlaneGame.__game__over()
    def __update_sprites(self):
        self.back_group.update()
        self.back_group.draw(self.screen)
        self.enemy_group.update()
        self.enemy_group.draw(self.screen)
        self.hero_group.update()
        self.hero_group.draw(self.screen)
        self.hero.bullets_group.update()
        self.hero.bullets_group.draw(self.screen)
    @staticmethod      #     
    def __game__over():
        print("    ")
        pygame.quit()
        exit()

if __name__ == '__main__':
    #       
    game = PlaneGame()
    #     
    game.start_game()