安装pygame

请自行下载对应python版本的pygame

运行以下命令

创建Pygame窗口及响应用户输入

新建一个文件夹alien_invasion,并在文件夹中新建alien_invasion.py文件,输入如下代码。

运行上述代码,我们可以得到一个灰色界面的窗口:

创建设置类

为了在写游戏的过程中能便捷地创建一些新功能,下面额外编写一个settings模块,其中包含一个Settings类,用于将所有设置存储在一个地方。

这样在以后项目增大时修改游戏的外观就更加容易。

我们首先将alien_invasion.py中的显示屏大小及显示屏颜色进行修改。

首先在alien_invasion文件夹下新建python文件settings.py,并向其中添加如下代码:

然后再alien_invasion.py中导入Settings类,并使用相关设置,修改如下:

添加飞船图像

接下来,我们需要将飞船加入游戏中。为了在屏幕上绘制玩家的飞船,我们将加载一幅图像,再使用Pygame()方法blit()绘制它。

在游戏中几乎可以使用各种类型的图像文件,但是使用位图(.bmp)文件最为简单,这是因为Pygame默认加载位图。

虽然其他类型的图像也能加载,但是需要安装额外的库。

我们推荐去免费的图片素材网站上去找图像:https://pixabay.com/

我们在主项目文件夹(alien_invasion)中新建一个文件夹叫images,将如下bmp图片放入其中。

接下来,我们创建飞船类ship.py:

重构:模块game_functions

在大型项目中,经常需要在添加新代码前重构既有代码。重构的目的是为了简化代码的结构,使其更加容易扩展。

我们将实现一个game_functions模块,它将存储大量让游戏Alien invasion运行的函数。通过创建模块game_functions,可避免alien_invasion.py太长,使其逻辑更容易理解。

函数check_events()

首先我们将管理事件的代码移到一个名为check_events()的函数中,目的是为了隔离事件循环

然后我们修改alien_invasion.py代码,导入game_functions模块,并将事件循环替换成对函数check_events()的调用:

函数update_screen()

将更新屏幕的代码移到一个名为update_screen()函数中,并将这个函数放在模块game_functions中:

其中alien_invasion修改如下:

从上面一套流程走下来,我们发现:在实际的开发过程中,我们一开始将代码编写得尽可能的简单,并在项目越来越复杂时进行重构。接下来我们开始处理游戏的动态方面。

驾驶飞船

这里我们要实现的就是使玩家通过左右箭头键来控制飞船的左移与右移。

响应按键

因为在pygame中,每次按键都被注册为KEYDOWN事件,在check_events()中,我们通过event.type检测到KEYDOWN事件后还需进一步判断是哪个按键。代码如下:

允许不断移动

玩家按住右箭头不动时,我们希望飞船能不断地移动,直到玩家松开为止。这里我们通过KETUO事件来判断。因此我们设置一个标志位moving_right来实现持续移动。原理如下:

飞船不动时,标志moving_right将为false。玩家按下右箭头时,我们将这个标志设置为True;玩家松开时,我们将标志重新设置成False。

这个移动属性是飞船属性的一种,我们用ship类来控制,因此我们给这个类增加一个属性名称叫,moving_right以及一个update()方法来检测标志moving_right的状态。

ship

game_functions

最后在alien_invasion中调用update()方法

左右移动

前面我们实现了向右移动,接下来实现向左移动,逻辑类似,代码就不贴了。

调整飞船的速度

当前,每次执行while循环时,飞船最多移动一个像素,我们可以在Settings中添加ship_speed_factor,用于控制飞船的速度。我们将根据这个属性决定飞船每次循环时最多移动多少距离。

Settings:

Ship:

限制飞船的活动范围

如果玩家按住箭头的时间过长,飞船就会消失,那么如何使飞船抵达屏幕边缘时停止移动?这里我们只需要修改Ship类中的update方法,增加一个逻辑判断。

重构

这里我们主要讲check_events()函数进行重构,将其中部分代码分成两部分,一部分处理KEYDOWN事件,一部分处理KEYUP事件。

game_functions:

射击

