python实现flappy bird游戏


Posted in Python onDecember 24, 2018

flappy bird最近火遍大江南北,教你用python写游戏的第一课就向它开刀了。

这个课程的基础是假定你有比较不错的编程功底,对python有一点点的基础。

一、准备工作

1、用python写游戏需要什么呢?

 1)当然是python本身了,我用的是python2.7,不同版本大同小异。

 2)pygame,这个非常重要,所有的核心都是基于这个lib的。

2、分析游戏

  flappy bird这个游戏很简单,大致可以分为4个部分:

  1)背景。背景分为两个,一个是bg,一个是land。bg就是那张有着天空白云的图,land就是最下面有斜杠的图。

   2)bird。这个不用我说,主角是也。

  3)pipe。就是那个水管。

  4)其他。包括开始菜单和分数板。

着重分析的就是bird和pipe。

 bird会一直往右飞,不点屏幕就会往下掉。

 pipe会不断地出现,每通过一个pipe就会加一分。

 bird撞到pipe或者掉到地上游戏就会结束。

3、准备资源

 找一个flappy bird的apk,提取一下内部文件,你就可以获得:

 1)一张叫做atlas.png的图片。里面有所有我们要用得到的图。

 2)5个ogg文件,包含了所有音效。

 3)一个叫做atlas.txt的文本文件,包含了图片在大图中的位置。

二、开始

上一中,我们已经分析过了2个核心,bird和pipe。这一单元,我要讲诉的就是bird。

首先呢,我们需要创建一个对象,这个对象取名为Bird。

Bird具有以下属性:

  1)图片。具体来说就是他长什么样。

  2)大小。长多大。

  3)是否撞到了。还记得游戏规则么,撞到就gameover了。

  4)速度。每一帧移动多远。

这只bird没事还会往下掉,点一下就会往上飞,这就是两个动作。

于是,编写了如下代码:

class Bird(pygame.sprite.Sprite):
  def __init__(self,bird_img,pos):
    pygame.sprite.Sprite.__init__(self)
    self.image = bird_img
    self.rect = self.image.get_rect()
    self.rect.midbottom = pos
    self.speed = 1
    self.is_hit = False
  def move(self):
    self.rect.left += self.speed
    self.rect.top += self.speed
  def click(self):
    self.rect.top -= 1.5*self.speed

还记得最开始我说过,flappy bird所有的图片资源都在一张图片altas.png上。

pygame提供了一个函数,可以让我们方便的取出资源。

我们先载入图片

#load img
game_img = pygame.image.load('res/img/atlas.png')
bg_rect = pygame.Rect(0,0,288,512)
bg_img = game_img.subsurface(bg_rect).convert()
 然后分别获取需要的图片。
#config bird
bird_rect = pygame.Rect(0,970,48,48)
bird_pos = [100,230]
bird_img = game_img.subsurface(bird_rect).convert_alpha()
bird = Bird(bird_img,bird_pos)

这样 bird和bg(background)的图片就落实了。

最后,因为是在电脑上运行,点屏幕就需要改成相应的按下空格键。

key_pressed = pygame.key.get_pressed()
  if not bird.is_hit:
    if key_pressed[K_SPACE]:
      bird.click()

 终于,任务完成了,虽然,虽然程序有点小bug,但这是下面要说的问题了。

完整代码如下:

# -*- coding: utf-8 -*-
"""
@author: Kevio
"""
import pygame
from pygame.locals import *
from sys import exit
import random
 
# configure
screen_w = 288
screen_h = 512
 
# class
class Bird(pygame.sprite.Sprite):
  def __init__(self,bird_img,pos):
    pygame.sprite.Sprite.__init__(self)
    self.image = bird_img
    self.rect = self.image.get_rect()
    self.rect.midbottom = pos
    self.speed = 1
    self.is_hit = False
  def move(self):
    self.rect.left += self.speed
    self.rect.top += self.speed
  def click(self):
    self.rect.top -= 1.5*self.speed
    
