关注公众号 领VIP会员
下次再说
图解Python(3)(项目实战篇)pygame游戏开发之飞机大战

独家

下载课程

下载学院APP

缓存视频离线看

微信公众号
收藏(327)

图解Python(3)(项目实战篇)pygame游戏开发之飞机大战

课程目标: 掌握面向对象的飞机大战项目;掌握项目开发的众多技能,极大提高Python技能和水平

5分 共69课时 共9小时15分钟 更新时间: 30天前

学习人数榜1

2424小时内答疑

课时永久观看

退15分钟内无条件退款

  1. 仅限付费视频课程适用
  2. 购买后15分钟内可以找到客服进行沟通退款
  3. 下载资料后不再享有退款特权
  4. 客服(Tel:400-101-1651)
  5. 最终解释权归51CTO学院所有

专属资料下载

课程介绍

课程大纲

学习资料

学员评价

课程目标
掌握面向对象的飞机大战项目;掌握项目开发的众多技能,极大提高Python技能和水平
适用人群
适用于有一定的Python基础、并想通过实战项目进一步提高Python技能和水平的朋友
课程简介
  • 飞机大战游戏简介

    在本套视频课程中,我将手把手地带领大家编写每一行代码,共同完成一个完全面向对象版本的飞机大战实战项目。在项目代码的编写和讲解过程中,每行代码都有详尽的注释。在大家学习完这个实战项目后,可以掌握Python项目开发中的众多技能,包括:编码规范、面向对象、代码重构,等等,...

  • 搭建开发环境

    在项目开发之前,首先需要搭建好开发环境。飞机大战实战项目的开发环境需要安装和配置Python、集成开发环境PyCharm和用于游戏开发的第三方库pygame。

  • HelloWorld程序的运行效果和实现步骤

    本节课,我先给大家演示一下我们要编写的pygame HelloWorld程序的运行效果,然后介绍一下其实现步骤。

  • HelloWorld1创建并显示一个固定尺寸的窗口

    创建一个宽为700像素高为900像素的窗口,并让创建的窗口一直显示。

  • HelloWorld2处理用户关闭窗口以退出程序的事件

    编写相关的代码来处理用户关闭窗口从而退出程序的事件,这样,当用户点击窗口中的关闭按钮时,窗口就会被关闭并退出程序。

  • HelloWorld3设置窗口的标题和背景色

    将窗口的标题设置为”飞机大战“,将窗口的背景色设置为浅天蓝色。

  • HelloWorld4在窗口的底部居中位置绘制一架飞机

    在窗口的底部居中位置绘制一架飞机。

  • HelloWorld5让飞机向上匀速移动

    让飞机从窗口的底部居中位置向上匀速移动。

  • 一张图总结HelloWorld程序的结构

    对于前面课程中所编写的HelloWorld程序,本节课我们通过一张图来回顾和总结一下它的结构。

  • 重构HelloWorld之将面向过程改为面向对象

    在不改变代码原有功能的前提下,对HelloWorld程序进行重构,将其由面向过程的改为面向对象的。

  • 重构HelloWorld之抽象出我方飞机类

    上节课我们已经将HelloWorld程序由面向过程的重构为面向对象的了,但是还不够彻底,因为窗口中的飞机显然可以被抽象为对象。本节课,我们对HelloWorld程序继续进行重构,从中抽象出飞机类。

  • 通过矩形表示元素在窗口中的位置

    在前面的课程中,对于我方飞机在窗口中的位置,是通过坐标来表示的。尽管可以通过坐标来表示元素在窗口中的位置,但是,必须要通过计算才能得到坐标,显然不够方便和灵活。为了更好地表示元素在窗口中的位置,pygame给我们提供了另外一种更方便、更灵活、更强大的方式,那就是通过矩形。

  • 重构HelloWorld之通过矩形表示我方飞机在窗口

    本节课,我们对前面课程中编写的HelloWorld程序继续重构,通过矩形来表示我方飞机在窗口中的位置,而不是通过坐标来表示。

  • 重构之提取函数或方法

    本节课,我们使用提取函数或方法这种重构手段对HelloWorld程序做最终一步重构工作。

  • 让窗口尺寸适配不同尺寸和分辨率的电脑屏幕

    对窗口的尺寸进行适配,让创建的窗口在任何尺寸和分辨率的电脑屏幕上占的比例都是一样的,从而提高用户的体验。

  • 通过持续按下键盘上的上箭头控制我方飞机向上持续移动

    让我方飞机不是自动移动,而是让用户通过键盘按键来控制我方飞机的移动。本节课,先通过持续按下键盘上的上箭头控制我方飞机向上持续移动。

  • 通过持续按下键盘上的任意方向箭头控制我方飞机往指定的任意方向

    本节课,我们在上节课向上移动的基础上,实现另外三个方向的持续移动。

  • 限制我方飞机的移动范围以避免其超出窗口的边缘

    我们希望我方飞机始终全部显示在窗口中,不要出现部分消失的情况。本节课,我们就限制一下我方飞机的移动范围以避免其超出窗口的边缘。

  • 重构处理事件的方法

    在前面的课程中,我们已经学习了提取函数或方法这种常见的重构手段。当一个函数或方法中的代码过长时,我们就可以考虑将其中的部分代码提取为一个新的函数或方法。本节课,我们再次使用这种重构手段对处理事件的方法进行重构。

  • 重构之提取魔法数字

    魔法数字在代码中都有明确的含义,但是没有表现出相应的含义。这会导致代码的可读性比较差,从而不容易维护。提取魔法数字也是常用的重构手段之一。

  • 以全屏模式运行游戏并添加退出游戏的快捷键

    以全屏模式运行游戏以解决pygame在苹果电脑中运行不流畅的bug

  • 让我方飞机在每次按下空格键后发射一颗Bullet

    按下空格键,我方飞机发射一颗Bullet;再按下空格键,我方飞机再发射一颗Bullet。所有Bullet都是从我方飞机的顶部居中位置发射出来的,而且发射出来之后向上匀速移动。

  • 删除窗口中不可见的Bullet

    只要Bullet对象一直存活着,就会占用内存空间。当Bullet从窗口中消失后,它就不再可用了,就可以将对应的Bullet对象销毁了。因此,只要Bullet超出窗口的上边缘,就可以将其对应的Bullet对象从Bullet列表中删除,删除之后,Bullet对象的引用计数变为0,系统就会进行垃圾回收以自动释放掉其占用的内存。

  • 让我方飞机定时发射Bullet

    我们要开发的飞机大战这个游戏的核心在于:通过键盘控制我方飞机的移动,以躲过或消灭各种敌机。如果通过按下空格键发射Bullet,相当于让用户做了很多重复性的机械动作,这是没有必要的。本节课,我们对发射Bullet的方式进行修改,让我方飞机定时发射Bullet,而不是通过按下空格键发射Bullet。

  • 定时创建一架小型敌机并从窗口的上方向下匀速移动

    每隔两秒创建一架小型敌机,创建后从窗口的上方向下匀速移动,小型敌机在水平方向上的初始位置是随机的。

  • 通过提取方法重构既有的代码

    一个优秀的软件开发工程师应该养成随时随地重构代码的好习惯。为了让代码的逻辑结构更加清晰,可读性更好,本节课,我们一起看一下代码中是否还有可以重构的地方。

  • 重构之将所有常量提取到一个单独的模块中

    目前,所有的常量都定义在main.py中。随着飞机大战游戏的开发,我们会定义越来越多的常量。为了对所有常量统一管理,本节课,我们将所有常量提取到一个单独的模块中。

  • 定时创建一架中型敌机并从窗口的上方向下匀速移动

    每隔3.6秒创建一架中型敌机,创建后从窗口的上方向下匀速移动,中型敌机在水平方向上的初始位置也是随机的。

  • 定时创建一架大型敌机并从窗口的上方向下匀速移动

    每隔18秒创建一架大型敌机,创建后从窗口的上方向下匀速移动,大型敌机在水平方向上的初始位置也是随机的。

  • 精灵Sprite和管理精灵的分组Group

    如何检测是否有Bullet与敌机发生碰撞了呢?又如何检测是否有敌机与我方飞机发生碰撞了呢?我方飞机与敌机的形状都是很不规则的,如果我们自己从头编写代码做碰撞检测的话,其实是非常麻烦也非常困难的。值得庆幸的是,pygame给我们提供了两个类对象,不仅可以让我们非常方便地对游戏...

  • 通过分组更方便地绘制精灵

    用于表示分组的类对象Group中也定义了一个方法draw(),该方法的作用是:对于分组中的每个精灵,自动地调用surface.blit(self.image, self.rect) ,其中,surface是调用方法draw()时传入的实参,也就是说,如果调用方法draw()时传入的实参是self.window,那么对于分组中的所有精灵,...

  • 通过分组更方便地更新精灵的位置

    用于表示分组的类对象Group中也定义了一个方法update(),该方法的作用是:对于分组中的每个精灵,自动地调用精灵的方法update() 。因此,更新分组中所有精灵的位置时,可以直接调用相应分组的方法update(),而无需单独调用每个精灵的方法update()。

  • 让每个敌机精灵都被两个不同的分组所管理

    通过让每个敌机精灵都被两个不同的分组所管理,对代码进行重构,把三个相似的方法合并为一个方法,从而使得代码更加简洁。

  • 为我方飞机的尾部添加突突突的动画效果

    为我方飞机的尾部添加突突突的动画效果,实现思路很简单:只需要在方法run_game()的while循环体中,反复切换这两张图片就可以了。

  • 检测Bullet与小型敌机的碰撞(1)

    从本节开始,我们就进入到飞机大战游戏的重头戏碰撞检测了。我们先检测Bullet与小型敌机的碰撞。

  • 检测Bullet与小型敌机的碰撞(2)

    在调用函数groupcollide()时,从返回值中获得所有发生碰撞的小型敌机

  • 检测Bullet与小型敌机的碰撞(3)

    每当小型敌机与Bullet发生碰撞时,都会播放小型敌机爆炸的声音。

  • 检测Bullet与小型敌机的碰撞(4)

    当有Bullet和小型敌机发生碰撞时,Bullet会从画面中消失,在小型敌机从画面中消失前,即便又与其它Bullet发生了碰撞,也只播放一次小型敌机爆炸的声音,并且只播放一次小型敌机爆炸的动画。

  • 检测Bullet与中型敌机的碰撞(1)

    把前面几节课实现的功能,在Bullet和中型敌机的碰撞上先再实现一遍

  • 检测Bullet与中型敌机的碰撞(2)

    中型敌机被Bullet击中5次之后才会爆炸。

  • 检测Bullet与中型敌机的碰撞(3)

    中型敌机从画面中出现时,其尾部上方会显示一条红色线段,表示能量是满的。

  • 检测Bullet与中型敌机的碰撞(4)

    中型敌机被Bullet击中后,红色线段表示的能量会变短,变短的部分被白色线段所取代。当中型敌机的能量变为0时,表示能量的线段全部变为白色。

  • 检测Bullet与中型敌机的碰撞(5)

    每当中型敌机被Bullet击中后,如果能量不为0,它的头部都会播放被击中的动画。如果被Bullet击中后中型敌机的能量变为0,那就直接播放爆炸的动画,而不再播放被击中的动画。

  • 检测Bullet与大型敌机的碰撞

    和Bullet与中型敌机发生碰撞后的运行效果相比,几乎是完全一样的:大型敌机从画面中出现时,它的尾部上方就显示了能量。当有Bullet和大型敌机发生碰撞时,Bullet会从画面中消失,大型敌机的头部会播放被击中的动画,大型敌机的尾部上方会显示能量变少了。当大型敌机被Bullet击中n次之...

  • 为大型敌机的头部添加移动时的动画效果

    大型敌机在移动时,它的头部会显示动画的效果。当被Bullet击中后,如果能量不为0,会先显示被击中的动画效果,接着再显示移动的动画效果。当被Bullet击中后,如果能量为0,则直接显示爆炸的动画效果。

  • 检测我方飞机与敌机的碰撞(1)

    每当有敌机和我方飞机发生碰撞时,发生碰撞的敌机就从画面中消失了,同时,会打印出一个列表,列表中的元素是该时刻和我方飞机发生碰撞的所有敌机。

  • 检测我方飞机与敌机的碰撞(2)

    只有当我方飞机与敌机的可见部分发生了重叠,才认为两个精灵发生了碰撞。发生碰撞的敌机会从画面中消失。

  • 检测我方飞机与敌机的碰撞(3)

    当我方飞机与敌机发生碰撞后,敌机会播放爆炸的声音和爆炸的动画,然后从画面中消失。

  • 检测我方飞机与敌机的碰撞(4)

    我方飞机有三条命,也就是初始生命数为3。**次碰撞后,生命数变为2,位置被重置为起始位置。第二次碰撞后,生命数变为1,位置再次被重置为起始位置。第三次碰撞后,生命数变为0,游戏结束,画面暂停在了碰撞的时刻。

  • 检测我方飞机与敌机的碰撞(5)

    在屏幕的右下角使用我方飞机的缩小版图片来可视化地表示当前的生命数。初始时,生命数是3,显示3张小图片。**次碰撞后,生命数变为2,显示2张小图片。第二次碰撞后,生命数变为1,显示1张小图片。第三次碰撞后,生命数变为0,不再显示小图片。

  • 检测我方飞机与敌机的碰撞(6)

    我方飞机与敌机发生**次碰撞后,位置被重置为起始位置,此时,我方飞机处于5秒的无敌状态,5秒内,即便与敌机发生碰撞,生命数也不会减少。5秒后,无敌状态被解除,如果与敌机发生第二次碰撞,碰撞后,位置再次被重置为起始位置,此时,我方飞机再次处于5秒的无敌状态,5秒内,即便...

  • 检测我方飞机与敌机的碰撞(7)

    我方飞机与敌机发生**次碰撞后,位置被重置为起始位置,此时,我方飞机处于5秒的无敌状态,在窗口的中部显示一行提示文本“还有2条命,无敌状态将在该文本消失后解除”。5秒后,无敌状态被解除,提示文本消失。我方飞机与敌机发生第二次碰撞后,位置再次被重置为起始位置,此时,我...

  • 检测我方飞机与敌机的碰撞(8)

    我方飞机与敌机发生第三次碰撞后,游戏就结束了,此时,我们希望也在窗口中绘制一行提示文本。

  • 定时创建一个Bullet补给并从窗口的上方向下匀速移动

    每隔25秒就会创建一个Bullet补给,创建后从窗口的上方向下匀速移动,Bullet补给在水平方向上的初始位置是随机的。

  • 检测我方飞机与Bullet补给的碰撞

    当我方飞机与Bullet补给发生碰撞时,播放碰撞的声音,Bullet补给从游戏画面中消失,同时,我方飞机由一次发射一颗Bullet变为一次发射两颗Bullet。经过一段时间后,又变为了一次发射一颗Bullet。

  • 检测双发Bullet与小型敌机的碰撞

    当有双发Bullet和小型敌机发生碰撞时,双发Bullet会从画面中消失,同时,播放小型敌机爆炸的声音,并播放小型敌机爆炸的动画。

  • 检测双发Bullet与中型敌机或大型敌机的碰撞

    当有双发Bullet和中型敌机或大型敌机发生碰撞时,双发Bullet会从画面中消失,中型敌机或大型敌机的头部会播放被击中的动画,中型敌机或大型敌机的尾部上方会显示能量变少了。当中型敌机或大型敌机被双发Bullet击中n次之后,没有能量了,播放爆炸的声音,同时,播放爆炸的动画。

  • 定时创建一个Bomb补给并从窗口的上方向下匀速移动

    每隔一段时间创建一个Bomb补给,创建后从窗口的上方向下匀速移动,Bomb补给在水平方向上的初始位置是随机的。

  • 可视化我方飞机的Bomb数

    在屏幕的左下角可视化地表示了我方飞机的Bomb数量。初始时,我方飞机有3颗Bomb,显示3张Bomb图片。

  • 按下空格键后我方飞机发射一颗Bomb

    当用户按下空格键后,只要游戏没有结束并且Bomb的数量大于0,我方飞机就会发射一颗Bomb,在播放Bomb爆炸声音的同时摧毁游戏画面上的所有敌机,屏幕左下方的Bomb数量随之减少一个。当Bomb数量为0时,按下空格键不再发射Bomb。当游戏结束时,按下空格键也不再发射Bomb。

  • 检测我方飞机与Bomb补给的碰撞

    当我方飞机与Bomb补给发生碰撞时,播放碰撞的声音,Bomb补给从游戏画面中消失,同时,如果Bomb的数量小于3,就让Bomb的数量增加一颗,从而在屏幕的左下方显示的Bomb图片多了一张。Bomb的max数量为3,所以,当我方飞机与Bomb补给发生碰撞时,如果Bomb的数量等于3,Bomb的数量不会增加。

  • 在控制台打印当前得分

    控制台会不停地打印当前得分。当前得分的初始值为0。当Bullet或双发Bullet与敌机发生碰撞时,会根据摧毁的敌机更新当前得分;当发射Bomb时,会根据摧毁的敌机更新当前得分;当我方飞机与敌机发生碰撞时,会根据摧毁的敌机更新当前得分。

  • 在窗口的左上方实时显示当前得分

    为了能够让用户更直观地看到自己的当前得分,本节课,我们在窗口的左上方实时显示当前得分。

  • 在窗口的左上方显示Highest得分

    本节课,我们在窗口的左上方显示Highest得分,这样,用户在玩游戏的过程中就有一个直观具体的超越目标,从而增加用户的目标感和成就感。

  • 退出游戏时判断是否将当前得分保存为Highest得分

    当前得分高于Highest得分后,退出游戏,然后再次运行游戏,显示的Highest得分就是退出游戏时的当前得分。

  • 在窗口的左上方实时显示当前关数

    在窗口的左上角Max得分的下面,显示当前关数。当前关数的初始值是1。当前关数会随着当前得分的不断增加而有规则地递增:当当前得分大于200时,当前关数变为2;当当前得分大于400时,当前关数变为3;当当前得分大于600时,当前关数变为4;当当前得分大于800时,当前关数变为5。

  • 根据当前关数更新所有敌机和补给的速度

    当当前关数变为2时,所有敌机和供给的速度都加快了;当当前关数变为3时,所有敌机和供给的速度变得更快了;当当前关数变为4时,所有敌机和供给的速度变得更快了;当当前关数变为5时,所有敌机和供给的速度变得更快了。这样,随着关数的不断递增,所有敌机和补给的速度会越来越快,从...

  • 为游戏添加背景音乐

    用户启动游戏后就开始循环播放背景音乐。游戏结束时,停止播放背景音乐。

  • 暂停游戏和重新开始游戏

    检验学习成果的两个小练习^_^,遇到任何问题,欢迎随时与我沟通交流~~

