Python游戏 (胖鸟快飞Flappybird)

python游戏开发:(胖鸟快飞)

利用python提供的第三方库pygame和python的基础语法来开发此款小游戏,此款游戏代码行数不超过100行,即使是初学者也可以轻松的了解。最重要的是,通过此款游戏不仅打结实了python的基础理论知识,更使得枯燥的代码变得鲜活生动。

pygame安装:pip install pygame;(有编译器的小伙伴可以在setting中进行导入) 

第一步:了解游戏的基础框架;

游戏的形成就是运行界面的不停刷新,而死循环恰好就能实现此种功能,循环体内部就是游戏主体模块;

import pygame,time
from pygame.locals import *#导入库文件
img=pygame.image.load('图片url')#加载图片素材def GameOver():pygame.quit()#游戏退出def main():pygame.init()#游戏初始化windowSize=pygame.display.set_mode([480,640])#游戏窗口界面pygame.display.set_caption('游戏名称')#游戏标题设置pygame.display.update()#游戏界面刷新while True:'''游戏主体模块''''''事件响应'''for event in pygame.event.get():if event.type==QUIT:pygame.quit()#游戏退出windowsSize.fill(pygame.Color(R,G,B))#窗体背景颜色填充,默认为黑色pygame.display.update()#游戏界面刷新time.sleep('休眠时间')#一般是0.05-0.09if __name__=='__main__':main()#主函数

运行结果:(背景色为黑色的,大小为480*640的窗体)

第二步:绘制简单图像并实现简单的按键响应;

首先我们要理解什么是面向对象的概念,并通过恰当的方式构造我们所需要的类,以方便我们的后序操作;

不了解的小伙伴们可以从这里学习相关知识:https://blog.csdn.net/weixin_44638960/article/details/95233484

class Bird:#胖鸟类position=[30,200]#鸟的初始位置birdColor=pygame.Color(255,255,0)#一只黄色的小鸟speed=1#小鸟的速度bird_score=0#小鸟得分

在定义完类之后我们可以通过此模板来实例化一个胖鸟对象:bird=Bird()

之后我们在构造自己的Draw方法,来实现简单的图形绘制;(pygame提供了draw来实现简单图像的绘制这里我们来绘制一个简单的矩形。)

python函数的定义与使用:https://blog.csdn.net/weixin_44638960/article/details/94551997

def DrawRect(windowsSize,bird):pygame.draw.rect(windowsSize,bird.birdColor,Rect(bird.position[0],bird.position[1],30,30))

运行结果:(在幕布上出现了一个黄色的矩形,也就是我们的胖鸟,后期我们会让它更加生动) 

那么问题又来了,如何使这个小胖鸟通过按键响应来动起来呢。pygame提供了type属性来判断按键的状态以及key属性来判断哪一个按键被触发,根据不同的情况来响应不同的事件。 

flag=0#这里我们加一个标志位,如果鸟想要飞就不会下降
for event in pygame.event.get():if event.type == QUIT:GameOver()  #游戏退出elif event.type==KEYDOWN:#按键响应if event.key==K_SPACE:bird.position[1]=bird.position[1]-bird.speed*50*level#根据等级胖鸟上升或下降flag=1
if flag==0:#检测位bird.position[1]=bird.position[1]+bird.speed*10*level
flag=0

做到这里是不是开始觉得有点游戏的样子了,我们的小胖鸟可以根据我们按空格的频率上升或下降了(哈哈);

第三步:障碍物的制作与移动;

同构造鸟类一样,我们类似的构造一个管道类;

class PipeLine:#管道类pipe_x=300#记录管道横坐标位置pipe_y=[]#留给小鸟飞行的间隙pipeColor=pygame.Color(115,190,44)#管道的颜色

在使用管道之前我们要对其进行初始化Init,根据纵坐标的计算我们留出4个空位置给胖鸟,并在初始化中将这几个空位加以标注,方便我们后期绘制管道障碍物。下面是我们构造的PipeInit方法;