接下来添加射击功能,使玩家按空格键时发射子弹,子弹将在屏幕中向上穿行,抵达屏幕后消失。

添加子弹设置

在Settings类中增加一些子弹的属性,这里我们创建一个宽3像素,高15像素的深灰色子弹。子弹的速度比飞船稍低。

创建Bullet类

将子弹存储到group中

前面定义了Bullet类和必要的设置后,就可以编写代码了,在玩家每次按空格键时都会发射一发子弹。

首先,我们在alien_invasion中创建一个group,用于存储所有的有效子弹。

开火

这里我们修改check_keydown_events()函数,来监听玩家按下空格键的事件。这里还需要修改update_screen()函数,确保屏幕每次更新时,都能重绘每一个子弹。

我们来看下效果:

删除消失的子弹

在alien_invasion中删除消失的子弹。

限制子弹数量

为了鼓励玩家有目标的射击,我们规定屏幕上只能同时存在3颗子弹,我们只需要在每次创建子弹前检查未消失的子弹数目是否小于3即可。

创建update_bullets()函数

为了使alien_invasion中代码更加简单,我们将检查子弹管理的代码,移到game_functions模块中:

创建fire_bullet()函数

这里我们将发射子弹的代码移到一个独立的函数中:

添加外星人,并检测碰撞

在我们完成新的任务之前,我们先给游戏添加一个结束游戏的快捷键Q:

创建第一个外星人

这里和创建飞船的方法一样

创建一群外星人

这里我们首先确定一行能容纳多少个外星人以及要绘制几行。这里改动代码较多,直接看效果:

其实做为一个开发者,有一个学习的氛围跟一个交流圈子是一个特别重要的事情,这里我创建了一个python交流群12546470,不管你是小白还是大牛欢迎入驻,大家一起交流成长。

移动外星人

前面我们创建的是静态的外星人,现在我们需要让外星人动起来。这里我们在Settings类中设置外星人移动的速度,然后通过Alien类中的update的方法来实现移动

射杀外星人

要想射杀外星人,就必须先检测两个编组成员之间是否发生碰撞,在游戏中,碰撞就是游戏元素重叠在一起。

这里我们使用sprite.groupcollide()来检测两个编组的成员之间的碰撞。

子弹击中外星人时,需要立马知道,并同时使被碰撞的外星人立即消失,因此我们需要在更新子弹的位置后立即检测碰撞。

结束游戏

这里我们还需要知道何时该结束游戏,有以下几种情况:

飞船全部被摧毁

外星人到达屏幕底部

实际效果:

计分

最后我们将给游戏添加一个Play按钮,用于根据需要启动游戏以及在游戏结束后重启游戏。

我们还将实现一个计分系统,能够在玩家等级提高时加快节奏。

添加Play按钮

这里可以先将游戏初始化为非活动状态,当我们点击了按钮,就开始游戏。

由于Pygame中没有内置的创建按钮的方法。因此我们可以通过创建一个Button类来创建一个自带标签的实心矩形。

我们通过检测鼠标发生点击后的坐标是否与我们绘制的按钮发生碰撞与否来判断是否发生了点击事件。

提高等级

为了使玩家将敌人消灭干净后能够提高游戏难度,增加趣味性,这里我们可以在Settings类中进行修改,增加静态初始值,和动态初始值。

记分、等级、剩余飞船

打包成exe可执行文件

上面游戏开发完了,那么你需要将其转成文exe的可执行文件。我们采用pyinstaller,安装步骤参考:

python游戏代码运行不了_用Python写游戏,不到十分钟就学会了相关推荐

  1. 为什么python代码运行不了_为什么Python代码能运行但是PyCharm给我画红线?

    PyCharm在遇到模块找不到时,会使用红色波浪线提醒开发者.这本来是一个非常好的功能,但却由于另外一个问题,会给一些Python初学者造成困扰. 这一篇文章,我们讲讲工作区导致的这个问题. 首先我们 ...

  2. python安装出错运行不了_安装python失败是什么原因?

    在准备学习python编程语言的时候,就开始进行安装Python,但是总是显示失败,安装不成功是什么原因呢? 首先要看自己安装的路径.文件有没有丢失,如果安装的路径.文件不对,那么python也是会安 ...

  3. python游戏代码运行不了_无法使我的tic tac toe游戏在python中正确运行

    转不到"玩家1"的原因是你的支票中缺少一个空格.你也没有正确地检查一个玩家何时获胜,这就是为什么你会有这种奇怪的行为.你需要检查每个位置,而不仅仅是最后一个.我还添加了对用户输入的 ...

  4. python粘贴代码运行不了_老师上课总是不给PPT?于是我用几行python代码偷偷复制U盘文件...

    上大学的时候有老师不给上课的PPT,就总想有个程序能偷偷复制老师的U盘....其实用几行python代码就能搞定了.分两步,首先写出来python代码,其次把.py文件转换成exe文件,直接在wind ...

  5. python恶搞代码打开对方摄像头_用Python获取摄像头并实时控制人脸的实现示例

    实现流程 从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像(就像你使用本地静态图片一样) 程序启动后,根据监听器信息,使用一个while循环,不 ...

  6. python绘制散点图运行结果是_用python绘制散点图

    今天下午学习了如何使用python绘制简单的散点图,写成博客分享一下. 在python中画散点图主要是用matplotlib模块中的scatter函数,先来看一下scatter函数的基本信息. 网址为 ...

  7. python一行代码是什么意思_一行Python代码能做什么?

    很典型的文章,基本可以展示Python代码到底有多黑魔法.虽然文中有些案例连我都觉得走火入魔,但真的很值得一看... 自从08年接触Python,就有爱不释手的感觉,逐渐地,有些不忍地疏远了Perl ...

  8. python圣诞树代码成品图片动态_节日快乐! Python画一棵圣诞树送给你

    本文实例为大家分享了Python画圣诞树的具体代码,供大家参考,具体内容如下 源代码 from turtle import * import random import time #from unit ...

  9. python脱离依赖运行py文件_将一个python.py文件拆分为多个相互依赖的文件

    我想将我编写的一个大python模块拆分成一个目录中的多个文件,其中每个文件都是一个函数,它可能与模块中的其他函数有依赖关系,也可能没有依赖关系.下面是我想出的一个简单的例子: 首先,这里有一个自包含 ...

最新文章

  1. java 线程 连接池_java程序实现线程连接池功能
  2. stateflow中终止节点小记
  3. linux下使用protobuf实现简单配置功能
  4. FCN网络的训练——以SIFT-Flow 数据集为例
  5. java 单例 生命周期_单例模式--- 声明周期托管方式
  6. python 图片读写_Python各种图像库的图像的基本读写方式
  7. ASP.NET自定义服务器控件
  8. win10安全中心关闭不了怎么办
  9. OPPO推送:推送消息的字串,用于参数
  10. 【 HDU1081 】 To The Max (最大子矩阵和)
  11. 解决xshell flashfxp等工具连接不上本机上的虚拟机
  12. 如何听节拍器_学琴必备的节拍器,你用对了么?
  13. 语音合成IC与语音IC的两三事
  14. php-fpm 开机启动,mac系统,php-fpm加入开机启动项
  15. 【web开发】js实现表单提交
  16. Flink1.12 文档
  17. Java中的角度问题,求三角函数,角度,弧度,一文足够
  18. javalang 生成抽象语法树AST ----python源码分析
  19. 数显之家快讯:「SHIO世硕心语」改变你的人生格局,2021年你应当做这三件事!
  20. 5大原因告诉你,Python程序员为何如此难招!

热门文章

  1. HTML+CSS学习笔记(3)- 认识标签(2)
  2. SQLserver通过链接服务器连接oracle
  3. OpenCV2简单的特征匹配
  4. Docker容器的数据卷备份与恢复
  5. DELL R340 14G服务器的RAID划分
  6. windows server 查看当前登陆的用户 query user
  7. 加菲猫的人生歪理~ 看完果然开心,哈哈~
  8. Eclipse Ctrl+Alt+↓ 失效问题解决
  9. failed to open stream :HTTP request failed 解决方法
  10. Python3基础 try-指定except-as reason 捕获打开一个不存在的文件的时候,会产生OSError异常的示例