使用 Python 开发一个恐龙跑跑小游戏,玩起来
作者 | 周萝卜
来源 | 萝卜大杂烩
相信很多人都玩过 chrome 浏览器上提供的恐龙跑跑游戏,在我们断网或者直接在浏览器输入地址“chrome://dino/”都可以进入游戏
今天我们就是用 Python 来制作一个类似的小游戏
素材准备
首先我们准备下游戏所需的素材,比如恐龙图片,仙人掌图片,天空,地面等等,我们统一放到 dino 文件夹下
游戏逻辑
我们使用 Pygame 来制作游戏,先进行游戏页面的初始化
import pygame# 初始化
pygame.init()
pygame.mixer.init()
# 设置窗口大小
screen = pygame.display.set_mode((900, 200))
# 设置标题
pygame.display.set_caption("恐龙跳跳")
# 使用系统自带的字体
my_font = pygame.font.SysFont("arial", 20)
score = 0
# 背景色
bg_color = (218,220,225)
接下来我们将各种素材加载进内存
# 加载正常恐龙
dino_list = []
temp = ""
for i in range(1, 7):temp = pygame.image.load(f"dino/dino_run{i}.png")dino_list.append(temp)
dino_rect = temp.get_rect()
index = 0# x 初始值
dino_rect.x = 100
# y 初始值
dino_rect.y = 150
# print(dino_rect)# 设置y轴上的初速度为0
y_speed = 0
# 起跳初速度
jumpSpeed = -20
# 模拟重力
gravity = 2加载地面
ground = pygame.image.load("dino/ground.png")# 加载仙人掌
cactus = pygame.image.load("dino/cactus1.png")
cactus_rect = cactus.get_rect()
cactus_rect.x,cactus_rect.y = 900,140# 加载重新再来
restart = pygame.image.load("dino/restart.png")
restart_rect = restart.get_rect()
restart_rect.x,restart_rect.y = (900-restart.get_rect().width)/2,(200-restart.get_rect().height)/2+50
# 加载 gameover
gameover = pygame.image.load("dino/gameover.png")
gameover_rect = gameover.get_rect()
gameover_rect.x, gameover_rect.y = (900-gameover.get_rect().width)/2, (200-gameover.get_rect().height)/2
# 地面移动速度与距离
ground_speed = 10
ground_move_distance = 0# 时钟
clock = pygame.time.Clock()# 重新再来一次
is_restart = False
text_color = (0,0,0)
再接下来,我们通过一个 while 死循环来保持游戏进程
while True:# 每秒30次clock.tick(30)...
在上面的循环当中,我们需要两个检测机制,事件检测和碰撞检测
事件检测
# 事件侦测for event in pygame.event.get():if event.type == pygame.QUIT:if result_flag:with open("result.ini", "w+") as f:f.write(str(best))sys.exit()# 空格键侦测if event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE and dino_rect.y==150:y_speed = jumpSpeed
主要检测退出事件和空格键事件
碰撞检测
# 碰撞检测if dino_rect.colliderect(cactus_rect):while not is_restart:# 事件侦测for event in pygame.event.get():if event.type == pygame.QUIT:if result_flag:with open("result.ini", "w+") as f:f.write(str(best))sys.exit()# 空格键侦测if event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:is_restart = Truebg_color = (218,220,225)ground_speed = 10# 设置重新再来图片screen.blit(restart, restart_rect)screen.blit(gameover, gameover_rect)pygame.display.update()
对于碰撞,只要恐龙碰撞到了仙人掌,那么游戏结束,展示重新再来图片
由于我们希望游戏可以记录我们的最好成绩,所以这里使用了本地文件存储游戏记录的方式,当游戏结束的时候,根据当前游戏成绩来判断是否将新的成绩写入文件当中
下面是计算跑动距离和最好成绩的代码
# 统计距离score += ground_speedscore_surface = my_font.render("Distance: "+str(score), True, text_color)# 计算最好成绩result_flag = Falseif score >= best:best = scoreresult_flag = Truebest_result = my_font.render("Best Result: " + str(best), True, text_color)
我们还需要给不同距离增加不同的游戏难度,毕竟跑起来,肯定距离越远,难度越大嘛
# 更换背景色,成绩大于4000if score > 4000:bg_color = (55,55,55)ground_speed = 15text_color = (255,255, 255)
# 更换背景色,成绩大于8000if score > 8000:bg_color = (220,20,60)ground_speed = 20text_color = (255, 255, 255)# 更换背景色,成绩大于12000if score > 12000:bg_color = (25,25,112)ground_speed = 25text_color = (255, 255, 255)# 设置背景色screen.fill(bg_color)
最后我们将所有加载到内存当中的元素都呈现在 screen 上
# 设置地面图片1screen.blit(ground, (0-ground_move_distance, 180))# 设置地面图片2,在右边边界外screen.blit(ground, (900-ground_move_distance, 180))# 设置恐龙图片screen.blit(dino_list[index % 6], dino_rect)# 设置仙人掌图片screen.blit(cactus, cactus_rect)# 设置分数screen.blit(score_surface,(780,20))# 设置最好成绩screen.blit(best_result, (20, 20))pygame.display.update()
为了增加游戏性,我们再增加背景音乐和跳跃音效
pygame.mixer.music.load("background.mp3")
pygame.mixer.music.play(-1, 0)
sound = pygame.mixer.Sound('preview.mp3')
这样,一个简单易用的恐龙跑跑游戏就完成了,我们来看下效果吧
好了,今天的分享就到这里,喜欢就点个赞吧
相关文章:

了解和入门注解的应用
2019独角兽企业重金招聘Python工程师标准>>> 一、概述 jdk的java.lang包中提供的最基本的annotation 1、SuppressWarnings("deprecation") package staticimport.annotation;SuppressWarnings("deprecation") public class AnnotationTest {pub…

Linux下开发优秀链接
不得不说CSDN博客这次改版变化很大,但是友情链接功能太脆弱了。 只有自己写个帖子,不断更新吧。Linux基础 Linux内核mirrors163LVS中文站点 孙海龙 howtoforge.com 地中海东岸的蒲公英 服务器运维与网站架构 Nginx中文维基 ACME Bory.Chan Tim[后端技术]…

Q 版老黄带着硬核技术再登场,有点可爱,很有东西
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 看到下面这个老黄是不是觉得很Q~ 11月9日,GTC 大会再次来了,英伟达创始人兼CEO黄仁勋再次从自己虚拟厨房走出来。 本次 GTC 大会都有哪些亮点呢? Q 版黄仁勋 英伟达展…

linux第七章《档案与目录管理》重点回顾
转载于:https://www.cnblogs.com/wubingshenyin/p/4514969.html

Effective java 43返回零长度的数组或者集合而不是null
转载于:https://www.cnblogs.com/limingxian537423/p/8391285.html

《Unix网络编程卷1-套接字联网API》第一个例子编译 不通过问题解决
《Unix网络编程卷1-套接字联网API》是本好书。 但是第一个例子不是很好编译。 需要如下步骤: 本人机器CentOS 5.4 1.下载源码 unpv13e解压到任意目录 然后按其readme文件操作./configure # try to figure out all implementation differencescd lib # bu…

angularJs的学习笔记-01(创建项目)
1,进入angular-phonecat目录 执行下面命令 git checkout -f step-0 然后访问 http://localhost:8000/app/ 页面出现 “Nothing here yet!” 现在就可以自己创建HTML,编写angular了 app/index.html <!doctype html> <html lang"en"…

一文搞定深度学习建模预测全流程(Python)
作者 | 泳鱼来源 | 算法进阶本文详细地梳理及实现了深度学习模型构建及预测的全流程,代码示例基于python及神经网络库keras,通过设计一个深度神经网络模型做波士顿房价预测。主要依赖的Python库有:keras、scikit-learn、pandas、tensorflow&a…

第163天:js面向对象-对象创建方式总结
面向对象-对象创建方式总结 1、 创建对象的方式,json方式 推荐使用的场合: 作为函数的参数,临时只用一次的场景。比如设置函数原型对象。 1 var obj {};2 //对象有自己的 属性 和 行为3 // 属性比如: 年龄、姓名、性别4 // 行…

一个从四秒到10毫秒,花了1年的算法问题?
原文:一个从四秒到10毫秒,花了1年的算法问题?五一后的第一周,由于搬家腰扭伤了,没注意导致压迫神经,躺在床上休息了好几天。所以没事就挂 QQ,一个网友突然问了我一个算法问题。所以有了这篇文章。感触很深&…

xinetd 说明
xinetd 是什么在linux中一些不长期使用的服务(不重要的服务?)没有被作为单独的守护进程在开机时启用,linux把这些服务监听端口全部由一个独立的进程xinetd集中监听,当收到相应的客户端请求之后,xinetd进程就…

英特尔携手中科院计算所建立中国首个 oneAPI 卓越中心
11月12日,在第三届中国超级算力大会(ChinaSC 2021)上,英特尔与中国科学院计算技术研究所共同建立中国首个 oneAPI 卓越中心,来扩大 oneAPI 对中国本土国产硬件的支持及使用oneAPI来开发全栈式开源软件。 在上个月刚结…

前端学习资源分享
2019独角兽企业重金招聘Python工程师标准>>> 推荐大神文章(文字教程) 1 综合类 前端知识体系前端知识结构Web前端开发大系概览Web前端开发大系概览-中文版智能社 - 精通JavaScript开发JavaScript中的this陷阱的最全收集--没有之一JS函数式编程指南腾讯移动Web前端知…

Nginx源码分析链接
nginx-0.8.38源码探秘:http://blog.csdn.net/ccdd14/article/details/5872312nginx源码分析: http://blog.sina.com.cn/s/blog_677be95b0100iiv7.html

基于聚类的图像分割(Python)
作者 | 小白来源 | 小白学视觉了解图像分割当我们在做一个图像分类任务时,首先我们会想从图像中捕获感兴趣的区域,然后再将其输入到模型中。让我们尝试一种称为基于聚类的图像分割技术,它会帮助我们在一定程度上提高模型性能,让我…

4月第4周全球域名商TOP15:万网第四 增势减弱
IDC评述网(idcps.com)05月21日报道:据WebHosting.info公布的最新数据显示,在4月第4周,全球十五强域名商中,域名总量成功实现净增长的有7家。其中,中法各1家,即中国万网与OVH.NET&…

PXE全自动安装操作系统--centos7.3学习笔记
PXE服务器:192.168.110.110 环境准备 安装软件 # yum -y install dhcp tftp-server tftp vsftpd lftp DHCP配置 # cd /var/dhcp # cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf # vim /etc/dhcp/dhcpd.conf subnet 192.168.110.0 netmask…

无事“自动驾驶”,有事“辅助驾驶”?
近日来,智能汽车事故频发,且事故原因多与所谓的“自动驾驶”功能有关,这不由得引起了人们对“自动驾驶”发展前景的担忧。实际上,大众理解的“自动驾驶”与官方的定义可能有所出入。全球公认的标准一般是由SAE International&…

九、数据库群集部署、配置 (二)
九、 数据库群集部署、配置(二)配置DTC 角色高可用在群集管理器对话框,选择"配置角色",如图2. 选择"下一步",如图3. 在选择角色对话框,选择"分布式事务协调器(DTC&a…

Linux下怎么诊断网站性能异常
网站如果突然慢了,怎么样诊断? 先用Top命令查看进程 #top选择Haporxy代理的进程 #strace -p 25054进程在干什么看的一清二楚。

[Java面试五]Spring总结以及在面试中的一些问题.
2019独角兽企业重金招聘Python工程师标准>>> 1.谈谈你对spring IOC和DI的理解,它们有什么区别? IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spring框架管理&#…

一次完整的抓包分析 Reserved TCP/IP Port List
抓包如图所示: 本机IP被粉色遮住。。。http://www.skynet.ie/~colinmac/Programming/port_listing.htmlReserved TCP/IP Port List This is an complete list of the TCP/IP ports that are IANA registered and so are not for general use in network programming…

关于Centos下Clamv反病毒软件包更新问题
最近一直在研究学习Centos下搭建Postfix实现邮件网关的内容,以便后期邮件平台网关的灾备做一些准备,今天安装Postfix到了对Clamv反病毒软件包更新的安装配置部分,遇到了个小的插曲。 具体遇到问题看着不是什么大问题,就是Clamv之前…

Meta 研发触觉手套助力元宇宙,虚拟世界也可以有触觉
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 你不能戴着 Meta 的新型高科技虚拟现实手套抚摸狗。 但研究人员可以让它越来越接近。 Meta(前身为 Facebook)伴随着对于虚拟世界和元宇宙的领域而闻名。然而,七年…

如何判断哪个商城系统好?
现在市面上很多商城系统,如果开发者有商城系统的需求,那么可以用,可以缩短开发周期,网站更快速上线;可降低开发成本。但是正因为系统很多,怎么选择就是个问题了。因为一个商城所使用的商城系统也会产生对一…

TCP/IP中 3688端口是什么?
原文英文:http://www.corrupteddatarecovery.com/Port/3688udp-Port-Type-simple-push-s-simple-push-s.asp 翻译的不好将就看吧。 一个软件端口(通常只是被称为一个“口”)是一个虚拟的数据连接,可以通过程序用于直接交换数据&a…

文件处理命令:sed
使用:sed [-nefr] actionaction:-i直接修改读取的档案内容,而不是由屏幕输出,-r表示支持延伸型正则表达式的语法。动作说明:[n1[,n2]] function n1,n2表示要选择的行数,function包括:a-新增,c-取…

新技能 Get,使用直方图处理进行颜色校正
作者 | 小白来源 | 小白学视觉在这篇文章中,我们将探讨如何使用直方图处理技术来校正图像中的颜色。像往常一样,我们导入库,如numpy和matplotlib。此外,我们还从skimage 和scipy.stats库中导入特定函数。import numpy as np impor…

Oracle数据库 之 删除RMAN备份
#su – oracle 切换至存放备份的目录,删除不需要的备份文件。 $export ORACLE_SIDorcl $rman RMAN>connect target / RMAN>crosscheck backup; RMAN>delete expired backup; RMAN>exit 转载于:https://www.cnblogs.com/hdtiny/p/8420770.html

Linux环境编程--fflush(stdout)有什么作用
代码: printf("hello\n");//fflush(stdout);fork(); 输出: hello代码: printf("hello\n");fflush(stdout);fork(); 输出: hellohello说明:系统函数fork()创建新的进程。 printh后打印内容在缓冲区…