最近接触到了python里面的pygame模块,可以用来写一些很有意思的小游戏,我稍微了解了一些pygame 里面常用的方法,然后自己写了一个简陋版的flappy bird,整个代码大概两百行不到,接下来浅浅做一个代码解读。

flappy bird 里面有两样主要的元素:小鸟和柱子。我对它们分别建了一个类。

小鸟类如下:

class Bird:def __init__(self,screen):self.size=[30,30]self.location=[385,285]self.speed=1self.image=pygame.image.load('小鸟.png')self.image=pygame.transform.scale(self.image,(self.size[0],self.size[1]))self.imageRect=self.image.get_rect()self.imageRect=self.imageRect.move(self.location[0],self.location[1])screen.blit(self.image,self.imageRect)self.screen=screen

小鸟类的属性有它的大小、位置、速度和对应的图像。在构造函数里,我在游戏屏幕上绘制了小鸟的初始图像。

然后是柱子类:

class Pillar:def __init__(self):self.width=70self.color=27,190,72self.position=[pygame.display.Info().current_w,0]self.upPillarHeight=random.randint(150,400)self.gapHeight=random.randint(80,150)self.downPillarHeight=pygame.display.Info().current_h-self.upPillarHeight-self.gapHeightself.speed=1

柱子类的属性有它的大小、位置、颜色,由于在flappy bird 中,柱子总是上下两段成对出现,我让每一对柱子都作为一个单独的对象,给它们随机一个上下柱子的高度和中间空隙的高度。另外在游戏中,小鸟在往前飞,也可以理解为柱子在往后倒退,所以我将小鸟的水平速度设为0,并且给柱子赋予一个水平向左的速度。

定义完了两个类,接下来进入游戏的主要逻辑。

首先是游戏的初始化,我写了一个这样的方法:

def initGame():pygame.init()screen=pygame.display.set_mode(windowSize)pygame.display.set_caption('Flappy Bird')pygame.key.set_repeat(1,2)

游戏的初始化需要调用pygame.init()方法,然后用pygame.display.set_mode()方法来设置游戏窗口的大小,用set_caption方法来设置游戏标题。pygame.key.set_repeat()方法是用来让键盘在被持续按下时游戏可以持续响应。

然后需要建立小鸟和柱子对象。由于在游戏中柱子是不断刷新的,我使用了一个列表来存储当前有效的柱子。

bird=Bird(screen)
pillarList=[]
pillarList.append(Pillar())
pillarList.append(Pillar())

接下来用while(True)使游戏不断地运行起来。在每一轮循环里,需要使小鸟和柱子进行相应的移动。两者的移动代码是相似的,所以我只展示小鸟类的移动方法:

    def move(self,screen):BLACK=0,0,0pygame.draw.rect(screen, BLACK, (self.location[0], self.location[1], self.size[0], self.size[1]))if self.location[1]==0 and self.speed<0:self.speed=-self.speedself.location[1]+=self.speedself.imageRect=self.imageRect.move(0,self.speed)screen.blit(self.image,self.imageRect)

如果小鸟速度为正,则向下移动,为负则向上移动。实现小鸟的移动只需要将小鸟的原位置涂成背景色(在这里是黑色),然后改变小鸟的位置,并且在新的位置重新绘制小鸟图像。

我设定柱子列表中只有两个柱子,在前面的一个柱子从屏幕上消失后,就将其从列表中删除,并且添加新的柱子。

if pillarList[0].getPosition()+pillarList[0].width<0:pillarList.remove(pillarList[0])pillarList.append(elements.Pillar())

在原版游戏中,我们可以看到对键盘不做任何操作时小鸟会往下掉,如果按下键盘小鸟则会向上飞。下面这段代码通过改变小鸟的速度方向实现了这个功能。

        for event in pygame.event.get():if event.type==pygame.QUIT:sys.exit()if event.type==pygame.KEYDOWN:if event.key==pygame.K_SPACE:bird.setNegativeSpeed()if event.type==pygame.KEYUP:bird.setPositiveSpeed()

小鸟类中的setNegativeSpeed()和setPositiveSpeed()方法即用来将小鸟速度设置成负或正,非常简单,这里不再展示。

现在我们已经让小鸟和柱子运动起来,整个游戏的雏形就搭好了。接下来需要做的是判断小鸟撞到地上或者撞到柱子上的情况,以结束游戏。

#判断是否撞上柱子
for pillar in pillarList:if bird.touchPillar(pillar):bird.setZeroSpeed()for p in pillarList:p.setZeroSpeed()font.render_to(screen,(100,250),'Oops! You ran into the pillar!',fgcolor=fontColor)font.render_to(screen,(90,320),'Press [R] to restart the game.',fgcolor=fontColor)#判断是否撞到地上if bird.touchGround():bird.setZeroSpeed()for p in pillarList:p.setZeroSpeed()font.render_to(screen, (50, 250), 'Oops! You dropped on the ground!', fgcolor=fontColor)font.render_to(screen, (90, 320), 'Press [R] to restart the game.', fgcolor=fontColor)

至此,整个游戏的基本功能已经实现,我还进行了一些细节上的调整,比如加入了开始界面和结束界面。来看看最终的效果吧!

感谢阅读!如果需要整个源码,请戳戳我!

