Python飞机大战|10分钟学会用python写游戏
2018年python语言大火,这把火看趋势已然延续到了2019年!
除了在科学计算领域python有用武之地之外,在游戏、后端等方面,python也大放异彩,
我将按照正规的项目开发流程,手把手教大家写个python小游戏,游戏的名字叫做alien invasion!
Python|10分钟学会用python写游戏
安装pygame并创立能左右移动的飞船
安装pygame
本人电脑是windows 10、python3.6,pygame下载地址:
https://pypi.python.org/pypi/Pygame/1.9.3
请自行下载对应python版本的
pygame
运行以下命令
Python|10分钟学会用python写游戏
创立Pygame窗口及响应客户输入
新建一个文件夹alien_invasion,并在文件夹中新建alien_invasion.py文件,输入如下代码。
Python|10分钟学会用python写游戏
运行上述代码,我们可以得到一个灰色界面的窗口:
Python|10分钟学会用python写游戏
创立设置类
为了在写游戏的过程中能便捷地创立少量新功能,下面额外编写一个settings板块,其中包含一个Settings类,用于将所有设置存储在一个地方。
这样在以后项目增大时修改游戏的外观就更加容易。
我们首先将alien_invasion.py中的显示屏大小及显示屏颜色进行修改。
首先在alien_invasion文件夹下新建python文件settings.py,并向其中增加如下代码:
Python|10分钟学会用python写游戏
而后再alien_invasion.py中导入Settings类,并使用相关设置,修改如下:
Python|10分钟学会用python写游戏
增加飞船图像
接下来,我们需要将飞船加入游戏中。为了在屏幕上绘制玩家的飞船,我们将加载一幅图像,再使用Pygame()方法blit()绘制它。
在游戏中几乎可以使用各种类型的图像文件,但是使用位图(.bmp)文件最为简单,这是由于Pygame默认加载位图。
尽管其余类型的图像也能加载,但是需要安装额外的库。
我们推荐去免费的图片素材网站上去找图像:
https://pixabay.com/
我们在主项目文件夹(alien_invasion)中新建一个文件夹叫images,将如下bmp图片放入其中。
Python|10分钟学会用python写游戏
接下来,我们创立飞船类ship.py:
Python|10分钟学会用python写游戏
重构:板块game_functions
在大型项目中,经常需要在增加新代码前重构既有代码。重构的目的是为了简化代码的结构,使其更加容易扩展。
我们将实现一个game_functions板块,它将存储大量让游戏Alien invasion运行的函数。通过创立板块game_functions,可避免alien_invasion.py太长,使其逻辑更容易了解。
函数check_events()
首先我们将管理事件的代码移到一个名为check_events()的函数中,目的是为了隔离事件循环
Python|10分钟学会用python写游戏
而后我们修改alien_invasion.py代码,导入game_functions板块,并将事件循环替换成对函数check_events()的调用:
Python|10分钟学会用python写游戏
函数update_screen()
将升级屏幕的代码移到一个名为update_screen()函数中,并将这个函数放在板块game_functions中:
Python|10分钟学会用python写游戏
其中alien_invasion修改如下:
Python|10分钟学会用python写游戏
从上面一套流程走下来,我们发现:在实际的开发过程中,我们一开始将代码编写得尽可能的简单,并在项目越来越复杂时进行重构。接下来我们开始解决游戏的动态方面。
驾驶飞船
这里我们要实现的就是使玩家通过左右箭头键来控制飞船的左移与右移。
响应按键
由于在pygame中,每次按键都被注册为KEYDOWN事件,在check_events()中,我们通过event.type检测到KEYDOWN事件后还需进一步判断是哪个按键。代码如下:
Python|10分钟学会用python写游戏
允许不断移动
玩家按住右箭头不动时,我们希望飞船能不断地移动,知道玩家松开为止。这里我们通过KETUO事件来判断。因而我们设置一个标志位moving_right来实现持续移动。原理如下:
飞船不动时,标志moving_right将为false。玩家按下右箭头时,我们将这个标志设置为True;玩家松开时,我们将标志重新设置成False。
这个移动属性是飞船属性的一种,我们用ship类来控制,因而我们给这个类添加一个属性名称叫,moving_right以及一个update()方法来检测标志moving_right的状态。
ship
Python|10分钟学会用python写游戏
game_functions
Python|10分钟学会用python写游戏
最后在alien_invasion中调用update()方法
Python|10分钟学会用python写游戏
左右移动
前面我们实现了向右移动,接下来实现向左移动,逻辑相似,代码就不贴了。
调整飞船的速度
当前,每次执行while循环时,飞船最多移动一个像素,我们可以在Settings中增加ship_speed_factor,用于控制飞船的速度。我们将根据这个属性决定飞船每次循环时最多移动多少距离。
Settings:
Python|10分钟学会用python写游戏
Ship:
Python|10分钟学会用python写游戏
限制飞船的活动范围
假如玩家按住箭头的时间过长,飞船就会消失,那么如何使飞船抵达屏幕边缘时中止移动?这里我们只要要修改Ship类中的update方法,添加一个逻辑判断。
重构
这里我们主要讲check_events()函数进行重构,将其中部分代码分成两部分,一部分解决KEYDOWN事件,一部分解决KEYUP事件。
game_functions:
Python|10分钟学会用python写游戏
射击
接下来增加射击功能,使玩家按空格键时发射子弹,子弹将在屏幕中向上穿行,抵达屏幕后消失。
增加子弹设置
在Settings类中添加少量子弹的属性,这里我们创立一个宽3像素,高15像素的深灰色子弹。子弹的速度比飞船稍低。
创立Bullet类
Python|10分钟学会用python写游戏
将子弹存储到group中
前面定义了Bullet类和必要的设置后,即可以编写代码了,在玩家每次按空格键时都会发射一发子弹。
首先,我们在alien_invasion中创立一个group,用于存储所有的有效子弹。
Python|10分钟学会用python写游戏
开火
这里我们修改check_keydown_events()函数,来监听玩家按下空格键的事件。这里还需要修改update_screen()函数,确保屏幕每次升级时,都能重绘每一个子弹。
我们来看下效果:
Python|10分钟学会用python写游戏
删除消失的子弹
在alien_invasion中删除消失的子弹。
Python|10分钟学会用python写游戏
限制子弹数量
为了鼓励玩家有目标的射击,我们规定屏幕上只能同时存在3颗子弹,我们只要要在每次创立子弹前检查未消失的子弹数目能否小于3就可。
创立update_bullets()函数
为了使alien_invasion中代码更加简单,我们将检查子弹管理的代码,移到game_functions板块中:
Python|10分钟学会用python写游戏
创立fire_bullet()函数
这里我们将发射子弹的代码移到一个独立的函数中:
Python|10分钟学会用python写游戏
增加外星人,并检测碰撞
在我们完成新的任务之前,我们先给游戏增加一个结束游戏的快捷键Q:
创立第一个外星人
这里和创立飞船的方法一样
Python|10分钟学会用python写游戏
创立一群外星人
这里我们首先确定一行能容纳多少个外星人以及要绘制几行。这里改动代码较多,直接看效果:
Python|10分钟学会用python写游戏
移动外星人
前面我们创立的是静态的外星人,现在我们需要让外星人动起来。这里我们在Settings类中设置外星人移动的速度,而后通过Alien类中的update的方法来实现移动
射杀外星人
要想射杀外星人,就必需先检测两个编组成员之间能否发生碰撞,在游戏中,碰撞就是游戏元素重叠在一起。
这里我们使用sprite.groupcollide()来检测两个编组的成员之间的碰撞。
子弹击中外星人时,需要立马知道,并同时使被碰撞的外星人立即消失,因而我们需要在升级子弹的位置后立即检测碰撞。
结束游戏
这里我们还需要知道何时该结束游戏,有以下几种情况:
飞船一律被摧毁
外星人到达屏幕底部
实际效果:
Python|10分钟学会用python写游戏
计分
最后我们将给游戏增加一个Play按钮,用于根据需要启动游戏以及在游戏结束后重启游戏。
我们还将实现一个计分系统,能够在玩家等级提高时加快节奏。
增加Play按钮
这里可以先将游戏初始化为非活动状态,当我们点击了按钮,就开始游戏。
因为Pygame中没有内置的创立按钮的方法。因而我们可以通过创立一个Button类来创立一个自带标签的实心矩形。
我们通过检测鼠标发生点击后的坐标能否与我们绘制的按钮发生碰撞与否来判断能否发生了点击事件。
提高等级
为了使玩家将敌人消灭干净后能够提高游戏难度,添加趣味性,这里我们可以在Settings类中进行修改,添加静态初始值,和动态初始值。
记分、等级、剩余飞船
Python|10分钟学会用python写游戏
打包成exe可执行文件
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Python飞机大战|10分钟学会用python写游戏