手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

公众号关注 “菜鸟学Python

设为 “星标”,重磅干货,第一时间送达!

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

烟花三月下扬州,我想3月能下楼。虽然很多地方都已经开始慢慢的开放了,但是我怀念的胡辣汤,海底捞,还有烧鸡都没有开门。眼看宅在家,吃了睡睡了吃,肚子上的救生圈都出来了一层又一层。宅男的我都练出一身厨艺。买了理发工具已经可以兼职当“Tony”老师理发了。

想必大家已经窝在家里快发霉了吧,趁着时间充裕,我又重新捡起了之前学习的PyQt5。以前不是有一个打地鼠的游戏,这次用简单100多行代码写一个《消灭地鼠病毒》的小游戏,效果如下,废话少说先看视频!

视频镇楼

01

PyQt介绍及安装

PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成。PyQt5本身拥有超过620个类和6000函数及方法。在可以运行于多个平台,包括:Unix, Windows,and Mac OS。Python的gui中有三大框架,分别是PyQt、wxpython和tkinter,我个人偏爱于PyQt,因为PyQt是比较流行的一个 Tkinter 的替代品,功能非常强大,可以用Qt开发多美漂亮的界面,也就可以用PyQt开发多么漂亮的界面

安装PyQt

其实安装比较简单,只需在命令行输入pip install PyQt5,引入模块:

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

02

构建界面

构造窗口,添加图标和音乐,并以网格形式对控件进行布局

1).构造1个窗口

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

  • PyQt5应用必须创建一个应用(Application)对象;

  • sys.argv参数是一个来自命令行的参数列表,Top是窗口的类,setFixedSize设置窗口大小为900x600;

  • show()方法在屏幕上显示出widget;

  • sys.exit(app.exec_())调用主循环用于接收来自窗口触发的事件,并且转发他们到widget应用上处理

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

2).添加图标、名称及背景音乐

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

效果如下

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

3).构造网格布局,并将25张地洞图片填满5x5=25个网格

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

  • QgridLayout为网格布局,除了网格布局,PyQt5有绝对位置和布局类两种布局管理方式;

  • 其中布局管理又分为水平布局、垂直布局、网格布局、表单布局四种布局方法;

  • 每种方法都有其特点,这里不再展开,有兴趣的朋友可以研究一下,本次只采用网格布局;

首先创建QgridLayout的实例,然后循环构造25个virus类,最后通过addWidget()方法将25个virus类分别放入imagelayout实例中,其中每个virus都包含地洞图等信息

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

运行程序,效果如图

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

4)在右侧添加设置栏

大家可以发现,上述效果图布局比较稀疏,因为我留有空余,想在右边放置一列设置栏,包含开始游戏、消灭病毒数、逃跑病毒数以及剩余时间等信息。

首先构造1个新的窗口,并将其嵌入主窗体中:

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

创建QgridLayout的实例,然后构造新窗口,设置大小,将其添加到主窗体中,addWidget5个参数分别为要添加的新窗口、在第1行、第6列,占5行、1列,效果如下:

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

添加设置信息

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

用setText函数对各个标签进行命名,最后用addWidget将其放入新加的窗口中,其中“开始游戏”标签还绑定了gamestart函数,后续还会讲到,效果如下:

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

03

添加时间控件

为什么要添加时间控件呢?因为我们要设置一局游戏的时长、要设置病毒每次出现的时间间隔、要设置病毒停留的时间,PyQt5有现成的计时函数Qtimer,我们需要设置3个计时器。

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

共添加了全局计时、病毒随机出现计时、剩余时间计时共3个计时器,这3个计时器都在gamestart函数下启动

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

当点击“开始游戏”时,会启动gamestart函数,然后启动timer(全局)、virustimer(病毒出现间隔)、remainter(游戏剩余时间)3个计时器,同时,计时器会按照设置的时间循环定时启动绑定的函数。其中全局计时器绑定gameover函数

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

即30秒后会调用该函数,将结束游戏。

病毒出现计时器绑定virusactive函数

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

首先检测上个病毒在哪个位置出现,然后将该位置恢复为地洞图片,其中virus.flag(初始值为0,病毒出现后设置成1)是病毒出现在哪个框的标志;

后续会用于检测小锤是否砸到病毒。接着用random函数在25个地洞中随机选出下次病毒将会出现的位置,并将该位置的地洞图片替换为病毒出现的图片。

剩余时间计时器绑定remainTimeshow函数

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

每个1秒更新一下剩余时间,并用setText函数将更新内容投送到remaintimeText标签框,请大家注意,最下面一行是重新启动剩余时间计时器,这样就能达到循环的效果了。

04

添加提示框

为了避免游戏中不小心点了右上角的叉号而将游戏关闭,需要添加1个提示框

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

closeEvent代表窗口关闭时间,用QMessageBox.question函数进行消息提示,效果如下

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

05

记分问题

经过上面的几个步骤,基本框架已经搭建完了,现在需要考虑如何消灭病毒和计分的问题了。

1).首先绑定1个鼠标事件,即鼠标点击时,将鼠标指针换成落下的小锤图片

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

mousePressEvent为鼠标点击函数,每次鼠标点击时该函数会启动,停留0.1秒,接着启动upTime计时器,该计时器绑定up函数

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

即0.1秒后鼠标指针由落下的小锤图片替换成抬起的锤子图片,这样就完成了1次敲击动作。最后构造1个kill函数,主要用于计分

手把手教你!100行代码,用Python做一个“消灭病毒”的小游戏

之前说过,每个virus类都有其特征,那么我们就可以比对当前小锤砸到的virus类是否是病毒之前出现的那个virus类,通过什么来比较呢?

还记得前面说过的virus.flag吗?我们设置的每个virus的flag的初始值为0,当病毒出现在该virus类时,之前已将其设置成1,只需要看看当前小锤砸到的virus类的flag是否为1就可以判断小锤是否砸到病毒了,如果砸到则计1分。


到这里基本已经将游戏的整个编写过程讲解完毕,这只是1个非常基础的游戏,PyQt还可以制作很多更加高大上的游戏,感兴趣的朋友可以继续研究探索。

近期热门:

十行代码,用Python做一个迷你版的美图秀秀

实战:Flask + Vue 生成漂亮的词云

Python和Go都很火,我要怎么选?

情人眼里出西施,我用Python帮你搞定了!

高手心得|菜鸟学Python从入门到进阶

漫画,假装自己是Python高手,学会这十招就可以

看了范伟和葛大爷的电影,我决定用Python做个石头剪刀布

需要源码,请找菜鸟哥,后台输入:【菜鸟哥】