def PipeInit(pipe):#初始化管道start = random.randint(0, 10) * 30pipe.pipe_y.append(start)pipe.pipe_y.append(start + 30)pipe.pipe_y.append(start + 60)pipe.pipe_y.append(start + 90)

胖鸟是通过空格键进行上下的移动,而管道的移动则不受用户的控制且移动方向为水平从右向左依次运动,这里我们采用了随着循环的移动将管道横坐标位置依次减1的方式实现鸟儿与管道的相对运动,而这些操作都可以与管道的绘制同时进行。下面我们来构造绘制管道的方法:

def DrawPipeLine(windowSize,pipeList,bird):#绘制管道for pipe in pipeList:pipe.pipe_x=pipe.pipe_x - 10for i in range(0,20):if i*30 not in pipe.pipe_y:#not in实现空隙的留白pygame.draw.rect(windowSize, pygame.Color(0,145,0), Rect(pipe.pipe_x, i*30, 60, 30))#绘制矩形管道if pipe.pipe_x<=-40:#判断管道是否移动出界bird.g_score = bird.g_score + 1#游戏成绩增加pipe.pipe_x=480pipe.pipe_y=[]PipeInit(pipe)pipeList.pop()#弹出移出屏幕的管道pipeList.append(pipe)#将新管道添加进入管道列表

第四步:游戏胜负结果的判断;

到此为止我们基本已经实现了该游戏的全部功能,但每个游戏都会结束,我们这个游戏目前只是实现了地图和精灵的移动,并没有实现能使游戏结束的功能;在这里我们使用一个Check方法来对游戏进行判断;

def CheckGame(bird,pipe):#游戏判断if bird.position[1]<0 or bird.position[1]>570:pygame.quit()#跑出上下界限if bird.position[0]+30>pipe[0].pipe_x and bird.position[0]<pipe[0].pipe_x+60:if bird.position[1]<pipe[0].pipe_y[0] or bird.position[1]+20>pipe[0].pipe_y[3]:pygame.quit()#游戏退出

有了此方法我最后一个主要功能也就到此结束了,下面我们来看一下此时游戏是不是与之前产生了区别,而且可玩性也有了质的飞跃(有些些许激动了吧,开始运行一下我们这个简单的demo吧)

第五步:游戏界面的优化与图片的导入;

怎么样是不是可以运行了,而且与我们预想的胖鸟是不是类似呢?但这是不是也有点太单调了,下面我们开始让着整个游戏界面更加的生动起来。之前我们提到的windowSize.fill()方法默认填充的是黑色我们只需修改填充背景的RGB颜色值即可将背景色改变成我们想要的颜色。

对于这只笨笨的黄色小胖鸟(长得确实挺方的),我们来对它进行一下整容,导入一个胖鸟图片并对原来绘制矩形的地方做出相应的修改即可让它脱胎换骨;

游戏精灵导入格式:flappyBird = pygame.image.load("Bird.png")#加载游戏图片;

对于游戏得分的提示信息,可以通过pygame中自带的font设置字体字号,将其添加到幕布中即可(在这里我们只给出得分提示信息的代码,你也可以根据需要填充其他的提示信息)。

font = pygame.font.SysFont('宋体', 24);
text = font.render("Game Score:" + str(bird.g_score), True, (255, 255, 255));
windowsSize.blit(text, Rect(360, 10, 200, 120));#text为所填充的文本内容,Rent(x,y,len,width)

FINALLY 圆满收官(MayBe 我或许会添加新的功能模块):

游戏完整代码:

import pygame,random,sys,time
from pygame.locals import *#导入库文件
flappyBird = pygame.image.load("Bird.png")#加载游戏图片
level=1#游戏等级class Brid:#鸟类position = [10,200]#初始位置speed=1#移动速度g_score = 0  # 游戏得分BridColor=pygame.Color(255,255,0)#颜色黄色class PipeLine:#管道类pipe_x=300pipe_y=[]pipeColor=pygame.Color(115,190,44)def GameOver():pygame.quit()#游戏退出def Leveling(count):#等级判定if count<=10:return 1else:return count/10def GameInit(windowSize,brid):#游戏初始化windowSize.blit(flappyBird,Rect(brid.position[0], brid.position[1], 30, 30))pygame.display.update()def PipeInit(pipe):#初始化管道start = random.randint(0, 10) * 30pipe.pipe_y.append(start)pipe.pipe_y.append(start + 30)pipe.pipe_y.append(start + 60)pipe.pipe_y.append(start + 90)def DrawPipeLine(windowSize,pipeList,bird):#绘制管道for pipe in pipeList:pipe.pipe_x=pipe.pipe_x - 10for i in range(0,20):if i*30 not in pipe.pipe_y:pygame.draw.rect(windowSize, pygame.Color(0,145,0), Rect(pipe.pipe_x, i*30, 60, 30))if pipe.pipe_x<=-40:bird.g_score = bird.g_score + 1pipe.pipe_x=480pipe.pipe_y=[]PipeInit(pipe)pipeList.pop()pipeList.append(pipe)def CheckGame(bird,pipe):#游戏判断if bird.position[1]<0 or bird.position[1]>570:pygame.quit()#跑出上下界限if bird.position[0]+30>pipe[0].pipe_x and bird.position[0]<pipe[0].pipe_x+60:if bird.position[1]<pipe[0].pipe_y[0] or bird.position[1]+20>pipe[0].pipe_y[3]:pygame.quit()#游戏退出def main():flag=0#标记位pygame.init()#游戏初始化windowsSize=pygame.display.set_mode([480,600])#设置窗口大小pygame.display.set_caption('FlappyBrid')  # 窗口标题font = pygame.font.SysFont('宋体', 24)bird=Brid()#创建鸟实例pipeList=[]#管道列表pipe1= PipeLine()pipe2= PipeLine()PipeInit(pipe1)pipe2=pipe1#对象的值拷贝pipe2.pipe_x=pipe2.pipe_x+80pipeList.append(pipe1)pipeList.append(pipe2)windowsSize.fill(pygame.Color(113,197,205))GameInit(windowsSize,bird)#游戏初始化DrawPipeLine(windowsSize,pipeList,bird)while True:#游戏主体level = Leveling(bird.g_score)text = font.render("Game Score:" + str(bird.g_score), True, (255, 255, 255))text1 = font.render("Level:" + str(level), True, (255, 255, 255))for event in pygame.event.get():if event.type == QUIT:GameOver()  #游戏退出elif event.type==KEYDOWN:#按键响应if event.key==K_SPACE:bird.position[1]=bird.position[1]-bird.speed*50*levelflag=1if flag==0:#检测位bird.position[1]=bird.position[1]+bird.speed*10*levelflag=0windowsSize.fill(pygame.Color(113,197,205))CheckGame(bird, pipeList)DrawPipeLine(windowsSize,pipeList,bird)windowsSize.blit(text, Rect(360, 10, 200, 120))windowsSize.blit(text1, Rect(360, 40, 200, 120))GameInit(windowsSize,bird)time.sleep(0.1-level/100)if __name__=='__main__':main()#主函数

 游戏运行截图:

如果有什么问题,还请小伙伴们进行指证(求各位大佬,多多包容哦^_^)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/68216.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

234树到红黑树

2-3-4 树 1. 2-3-4树的定义 2-3-4树是一种阶为4的B树。它是一种自平衡的数据结构&#xff0c;可以保证在O(lgn)的时间内完成查找、插入和删除操作。它主要满足以下性质&#xff1a; &#xff08;1&#xff09;每个节点每个节点有1、2或3个key&#xff0c;分别称为2&#xff…

飞翔小鸟思路及代码

