Python版本:3.6.4

相关模块:

pygame模块;

以及一些python自带的模块。

安装Python并添加到环境变量,pip安装需要的相关模块即可。

在终端运行如下命令即可:

效果如下:

这里介绍一下游戏的实现原理。

首先,我们对游戏进行一些必要的初始化工作:

接着,我们来考虑一下,游戏中有哪些游戏元素:

小恐龙:由玩家控制以躲避路上的障碍物;

路面:游戏的背景;

云:游戏的背景;

飞龙:路上的障碍物之一,小恐龙碰上就会死掉;

仙人掌:路上的障碍物之一,小恐龙碰上就会死掉;

记分板:记录当前的分数和历史最高分。

让我们来依次定义一下这些游戏元素类。对于云,路面以及仙人掌来说,定义起来很简单,我们只需要加载对应的游戏元素图片:

然后写两个类内部方法 update和 draw就ok了。两个方法分别用于将场景不断向左移动以实现小恐龙不断向前移动的动画效果和将场景显示在游戏界面的对应位置上。具体而言,代码实现如下:

'''云'''classCloud( pygame. sprite. Sprite):def__init__( self, imagepath, position, **kwargs):pygame.sprite.Sprite.__init_ _( self)# 导入图片self.image = pygame.image.load(imagepath)self.rect = self.image.get_rectself.rect.left, self.rect.top = position# 定义一些必要的参数self.speed = - 1'''将云画到屏幕上'''defdraw( self, screen):screen.blit( self.image, self.rect)'''更新云'''defupdate( self):self.rect = self.rect.move([ self.speed, 0])ifself.rect.right < 0:self.kill

'''仙人掌'''classCactus( pygame. sprite. Sprite):def__init__( self, imagepaths, position=( 600, 147), sizes=[( 40, 40), ( 40, 40)], **kwargs):pygame.sprite.Sprite.__init_ _( self)# 导入图片self.images = []image = pygame.image.load(imagepaths[ 0])fori inrange( 3):self.images.append(pygame.transform.scale(image.subsurface((i* 101, 0), ( 101, 101)), sizes[ 0]))image = pygame.image.load(imagepaths[ 1])fori inrange( 3):self.images.append(pygame.transform.scale(image.subsurface((i* 68, 0), ( 68, 70)), sizes[ 1]))self.image = random.choice( self.images)self.rect = self.image.get_rectself.rect.left, self.rect.bottom = positionself.mask = pygame.mask.from_surface( self.image)# 定义一些必要的变量self.speed = - 10'''画到屏幕上'''defdraw( self, screen):screen.blit( self.image, self.rect)'''更新'''defupdate( self):self.rect = self.rect.move([ self.speed, 0])ifself.rect.right < 0:self.kill

记分板的定义也类似,只不过它不需要移动,但是需要实时地更新当前 的分数:

上面代码用 is_highest变量来区分该记分板是否用于记录游戏最高分,还是只是记录当前的分数,做该区分的原因是游戏最高分前面有 HI标识,所以占的空间更大:

飞龙的定义就稍微复杂一些了,因为它不仅需要向左移动,还需要做出不停扇动翅膀的效果。具体而言,飞龙有两张图:

你需要做的就是每隔一段时间就切换一次当前的飞龙图片,以实现飞龙扇动翅膀的效果:

最后,我们需要定义一下小恐龙类,也就是最复杂的一个游戏精灵类。它有低头,跳跃,普通前进三种状态。对于低头来说:

你只需要和飞龙扇动翅膀一样,不断切换两张低头的图片以实现小恐龙跑动的效果就可以了。

对于普通状态也是类似的:

对于跳跃状态,我们则可以通过初中学的上抛和自由落体运动公式来建模,从而计算小恐龙在竖直方向上的位置。具体而言,代码实现如下:

定义完游戏精灵类,我们就可以实例化他们:

然后写游戏主循环啦:

游戏主循环的逻辑很简单,即每帧游戏画面,我们都需要检测一下玩家的操作,如果玩家按下了空格键或者↑键,则小恐龙跳跃,如果玩家按下了↓键,则小恐龙低头,否则小恐龙正常向前冲。

然后在游戏中,我们随机产生云,飞龙和仙人掌这些游戏场景和障碍物,并且和路面一起以相同的速度向左移动,从而实现小恐龙向右移动的视觉效果。在移动的过程中,我们需要对小恐龙和仙人掌,小恐龙和飞龙进行碰撞检测,当小恐龙碰到这些障碍物时,小恐龙就死掉了,本局游戏也随之结束。

需要注意的是我们应该使用 collide_mask函数来进行更为精确的碰撞检测,而不是之前的 collide_rect函数:

即当两个目标的最小外接矩形有重叠时, collide_rect就会判定两个目标有碰撞,这显然是不合理的,会给玩家带来较差的游戏体验。

