社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

菜鸟学Python • 4 年前 • 418 次点击  
公众号关注 “菜鸟学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,引入模块:



02

构建界面


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

1).构造1个窗口

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

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

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

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



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

效果如下


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

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

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

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


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



运行程序,效果如图


4)在右侧添加设置栏

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


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


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


添加设置信息


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



03

添加时间控件


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


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


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

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


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

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

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

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

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



04

添加提示框


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


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




05

记分问题


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


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

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

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

之前说过,每个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做个石头剪刀布


需要源码,请找菜鸟哥,后台输入:【菜鸟哥】
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/55650
 
418 次点击