昨天跳着看视频把飞翔小鸟做出来了&#xff0c;下面分享一下我的思路。 先放成品图 和上一篇飞机大战的思路相似&#xff1a; 1.先把窗体做出把背景图放在面板中 2.把游戏背景中地面移动实现 3.把柱子在面板中实现进场及移动 4.把小鸟放在面板中 5.鼠标监听控制小鸟飞行轨…

luogu p4556 [Vani有约会]雨天的尾巴 树上差分,最近公共祖先,线段树合并

命运的选择 题意神一般的过程及题解. 本来有信仰用 m a p map map套 s e t set set跑过去的,结果调了一天都没调出来,时间还比暴力都慢.只好写线段树合并. 题意 给 一 棵 树 , 每 次 用 一 种 颜 色 覆 盖 树 上 一 条 路 径 . 求 每 一 个 点 覆 盖 次 数 最 多 的 颜 色 , 如…

一文详解数字源表

一、数字源表的基本功能 集多种功能为一体的精密测量仪器&#xff0c;主要是测量电气性能 SMU可以当电源,万用表或电源/测量组合. 当电源时&#xff1a; 可编程电压源 可编程电流源 当万用表时&#xff1a; 数字电压表(电流源,输出电流为0,测电压) 数字电流表(电压源,输…

1044 火星数字( ( ఠൠఠ )搞我心态 )【!!常看!!】

火星人是以 13 进制计数的&#xff1a; 地球人的 0 被火星人称为 tret。地球人数字 1 到 12 的火星文分别为&#xff1a;jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。火星人将进位以后的 12 个高位数字分别称为&#xff1a;tam, hel, maa, huh, tou, kes, h…

机械制图之图线基础知识

1.图线的型式 1)常用基本图线: 8 种。 粗实线、细实线、细虚线、细点画线、波浪线、细双点画线、双折线、粗点画线。 2)线宽: 粗、细两种。 线宽比2:1 &#xff0c; 粗线宽度优先采用0.5 mm、0.7㎜。 不同的线型具有不同的含义。 2.图线的应用 3.图线的画法 1)同一图样中同…

机械制图哪个软件好用?浩辰CAD机械2021你值得拥有!

浩辰CAD机械 2021不仅能完美兼容主流CAD设计数据&#xff0c;还拥有业内更完备的智能专业设计功能&#xff0c;集机械制图、机构设计和数据管理等功能模块于一体。本篇机械制图CAD教程小编将详细介绍浩辰CAD机械 2021&#xff0c;帮助大家更好地了解和上手这款最新版本CAD软件。…

UML画图工具汇总

最近学习了UML&#xff0c;搜集了一把各类的画图工具以及它们的特点。最后选出我认为最好用的一款工具。 rose 《大象》书里面就是用的这款软件&#xff0c;但是这个貌似要钱&#xff0c;破解版版本很低&#xff0c;界面看起来也比较复古。不推荐。 star uml 挺有名的软件&…

超详细的热图绘制教程(5000余字),真正的保姆级教程

生物信息学习的正确姿势 NGS系列文章包括NGS基础、高颜值在线绘图和分析、转录组分析 &#xff08;Nature重磅综述|关于RNA-seq你想知道的全在这&#xff09;、ChIP-seq分析 &#xff08;ChIP-seq基本分析流程&#xff09;、单细胞测序分析 (重磅综述&#xff1a;三万字长文读懂…

机械制图-画、读组合体的视图

制图是什么&#xff1f;制图就是投影&#xff01; 依照惯例&#xff0c;雷老师上课前还是带领大家复习了上节课组合体的组合形式和物体分类的知识点&#xff0c;并且讲解了上次作业中需要注意的问题。比如对于涉及弧的问题&#xff0c;一些人没有投影线&#xff0c;一般点和特…

超好用的两款作图工具,用起来~~~