# init the game
pygame.init()
screen = pygame.display.set_mode((screen_w,screen_h))
pygame.display.set_caption('flappy bird @Kevio')
 
#load img
game_img = pygame.image.load('res/img/atlas.png')
bg_rect = pygame.Rect(0,0,288,512)
bg_img = game_img.subsurface(bg_rect).convert()
#config bird
bird_rect = pygame.Rect(0,970,48,48)
bird_pos = [100,230]
bird_img = game_img.subsurface(bird_rect).convert_alpha()
bird = Bird(bird_img,bird_pos)
#config the game
score = 0
clock = pygame.time.Clock()
running = True
 
while running:
  clock.tick(60)
 
  screen.fill(0)
  screen.blit(bg_img,(0,0))
 
  if not bird.is_hit:
    screen.blit(bird.image,bird.rect)
    bird.move()
  else:
    running = False
    
  pygame.display.update()
 
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      exit()
 
  key_pressed = pygame.key.get_pressed()
  if not bird.is_hit:
    if key_pressed[K_SPACE]:
      bird.click()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python正则表达式match和search用法实例
Mar 26 Python
python简单获取本机计算机名和IP地址的方法
Jun 03 Python
python类装饰器用法实例
Jun 04 Python
python Celery定时任务的示例
Mar 13 Python
Python中Numpy包的安装与使用方法简明教程
Jul 03 Python
Python OpenCV对本地视频文件进行分帧保存的实例
Jan 08 Python
Flask框架工厂函数用法实例分析
May 25 Python
python将字母转化为数字实例方法
Oct 04 Python
Python下应用opencv 实现人脸检测功能
Oct 24 Python
DataFrame 数据合并实现(merge,join,concat)
Jun 14 Python
基于Python爬取搜狐证券股票过程解析
Nov 18 Python
python使用pycharm安装pyqt5以及相关配置
Apr 22 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
Dec 24 #Python
python 在屏幕上逐字显示一行字的实例
Dec 24 #Python
python之Flask实现简单登录功能的示例代码
Dec 24 #Python
python实现逐个读取txt字符并修改
Dec 24 #Python
Python判断一个list中是否包含另一个list全部元素的方法分析
Dec 24 #Python
python读取txt文件中特定位置字符的方法
Dec 24 #Python
python进行文件对比的方法
Dec 24 #Python
You might like
几种显示数据的方法的比较
2006/10/09 PHP
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
js操作table示例(个人心得)
2013/11/29 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
node.js中的path.normalize方法使用说明
2014/12/08 Javascript
jQuery中remove()方法用法实例
2014/12/25 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
2015/08/24 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
浅析javascript的return语句
2015/12/15 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
2017/03/10 Javascript
vue2.0 axios跨域并渲染的问题解决方法
2018/03/08 Javascript
create-react-app安装出错问题解决方法
2018/09/04 Javascript
详解webpack打包第三方类库的正确姿势
2018/10/20 Javascript
JS中实现浅拷贝和深拷贝的代码详解
2019/06/05 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
关于layui时间回显问题的解决方法
2019/09/24 Javascript
解决LayUI数据表格复选框不居中显示的问题
2019/09/25 Javascript
js实现盒子拖拽动画效果
2020/08/09 Javascript
Python学习之asyncore模块用法实例教程
2014/09/29 Python
从django的中间件直接返回请求的方法
2018/05/30 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
python爬虫selenium和phantomJs使用方法解析
2019/08/08 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
Python3 搭建Qt5 环境的方法示例
2020/07/16 Python
马来西亚网上购物:Youbeli
2018/03/30 全球购物
英国最全面的橄榄球联盟门票网站:Live Rugby Tickets
2018/10/06 全球购物
汇科协同Java笔试题
2012/03/31 面试题
领导干部培训感言
2014/01/23 职场文书
纠纷协议书
2014/04/16 职场文书
伦敦奥运会的口号
2014/06/21 职场文书