pygame初探:复刻小游戏《Flappy Bird》相关推荐

  1. 【新手上路】Java必备小游戏——Flappy Bird(飞翔的小鸟)

    <飞翔的小鸟>是一款曾经比较火热的小游戏,本文可以带你你从零开始,一步一步的开发出这款小游戏.如果你只是刚入门java的新手,不用担心,只要你简单掌握了该游戏所需要的javase基础知识, ...

  2. 我的第一个Unity的2D小游戏(Flappy Bird)

    前言 兜兜转转跑来学习unity了,学习利用的是unity2017.2版本,在看过网上所谓的一堆零基础入门的视频后(确实0基础,无外乎都从界面开始介绍,然后是脚本基础几个API的介绍,然后讲解了下UG ...

  3. 用Unity3D开发2D小游戏 Flappy Bird

    简介: 最近在学习Unity3D,用了两天时间做了个小游戏打算放上了和大家分享一下,项目名定义为Flapping,是参考Flappy Bird做的,高手勿喷. 这是原本游戏效果图: 这是本项目效果图: ...

  4. java小游戏------Flappy Bird(飞翔的小鸟含源码)

    前言:本小游戏可作为java入门阶段收尾创作. 需:掌握面向对象的使用,了解多线程和异常处理等知识. 如上图所示:我们需要绘制背景,小鸟,障碍物,当然也包括游戏开始界面以及死亡界面. 一:思路解析: ...

  5. 游戏Flappy Bird走红启示:没人知道玩家想要什么

    [导读]Flappy Bird现排名中国区App Store免费榜第四名.该游戏日平均广告收入达到了5万美元. 腾讯科技 王鑫 2月7日报道 游戏开发者一直在试图了解,到底玩家会喜欢什么样的游戏?免费 ...

  6. 用Phaser来制作一个html5游戏——flappy bird (一)

    用Phaser来制作一个html5游戏--flappy bird (一) Phaser是一个简单易用且功能强大的html5游戏框架,利用它可以很轻松的开发出一个html5游戏.在这篇文章中我就教大家如 ...

  7. 体感游戏 | 手势识别玩飞机大战游戏(一) 用pygame实现飞机大战小游戏

    Color Space OpenCV与AI深度学习 后面将分四篇文章来介绍实现手势识别控制飞机大战游戏的功能,它们分别是: 使用Pygame实现简易飞机大战小游戏 使用Python+OpenCV实现简 ...

  8. Python使用pygame编写贪吃蛇小游戏

    Python使用pygame编写贪吃蛇小游戏 代码如下: # -*- coding:utf-8 -*- """ 贪吃蛇 """ import ...

  9. Python——pygame 面向对象的飞行小鸟(Flappy bird)

    飞行小鸟(Flappy bird) 一些想法 分析需要的功能 构建整体框架 着手完整代码 一些想法 基本游戏界面就是这样 分析需要的功能 我的构思是将游戏分成三个部分 初始游戏菜单界面 游戏进行界面 ...

  10. Pygame:编写一个小游戏

    大学最后的考试终于结束了,迎来了暑假和大四的漫长的"自由"假期.当然要自己好好"玩玩"了. 我最近在学习Python,本意是在机器学习深度学习上使用Python ...

最新文章

  1. 网络协议OSI、TCP/IP协议、Socket套接字和第三方AsyncSock的使用等解析
  2. hbase1.1.1 连接集群_除了HAProxy,RabbitMQ集群还可以这样用
  3. Spark读取MySQL中的数据为DataFrame
  4. SecureCRT通过密钥进行SSH登录
  5. csc.exe的环境变量设置
  6. 基于探究式教学法的计算机网络原理课程的教学改革与实践,基于探究式教学法的“计算机网络原理”课程的教学改革与实践分析...
  7. C/C++——有关转义字符和ASCII码表
  8. django girls_Django Girls Budapest团队的活动筹划技巧
  9. 面试微软等公司必备的书
  10. unity怎么根据坐标绘制线_怎么根据阴线和阳线判断股票将稳步上涨或者下跌不止,K线组合...
  11. php if k 1,PHP实现大数字格式化成K/M/B结尾的简短形式
  12. 解决计算机主机与打印机共享打印机,主机上的打印机已经设置了共享可是另外的电脑却不能用也搜索不到共享打印机...
  13. java分号_java – 为什么这些分号不会产生错误?
  14. Linux中exec函数用法,linux exec用法总结
  15. Notepad++的第三方插件介绍中文翻译
  16. Probability and Stochastic Models(1) —— 研一新课学习笔记
  17. ubuntu16.04 安装opencv的viz模块
  18. 百度地图自定义覆盖物,在手机上无法监听click事件
  19. TTSR:用Transformer来实现端到端的超分辨率任务 | CVPR2020
  20. jQuery三款简约MP3播放器插件

热门文章

  1. peoplesoft 更新表接口程序
  2. 善于抓住80后消费者的消费心理
  3. 快速批量导出excel超链接
  4. 保护眼睛颜色的RGB数值
  5. pat basic 1082 射击比赛
  6. MOCTF-WRITE-UP(二)
  7. SAP This Open SQL statement uses additions that can only be used
  8. jeecg-boot环境搭建
  9. HTML 边框和背景设置
  10. 重启PocketPC移动设备