前言 作为程序员&#xff0c;项目开发过程中肯定会需要画一大堆图&#xff0c;原型图、流程图、UML图、思维导图、拓扑图等等&#xff0c;找到一个好工具肯定是能大大提高工作效率&#xff0c;这里就来分享两款我平时用得比较多的画图工具(这不是广告&#xff0c;也不是推广&a…

机械制图——常见的机件表达

文章目录 标准件与常用件1. 螺纹与螺纹紧固件螺纹旋合画法螺栓装配简化画法螺钉装配简化画法双头螺钉装配简化画法六角头螺栓连接画法双头螺柱连接画法开槽圆柱头螺钉连接画法开槽沉头螺钉连接画法 2. 键&#xff08;平键&#xff09;3. 销圆柱销圆锥销 4. 齿轮 零件图与装配图…

绘图小能手gunplot

下面的安装过程是在ubuntu20.04上进行的。 安装gnuplot需要依赖lua5.2。所以先安装lua5.2。 安装lua5.2 下载安装包 wget http://www.tecgraf.puc-rio.br/lua/ftp/lua-5.2.0.tar.gz编译安装lua5.2 解压后进入源码目录 make linux sudo make install安装gnuplot gnuplot主…

CAD机械制图入门知识

在计算机技术不断发展的过程中&#xff0c;CAD技术水平也得到了很大的提升&#xff0c;这使得CAD技术在机械制图当中的使用范围越来越大。CAD是常用的制图软件&#xff0c;具有很强的功能性&#xff0c;特别是在3D制图方面CAD有着较强的实用性。 对于大部分的人来说&#xff0c…

机械制图笔记

机械图纸上Φ50H7什么意思&#xff1f; 一般代表直径50的孔&#xff0c;H7的公差在这里是0.025mm/-0mm。 理论值M6的外径就是6毫米&#xff0c;实际上达不到&#xff0c;因为螺纹的尖顶都是圆角,通过查表m6的最大外径是5.92MM,这是基本数值。 机械制图中EQS&#xff0c;表示…

使用MapBox自定义地图

一、什么是MapBox&#xff0c;相对国内地图厂商的优势 MapBox是一家美国的地图厂商&#xff0c;2010 年成立于美国华盛顿&#xff0c;2017 年获得软银 1.64 亿美元 C 轮融资&#xff0c;完全开源的开发工具&#xff0c;帮助您在现有产品中实现灵活、轻量、稳定的地图、搜索、导…

企业网络设计,看这6个案例就够了

百度、美团的网络我们都可以称他们为企业网络。因为他们的网络本身是为自己提供服务&#xff0c;不提供网络的接入服务。 企业网主要包括三块内容&#xff1a;园区网、广域网和数据中心。按照网络用途来分&#xff0c;也可以分为办公网和生产网。 以上术语都是根据自己公司的…

雷军10周年演讲全文:没有任何成功是不冒风险的

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 2020年8月11日19:30&#xff0c;小米十周年&#xff0c;雷军公开演讲如约而至。在近3小时的演讲中&#xff0c;雷军用20个故事回顾了小米过去的热血10年&#xff0c;也展望了新的10年&#xff1a; 创新之火将会照亮每个疯…

一行代码值 200 万?雷军公开小米新 Logo 引吐槽

↓推荐关注↓ 今年是小米成立的第 10 年&#xff0c;从最初的 10 几个人创始团队&#xff0c;发展到如今的 3 万多员工。 为了迎接第十年&#xff0c;雷军透露在三年前&#xff08;2017年&#xff09;市场部同事曾建议他“升级品牌识别系统&#xff0c;先从 logo 开始。” 说干…

小米上市,雷军或成中国首富?作为科技粉也许你该关注的是这些

作者 | Leo 作为股票市场的老韭菜&#xff0c;这几天营长关注到的科技圈新闻有两个。 一个是 21 世纪经济报道的消息&#xff1a;证监会要对四大新兴行业独角兽 IPO “即报即审”&#xff0c;四个行业具体为生物科技、云计算、人工智能、高端制造。这意味着包括人工智能在内的四…