加载中
所属章节 资料名称 文件大小 下载
相关资料推荐

暂时还没有学习资料~

5

    1
    非常糟

    2
    很差

    3
    一般

    4
    很好

    5
    非常好

    • 0%
    • 0%
    • 0%
    • 0%
    • 0%
    加载中
    没有了哦~

    讲师介绍

    张荣超

    张荣超

    讲师评分:5.0

    曾就职于联想、HTC、阿里巴巴,担任高级软件开发工程师、Team Leader、技术主管、高级技术培训讲师。丰富的Python、Swift、Kotlin开发及培训经验。

    学院服务

    关注公众号领取
    免费VIP会员

    添加学院管家微信进入
    学习社群

    讲师推荐专题

    专题一 图解Python视频教程

    5门课 立省:¥132.00 合计:¥858.00 购买

    162534人学习过

    订阅专栏更多

    推荐图书

    7日学霸榜 有162534人与你一起学习

    课程介绍

    课程大纲

    学习资料

    学员评价

    ¥ 198.00

    课程评价

    发表客观评价,上限可得35学分(会员可得70学分)

    图解Python(3)(项目实战篇)pygame游戏开发之飞机大战

    该课程已有 人评价

    课程与描述相符

    老师的讲解表达

    老师的答疑服务

    匿名

    在线
    客服
    在线
    客服

    下载Android客户端

    下载iphone 客户端

    关注官方微信

    返回
    顶部