Python《飞机大战》(精简版)

前言:

无聊的时候学习了一下pygame开发小游戏,自我感觉挺不错的,借鉴网上《飞机大战》的思路,并对其进行改善,实现了自己的一个简单的《飞机大战》小程序。

说明:

  • 精灵类:

    • 基类:GameSprite(精灵)。
    • 派生类:Backgroud(背景)、Enemy(敌军飞机)、Hero(玩家)、Bullet(子弹)。
  • 功能:

    • 上下左右键移动飞机。
    • 当飞机击中敌机时得分加一,并且显示在屏幕上。
  • 素材下载地址:百度网盘 密码:5l5x

主程序:

import pygame
import sys
from plane_sprites import *

class PlaneGame(object):
    def __init__(self):
        print('game init!')
        pygame.font.init()
        self.font = pygame.font.SysFont("Arial", 50)
        self.screen = pygame.display.set_mode(Screen_rect.size)
        self.clock = pygame.time.Clock()
        self.__create_sprites()
        self.score = 0
        pygame.time.set_timer(Create_enemy_event, 1000)
        pygame.time.set_timer(Hero_fire_event, 500)
        
    def __create_sprites(self):
        bg1 = Background()
        bg2 = Background(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('game start!')
        while True:
            self.clock.tick(Frame_per_sec)
            self.__event_handler()
            self.__check_collide()
            self.__update_sprites()
            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:
                enemy = Enemy()
                self.enemy_group.add(enemy)
            elif event.type == Hero_fire_event:
                self.hero.fire()
        keys_pressed = pygame.key.get_pressed()
        if keys_pressed[pygame.K_RIGHT]:
            self.hero.speed = 2
        elif keys_pressed[pygame.K_LEFT]:
            self.hero.speed = -2
        elif keys_pressed[pygame.K_UP]:
            self.hero.speed1 = -2
        elif keys_pressed[pygame.K_DOWN]:
            self.hero.speed1 = 2
        else:
            self.hero.speed = 0
            self.hero.speed1 = 0

    def __display_score(self):
        final_text2 = "Score:  " + str(self.score)
        ft2_font = pygame.font.SysFont("Arial", 30)  
        ft2_surf = self.font.render(final_text2, 1, (253, 177, 6)) 
        self.screen.blit(ft2_surf, [self.screen.get_width() / 2 - ft2_surf.get_width() / 2, 200]) 
        pygame.display.flip()

    def __check_collide(self):
        if pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True):
            self.score += 1
        enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group ,True)
        if len(enemies) > 0:
            self.hero.kill()
            PlaneGame.__game_over()
        else:
            PlaneGame.__display_score(self)

    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.update()
        self.hero.bullets.draw(self.screen)

    @staticmethod
    def __game_over():
        print('game over!')
        pygame.quit()
        exit()

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

精灵类:

import random
import pygame
#屏幕大小
Screen_rect = pygame.Rect(0,0,480,700)
#屏幕刷新帧数
Frame_per_sec = 60
Create_enemy_event = pygame.USEREVENT
Hero_fire_event = pygame.USEREVENT+1

class GameSprite(pygame.sprite.Sprite):
    def __init__(self, image_name, speed = 1, speed1 = 1):
        super().__init__()
        self.image = pygame.image.load(image_name)
        self.rect = self.image.get_rect()
        self.speed = speed
        self.speed1 = speed1
    def update(self):
        self.rect.y += self.speed#在屏幕垂向移动

class Background(GameSprite):
    #游戏背景精灵
    def __init__(self, is_alt = False):
        super().__init__('./src/background.png')
        if is_alt:
            self.rect.y = -self.rect.height
    def update(self):
        super().update()
        if self.rect.y >= Screen_rect.height:
            self.rect.y = -self.rect.height

class Enemy(GameSprite):
    #敌方精灵
    def __init__(self):
        super().__init__('./src/enemy1.png')
        #指定敌方随机初始数量
        self.speed = random.randint(1, 3)
        #指定敌方初始位置
        self.rect.bottom = 0
        bullets = pygame.sprite.Group()
        max_x = Screen_rect.width - self.rect.width
        self.rect.x = random.randint(0, max_x)

    def update(self):
        super().update()
        if self.rect.y >= Screen_rect.height:
            self.kill()

    def fire(self):
        for i in (0, 1):
            bullet = Bullet()
            bullet.rect.bottom = self.rect.y + i * 20
            bullet.rect.centerx = self.rect.centerx
            self.bullets.add(bullet)

    def __del__(self):
        pass

class Hero(GameSprite):
    #己方飞机精灵
    def __init__(self):
        super().__init__("./src/myplane.png",0, 0)
        self.rect.centerx = Screen_rect.centerx
        self.rect.bottom = Screen_rect.bottom - 120
        self.bullets = pygame.sprite.Group()

    def update(self):
        self.rect.x += self.speed
        self.rect.y += self.speed1
        if self.rect.x < 0:
            self.rect.x = 0
        elif self.rect.right > Screen_rect.right:
            self.rect.right = Screen_rect.right
        if self.rect.y < 0:
            self.rect.y = 0
        elif self.rect.bottom > Screen_rect.bottom:
            self.rect.bottom = Screen_rect.bottom

    def fire(self):
        print('open fire!')
        for i in (0,1,2):
            bullet = Bullet()
            bullet.rect.bottom = self.rect.y - i*20
            bullet.rect.centerx = self.rect.centerx
            self.bullets.add(bullet)

class (BulletGameSprite):
    #子弹精灵
    def __init__(self):
        super().__init__('./src/bullet1.png', -2)

    def update(self):
        super().update()
        if self.rect.bottom < 0:
            self.kill()

    def __del__(self):
        print('bullet destoried!')

运行效果:

  • 打中敌机后得分加一:
    打中敌机得分加一
  • 移动飞机到任意位置:
    移动飞机

猜你喜欢

转载自blog.csdn.net/qq_38898129/article/details/89474956