另外,当分数每提高一千分,我们就和原版的游戏一样增加一点场景和障碍物向左移动的速度(也就是增加小恐龙向右移动的速度)。

最后,把当前所有的游戏元素绑定到屏幕上并更新当前的屏幕就ok了。

大概就是这样,大功告成~完整源代码详见相关文件呗~

https://github.com/CharlesPikachu/Games/tree/master/Game7

欢迎给个star

作者:白露未晞me

来源:Charles的皮卡丘

100行Python代码做出魔性声控游戏

小恐龙游戏python_用Python实现谷歌的小恐龙游戏:p相关推荐

  1. python实现图片找不同游戏_用Python实现谷歌的小恐龙游戏

    (给Python开发者加星标,提升Python技能) 来源: Charles的皮卡丘-白露未晞me理 谷歌流量器中有个很有名的彩蛋:当你网络出现问题时,就会出现一个"小恐龙游戏". ...

  2. java小恐龙游戏_用Python实现谷歌的小恐龙游戏

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 谷歌流量器中有个很有名的彩蛋:当你网络出现问题时,就会出现一个"小恐龙游戏&quo ...

  3. python画恐龙_教你用Python实现谷歌的小恐龙游戏

    谷歌流量器中有个很有名的彩蛋:当你网络出现问题时,就会出现一个"小恐龙游戏". (如果想要直接进行游戏,可以在地址栏输入:chrome://dino ) 今天我们就来给大家演示下, ...

  4. python小游戏编程实例-Python实现的弹球小游戏示例

    本文实例讲述了Python实现的弹球小游戏.分享给大家供大家参考,具体如下: 弹球 1. Ball 类 draw负责移动Ball 碰撞检测,反弹,Ball检测Paddle 2.Paddle类 draw ...

  5. Python游戏开发,Python实现贪吃蛇小游戏与吃豆豆 附带源码

    开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 贪吃蛇 ...

  6. 【python小游戏】用python写一款小游戏--贪吃蛇

    大家好,我是爱吃饼干的小白鼠,今天给大家分享一款自制小游戏.如何用python编写贪吃蛇. 今天,突发奇想的想用python写一款小游戏--贪吃蛇.相信大家都玩过,那么玩一款自己写的是一种什么样的体验 ...

  7. 飞机大战游戏python_基于Python的飞机大战游戏

    基于 Python 的飞机大战游戏 杨铠 [期刊名称] <电脑迷> [年 ( 卷 ), 期] 2017(000)021 [摘要] 我们每天都享受到科技带来的好处 , 了解计算机编程对每个人 ...

  8. Python小项目,我拿Python做了这些小玩意儿

    平时的一些小想法,大都可以在网上找到很多大神们的实现方法,特别是用python实现,借助于丰富的第三方库,加以理解和简单的修改,python真的适合完成一些突发奇想的小工具. 1 用python获取实 ...

  9. python游戏脚本实例-python实现的简单文本类游戏实例

    本文实例讲述了python实现的简单文本类游戏实现方法.分享给大家供大家参考.具体实现方法如下: ################################################### ...

最新文章

  1. djangorestframework怎么这么好用!
  2. Fedora下网络配置及相关命令
  3. 邪恶的Java帝国是怎么欺负小函数的?
  4. SAP WM模块常用T-code
  5. 【例题5-7 UVA - 136】Ugly Numbers
  6. 蓝桥杯物联网例程下载
  7. 日本語趣味読み 一 星とり
  8. 华为硬件工程师社招机考题库_中级会计机考你了解吗?机考操作常见八大问题速看...
  9. Ubuntu中的密钥环密码与登陆密码不同
  10. 黑苹果睡眠唤醒usb失灵_20191121关于睡眠唤醒,仍然黑屏,显示器无信号的问题...
  11. 基于JAVA+SpringMVC+Mybatis+MYSQL的线上电器商城
  12. django1.2中将ManyToManyField呈现为checkbox
  13. 【DC-DC开关电源芯片的使用(LM2596)】
  14. 系统集成项目管理工程师06《项目成本管理》
  15. pause 和 title
  16. 露营不在朋友圈,快乐在诗和远方
  17. java获取当前日期,前一天,前N天,去年同期等日期
  18. SpringCloud系列之Eureka服务注册及发现
  19. 高通baseband多媒体简介
  20. linux如何配置java环境_linux虚拟机配置java环境

热门文章

  1. uniapp通过点击事件click跳转到指定页面
  2. 【git】error updating changes
  3. 华清远见学习—“进制之间的转换”
  4. unity 三消游戏源码展示图
  5. 来自网页的消息服务器不能创建对象,Automation服务器不能创建对象的多种解决办法...
  6. 基于C++的车辆装甲板检测自瞄系统
  7. selenium-识别验证码
  8. android局域网直播,安卓共享局域网硬盘实现云播放的方法
  9. 新零售 — RFID 应用案例
  10. ActiveMQ是什么