Python实现飞机大战代码笔记

Python实现飞机大战代码笔记(附带图片包)

精灵类部分

import pygame
import random
#定义屏幕大小的常量
SCREEN_RECT = pygame.Rect(0 , 0 , 480 , 700)
#每秒帧数常量
FRAME_PRT_SET = 60
#定时器常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
#小敌机定时器
CREATE_ENEMY_BULLET = pygame.USEREVENT+2



class GameSprit(pygame.sprite.Sprite):
    """飞机大战游戏精灵"""
    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

    def update(self):
        self.rect.y += self.speed


class Background(GameSprit):
    """游戏背景滚动精灵"""
    #设置背景图 is_olt = False时,背景图为背景框位置,为True时为背景框上方
    def __init__(self,is_olt=False):
        #设置背景图
        super().__init__("./images/background.png")
        #判断背景图是否为背景上方图片
        if is_olt:
            self.rect.y = -self.rect.height

    #重写update类实现背景滚动
    def update(self):
        # super().update()lf.speed
        self.rect.y += self.speed
        #判断背景图片是否离开背景框,如果离开则将背景图放置背景框最上部
        if self.rect.y >= SCREEN_RECT.height:
            self.rect.y = -self.rect.height


class Enemy(GameSprit):
    """创建小敌机"""
    def __init__(self):
        #创建小敌机,锁定小敌机图片
        super().__init__("./images/enemy1.png")
        #创建小敌机的随机速度
        self.speed = random.randint(1,3)
        #更改小敌机的出现高度位置
        self.rect.bottom = 0
        #创建小敌机的随机位置
        max_x = random.randint(0,SCREEN_RECT.width - self.rect.width)
        self.rect.x = max_x


    def update(self):

        super().update()
        #当小敌机飞出屏幕是销毁小敌机
        if self.rect.y >= SCREEN_RECT.height:
            #kill方法将精灵组中的精灵删除
            self.kill()
    def __del__(self):
        pass

class Hero(GameSprit):
    """英雄精灵"""
    def __init__(self):
        #加载英雄机图片,放置精灵
        super().__init__("./images/me1.png")
        #设置英雄机位置
        self.rect.centerx = SCREEN_RECT.centerx
        self.rect.bottom = SCREEN_RECT.bottom-120

        self.bullet_group = pygame.sprite.Group()

    def raunch(self):
        #发射子弹
        bullet = Bullet()
        #确定子弹的位置
        bullet.rect.bottom = self.rect.y-15
        bullet.rect.centerx = self.rect.centerx
        #将子弹放置精灵组
        self.bullet_group.add(bullet)

        pass

    def update(self):
        #控制英雄机移动
        self.rect.x += self.speed
        if self.rect.x < 0:
            self.rect.x = 0
        elif self.rect.right > SCREEN_RECT.width:
            self.rect.right = SCREEN_RECT.width

class Bullet(GameSprit):
    """子弹精灵"""
    def __init__(self):
        super().__init__("./images/bullet1.png",-2)


    def update(self):
        super().update()

        #判断子弹是否飞出屏幕,飞出屏幕则销毁子弹
        if self.rect.y < 0:
            self.kill()

    def __del__(self):
        pass

程序启动类

import pygame
from plane_sprites import *

# 英雄机被撞计数
num = []
# 子弹碰撞小敌机计数
enemy_voer = []
# 游戏暂停控制
sun = 0
pygame.init()


class PlaneGame(object):
    """飞机大战主程序"""

    def __init__(self):
        print("游戏初始化")
        # 创建游戏窗口
        self.screen = pygame.display.set_mode(SCREEN_RECT.size)
        # 创建游戏时钟
        self.clock = pygame.time.Clock()
        # 调用私有方法,加载精灵和精灵组
        self.__create_sprites()
        # 帧率刷新
        self.clock = pygame.time.Clock()
        # 创建小敌机定时器
        pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
        # 创建子弹的定时器
        pygame.time.set_timer(CREATE_ENEMY_BULLET, 200)
        # 英雄机摧毁后定时器

    # 游戏精灵
    def __create_sprites(self):
        # 设置背景图1
        background1 = Background()
        # 背景图2
        background2 = Background(True)
        # 小敌机精灵组
        self.enemy_group = pygame.sprite.Group()
        # 英雄机精灵
        self.hero = Hero()
        self.resume = Resume_Nor()
        # 将背景图放置精灵组
        self.back_group = pygame.sprite.Group(background1, background2)
        self.hero_group = pygame.sprite.Group(self.hero)
        self.resume_group = pygame.sprite.Group()

    # 游戏启动程序
    def start_game(self):
        global state
        print("游戏开始")
        while True:
            # 帧率刷新
            self.clock.tick(FRAME_PRT_SET)
            # 事件监听
            self.__event_heandler()
            # 碰撞检测
            self.__check_collide()
            # 更新、绘制精灵组
            self.__update_sprites()
            # 加载得分
            self.__create_score()
            # 更新显示游戏窗口
            pygame.display.update()

    # 事件监听
    def __event_heandler(self):
        global sun, state
        for event in pygame.event.get():
            # 监测用户是否退出
            if event.type == pygame.QUIT:
                self.__geam_over()
            elif event.type == CREATE_ENEMY_EVENT:
                # 刷新小敌机
                enemy = Enemy()
                # 将小敌机放置精灵组
                self.enemy_group.add(enemy)
            elif event.type == CREATE_ENEMY_BULLET:
                self.hero.raunch()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RETURN:
                    if sun == 0:
                        print("游戏暂停")
                        sun = 1
                    else:
                        #self.__time_Out(sun)
                        sun = 0
                        print("游戏开始: %d" % sun)

        # 监听用户是否按下移动键使英雄机移动
        pressed_list = pygame.key.get_pressed()
        if pressed_list[pygame.K_a]:
            self.hero.speed = -2
        elif pressed_list[pygame.K_d]:
            self.hero.speed = 2
        else:
            self.hero.speed = 0
    #游戏暂停,启动
    def __time_Out(self,sun):
       pass

    # 碰撞检测
    def __check_collide(self):
        # 子弹 碰撞小敌机
        num_collide = pygame.sprite.groupcollide(self.enemy_group, self.hero.bullet_group, True, True)
        if len(num_collide) != 0:
            enemy_voer.append(num_collide.__len__())
        # 英雄机与小敌机碰撞
        hero_collide = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)
        if len(hero_collide) != 0:
            num.append(hero_collide)
        if len(num) >= 2:
            print("英雄机毁掉了")
            self.__geam_over()

    # 得分显示
    def __create_score(self):
        # print(enemy_voer)
        font = pygame.font.SysFont('方正粗黑宋简体', 24, False)
        surface = font.render(u'您的得分为:%d' % len(enemy_voer), True, [255, 0, 0])
        self.screen.blit(surface, [10, 10])
        # print(pygame.font.get_fonts())
        pygame.display.update()

    # 更新精灵
    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.bullet_group.update()
        self.hero.bullet_group.draw(self.screen)
        # 刷新暂停精灵
        self.resume_group.update()
        self.resume_group.draw(self.screen)

    # 关闭游戏
    @staticmethod
    def __geam_over():
        pygame.quit()
        quit()


# 启动游戏
if __name__ == '__main__':
    game = PlaneGame()
    game.start_game()

游戏素材分享:
链接:https://pan.baidu.com/s/1MQl0_in3ouaTFmiJDnCqPQ
提取码:7bfq

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值