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()#主函数
游戏运行截图:
如果有什么问题,还请小伙伴们进行指证(求各位大佬,多多包容哦^_^)
Python游戏 (胖鸟快飞Flappybird)相关推荐
- iOS游戏《胖鸟大冒险》上架app store+感想
实际上是上个星期四发售的,在很多地方都转发了,居然忘了自己的博客. 这个是我和几个朋友在业余做的,断断续续也快一年了吧.自己主要负责的是所有程序,兼整个游戏设计(谁让想出这个点子的是人是我呢)和大部分 ...
- Python游戏引擎开发(一):序
邂逅Python 写了这么久的html5,感觉html5学得差不多了,是时候去接触更多的语言来扩充自己的能力了.我先后看了Swift,Java等语言.首先开发Swift需要一台mac,对于我这个寒士而 ...
- Python游戏开发:最强大脑第一关,数字华容道
前言 freegames是Apache2许可的Python游戏集合,旨在用于教育和娱乐,完全是开源的,我们只要引用编写就好,当前在最强大脑的舞台上的第一关就是数字华容道,好多人都栽在了上面,如果你也想 ...
- python趣味编程100_《Python游戏趣味编程》 第8章 勇闯地下一百层
知乎视频www.zhihu.com 图书简介可以看这里:童晶:<Python游戏趣味编程>新书上架了zhuanlan.zhihu.com 本章我们将编写一个勇闯地下一百层的游戏,键盘控 ...
- python游戏编程入门书籍推荐-游戏编程入门书籍推荐:想要游戏编程尽快入门这些书不要错过...
游戏编程一直都是编程之中的一大热点,这也是由于游戏本身的火热造成的结果,所以每年都有很多人在关注着游戏编程.介于此小编今天就来将一些好的游戏编程入门书籍推荐给大家,希望对想要了解和学习游戏编程的朋友能 ...
- c+和python哪个快-python比c更快
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python的优点是代码可重用性高和开发速度快,但是时间和内存的使用不如c++. ...
- 《Python游戏趣味编程》 第9章 贪吃蛇
9 贪吃蛇 图书简介可以看这里: 童晶:<Python游戏趣味编程>新书上架了 本章我们将编写一个贪吃蛇的游戏,效果如图9-1所示.键盘控制小蛇上下左右移动,吃到食物后长度加一:蛇头碰到自 ...
- 《Python游戏趣味编程》 第6章 见缝插针
6 见缝插针 Python游戏开发 图书简介可以看这里: 童晶:<Python游戏趣味编程>新书上架了 本章我们将编写一个见缝插针的游戏.按下空格键后发射一根针到圆盘上,所有发射的针跟着圆 ...
- python游戏编程入门下载-Python游戏编程入门 中文pdf扫描版|网盘下载内附地址提取码|...
Python是一种解释型.面向对象.动态数据类型的程序设计语言,在游戏开发领域,Python也得到越来越广泛的应用,并由此受到重视. 本书教授用Python开发精彩游戏所需的[]为重要的该你那.本书不 ...
最新文章
- 零基础学习大数据开发需要多久能工作?
- 【WPF】代码触发Button点击事件
- linux的/etc/hosts的作用
- IDEA配置自定义maven库
- 简单的链式语法及实际运用(链式编程的基本原理)
- DSA签名算法 - Java加密与安全
- [导入]Asp.net中动态在中加入Scrpit标签
- relativelayout中按键不能点_CNC | M80/M800系列系统常见按键和外部存储器故障
- IEC,ASTM,ISO,DIN,JIS等国际标准网站
- 4 读写文件_WEB安全之SQL注入(4)——读写文件
- SSO CAS 单点系列
- EMNLP | 一种端到端的文档级别的中文金融事件抽取框架Doc2EDAG
- 飞机大战小游戏2.0
- 405.数字转换为十六进制数
- 计算机组成原理(白中英) 第七章 课后题答案
- 求通俗讲解下tensorflow的embedding_lookup接口的意思
- 初级计算机英语,初级英语口语怎么学?
- Nielsen:网络广告信任度上升
- 通过js引入本地图片地址
- Matlab中的ismember和contains傻傻分不清