Python飞机大战(完整版)

这篇具有很好参考价值的文章主要介绍了Python飞机大战(完整版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介:一共分为2个py文件,分别是主类、和精灵类

飞机大战图片地址:链接: https://pan.baidu.com/s/18T6n9JFIDxBqYX9CnHi7ZQ  密码: tqbr

注释:项目启动后如果报libpng warning: iCCP: known incorrect sRGB profile无须处理,不会影响项目和代码,视觉洁癖可以直接百度搜索这个错误提示,网上有解决办法

ps:因为图片是png格式,而libpng-1.6以上版本增强了ICC profiles检查,所以才会警告

plane_main.py(启动主类) 

import pygame

import plane_sprites


class PlanGame(object):
    """飞机大战-主体类"""

    def __init__(self):
        """
        初始化
        """
        pygame.init()
        # 创建窗口
        self.screen = pygame.display.set_mode(plane_sprites.SCREEN_RECT.size)
        # 创建游戏时钟对象
        self.clock = pygame.time.Clock()
        # 创建精灵组
        self.__create_sprites()
        # 定时器 - 创建敌机 1s (USEREVENT是一个常量,可以通过+1来改变此常量)
        pygame.time.set_timer(pygame.USEREVENT, 1000)
        # 定时器 - 主机子弹 0.5s
        pygame.time.set_timer(pygame.USEREVENT + 1, 500)

    def start_game(self):
        """
        启动游戏
        :return:
        """
        while True:
            # 执行循环中游戏时钟的频率
            self.clock.tick(plane_sprites.FRAME_PER_SEC)
            # 事件监听
            self.__event__handler()
            # 碰撞检测
            self.__check_collide()
            # 更新/绘制精灵族
            self.__update_sprites()
            # 更新显示
            pygame.display.update()

    def __create_sprites(self):
        """
        创建/绘制精灵族
        :return:
        """
        # 创建背景精灵和精灵组
        bg_one = plane_sprites.BackGround(False)
        bg_two = plane_sprites.BackGround(True)
        self.back_group = pygame.sprite.Group(bg_one, bg_two)
        # 创建敌机精灵组
        self.enemy_group = pygame.sprite.Group()
        # 创建主机精灵组
        self.me = plane_sprites.Me()
        self.me_group = pygame.sprite.Group(self.me)
        # 创建敌机子弹摧毁精灵组
        self.destroy_group = pygame.sprite.Group()

    def __event__handler(self):
        """
        事件监听
        :return:
        """
        for e in pygame.event.get():
            # 点击关闭游戏窗口
            if e.type == pygame.QUIT:
                # 退出pygame
                pygame.quit()
                # 终止程序
                exit()
            elif e.type == pygame.USEREVENT:
                # 添加敌机精灵到精灵组中
                self.enemy = plane_sprites.Enemy()
                self.enemy_group.add(self.enemy)
            elif e.type == pygame.USEREVENT + 1:
                self.me.me_bullet()

        # 获取所有按键的元组
        keys_pressed = pygame.key.get_pressed()
        # 主机左右移动
        if keys_pressed[pygame.K_RIGHT]:
            self.me_group.update(True, False)
        elif keys_pressed[pygame.K_LEFT]:
            self.me_group.update(True, True)

    def __check_collide(self):
        """
        碰撞检测
        :return:
        """
        # 主机被毁
        if self.me.state == 4:
            # 游戏结束
            self.__game_over()

        # 检测子弹与敌机碰撞(敌机先不销毁,注意!顺序必须是敌机在前,否则下面for循环拿不到explode_index)
        d_group = pygame.sprite.groupcollide(self.enemy_group, self.me.bullet_group, False, True)
        # 将碰撞敌机精灵添加到敌机子弹摧毁精灵组
        self.destroy_group.add(d_group)
        for enemy in self.destroy_group:
            # 爆炸状态为0 代表未摧毁,此处改为1待摧毁
            if enemy.enemy_explode_index == 0:
                enemy.enemy_explode_index = 1
            # 摧毁完毕后删除精灵
            elif enemy.enemy_explode_index == 5:
                self.destroy_group.remove_internal(enemy)
                self.enemy_group.remove_internal(enemy)

        # 检测主机与敌机碰撞
        d_me = pygame.sprite.spritecollide(self.me, self.enemy_group, True)
        if len(d_me) > 0:
            # 主机爆炸
            self.me.state = 3

    def __update_sprites(self):
        """
        更新/绘制精灵组
        :return:
        """
        # 背景精灵组更新
        self.back_group.update()
        self.back_group.draw(self.screen)
        # 敌机精灵组更新
        self.enemy_group.update()
        self.enemy_group.draw(self.screen)
        # 主机精灵组更新
        self.me_group.update()
        self.me_group.draw(self.screen)
        # 子弹精灵组更新
        self.me.bullet_group.update()
        self.me.bullet_group.draw(self.screen)

    @staticmethod
    def __game_over():
        """
        游戏结束
        :return:
        """
        pygame.quit()
        exit()


if __name__ == '__main__':
    # 创建游戏对象
    game = PlanGame()
    # 启动游戏
    game.start_game()

plane_sprites.py(精灵类) 

import random

import pygame.sprite

# 窗口大小 480像素 * 700像素
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
# 刷新的帧频
FRAME_PER_SEC = 60


class GameSprite(pygame.sprite.Sprite):
    """飞机大战-精灵类"""

    def __init__(self, image_url, speed=1):
        """
        初始化
        :param image_url: 图片路径
        :param speed: 移动频率(默认1)
        """
        # 使用super调用父类初始化(继续类不是Object,则需要调用)
        super().__init__()
        # 绘制图片
        self.image = pygame.image.load(image_url)
        # 获取坐标、宽高
        self.rect = self.image.get_rect()
        # 移动频率
        self.speed = speed

    def update(self):
        """
        更新精灵位置
        """
        self.rect.y += self.speed


class BackGround(GameSprite):
    """飞机大战-背景类"""

    def __init__(self, is_alt):
        """
        背景图片初始化
        """
        super().__init__("./images/background.png")
        # 定义图片y值
        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__("./images/enemy1.png")
        # 指定敌机的随机速度
        self.speed = random.randint(1, 3)
        # 指定敌机的随机位置(窗口宽度-敌机宽度)
        self.rect.bottom = 0
        self.rect.x = random.randint(0, SCREEN_RECT.width - self.rect.width)
        # 敌机爆炸状态 0:未摧毁 1:待摧毁 1-4:摧毁中 5:已摧毁
        self.enemy_explode_index = 0

    def update(self):
        """
        更新敌机位置
        """
        super().update()
        # 敌机大于当前窗口高度时从精灵组里删除敌机
        if self.rect.y > SCREEN_RECT.height:
            self.kill()
        # 已销毁敌机
        if self.enemy_explode_index == 5:
            return
        # 敌机爆炸
        if self.enemy_explode_index != 0:
            new_rect = self.rect
            super().__init__("./images/enemy1_down%d.png" % self.enemy_explode_index)
            self.enemy_explode_index += 1
            self.rect = new_rect


class Me(GameSprite):
    """飞机大战-主机类"""

    def __init__(self):
        """
        主机初始化
        """
        super().__init__("./images/me1.png", 0)
        # 指定主机的x轴中心位置
        self.rect.centerx = SCREEN_RECT.centerx
        # 指定主机的位置y轴位置(窗口宽度-敌机宽度-50)
        self.rect.y = SCREEN_RECT.height - self.rect.height - 50
        # 创建子弹精灵组
        self.bullet_group = pygame.sprite.Group()
        # 主机爆炸状态 1:喷气 2:不喷气 3:摧毁 4:已摧毁
        self.state = 1
        # 主机爆炸进度 1-4
        self.progress = 1

    def update(self, is_move=False, is_left=False):
        """
        更新主机位置
        :param is_move: 是否移动
        :param is_left: 是否左移动
        :return:
        """
        # 获取上个精灵的位置
        new_rect = self.rect
        # 喷气和不喷气相互切换
        if self.state == 1:
            super().__init__("./images/me2.png")
            self.state = 2
        elif self.state == 2:
            super().__init__("./images/me1.png")
            self.state = 1
        # 主机被摧毁
        else:
            super().__init__("./images/me_destroy_%d.png" % self.progress)
            self.rect = new_rect
            # 主机已被摧毁
            if self.progress != 4:
                self.progress += 1
            else:
                self.state = 4
            return
        # 将上个精灵的位置赋值到新的精灵上
        self.rect = new_rect
        if not is_move:
            return
        # 左右移动
        if is_left and self.rect.x > 0:
            self.rect.x -= 2
        elif not is_left and self.rect.right < SCREEN_RECT.width:
            self.rect.x += 2

    def me_bullet(self):
        """
        主机添加子弹
        :return:
        """
        for i in range(0, 3):
            # 添加子弹精灵到精灵组中
            bullet = Bullet()
            # 子弹x+y轴位置
            bullet.rect.y = self.rect.y - i * 20
            bullet.rect.x = self.rect.centerx
            # 将子弹精灵添加到精灵组中
            self.bullet_group.add(bullet)


class Bullet(GameSprite):
    """飞机大战-子弹类"""

    def __init__(self):
        """
        子弹初始化
        """
        super().__init__("./images/bullet2.png", -2)

    def update(self):
        """
        发射子弹
        :return:
        """
        super().update()
        # 子弹y轴高度小于等于0时从精灵组里删除
        if self.rect.y <= 0:
            self.kill()

 文章来源地址https://www.toymoban.com/news/detail-529957.html

到了这里,关于Python飞机大战(完整版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python | 基础学习(六)pygame游戏开发:飞机大战

    pygame 模块,转为电子游戏设计 $ sudo pip3 install pygame windows: pip install pygame (1)新建项目 飞机大战 (2)新建文件 pygame.py (3)建立游戏窗口: ①pygame的初始化和退出 pygame.init() :导入并初始化所有pygame模块,使用其他模块之前,必须先调用init方法。 pygame.quit() :卸载所有

    2024年02月08日
    浏览(48)
  • 【python】 pygame学习示例 --飞机大战小游戏制作

    python版本:3.8.5 所需模块:pygame random os pygame版本:20.1 开发环境:pycharm专业版 硬件环境:win11 8G内存以上 使用python的第三方库–pygame 制作飞机大战小游戏 小游戏的内容包括: 玩家player的移动 子弹的发射 陨石的随机掉落(包括旋转 大小 下落角度) 玩家 子弹 陨石的碰撞交互

    2024年02月04日
    浏览(44)
  • Python3+pygame实现有趣好玩的飞机大战游戏(附源码及素材)

    版权声明:原创不易,本文禁止抄袭、转载,侵权必究! 开发环境 :Windows10 Python3.6.4 第三方库 :Pygame1.9.6 IDE :PyCharm/Sublime Text 素材模块 游戏图片素材: BGM及音效素材: 字体素材: 源码模块 子弹模块 普通子弹部分源码: 超级子弹部分源码: 敌机子弹部分源码: 敌机模

    2024年02月11日
    浏览(54)
  • python快速编程入门第二版 飞机大战

    飞机大战游戏以太空主题的画面为背景,由玩家通过键盘控制英雄,飞机向敌机总部发动进攻,在进攻的过程中既可以让英雄飞机发射子弹或引爆炸弹炸毁敌机获得分数,也可以拾取道具增强英雄的战斗力,一旦被敌机撞毁且生命值为0则游戏结束。 项目模块 项目有game.py,

    2024年02月13日
    浏览(44)
  • 飞机大战python代码

    下面附有源代码,一个简单运用python的应用。 图片可自己自由调配 部分模块需要去从python的软件包去下载,可以去从清华和北大还有阿里的云仓库中获取镜像链接,下载速度会快点。 源代码如下并有详细注释:

    2024年02月03日
    浏览(26)
  • python飞机大战实战演练代码

    # 以下是飞机大战的精灵组函数

    2024年02月08日
    浏览(39)
  • 第一篇【传奇开心果系列】Python的游戏库pygame技术点案例示例:深度解读实战开发飞机大战经典游戏案例

    开发飞机大战游戏不仅能满足广大玩家的娱乐需求,提供寓教于乐的学习机会,也是技术实践、创新实验和商业探索的重要载体,具有多维度的社会与经济价值。 开发飞机大战游戏具有多方面的意义,涵盖娱乐、教育、技术实践与创新等多个层面: 娱乐价值 : 休闲娱乐 :

    2024年04月23日
    浏览(71)
  • Python代码下的飞机大战

    飞机大战项目 本项目的优点就是,不需要你创建很多复杂的文件夹,单个操作台就可以完成飞机大战游戏的基础版本。如果你感兴趣,就快去试一试吧!素材链接也在下面喽,快去开启你的游戏之旅吧! 素材链接:链接:https://pan.baidu.com/s/1Mb5w-_I-oUi-W0n0jHFYXw 百度网盘提取码

    2024年04月10日
    浏览(36)
  • 300行代码,教你用Python写个飞机大战

     闲赋在家,甚是无聊,便萌发了研究经典小游戏:飞机大战的念头,想必大家可能玩过微信的这款小游戏,给我的感觉是这款游戏怎么可以做得这么好呢,操作简单,容易上手,简直是“老少皆宜”啊~ 既然这款游戏这么棒,能否自己动手用 Python 来实现呢?事实证明是可以

    2024年02月04日
    浏览(35)
  • Python开发小游戏:写一个飞机大战只需要500行代码!

    ‘’’ :param background_image_path: 背景图片的路径地址 :param size: 游戏窗口的大小 :param title: 游戏窗口的标题 :param font_name: 指定字体 :param font_size: 指定字体大小 :param speed: 背景图滚动整个窗口一次所用时间,单位为ms ‘’’ self.size = size self.screen = pygame.display.set_mode(size) self.tit

    2024年04月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包