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二叉树的定义及常用遍历算法分析
Nov 24 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
Python 实现选择排序的算法步骤
Apr 22 Python
Python根据已知邻接矩阵绘制无向图操作示例
Jun 23 Python
django drf框架中的user验证以及JWT拓展的介绍
Aug 12 Python
python画微信表情符的实例代码
Oct 09 Python
python正则过滤字母、中文、数字及特殊字符方法详解
Feb 11 Python
将python文件打包exe独立运行程序方法详解
Feb 12 Python
Spark处理数据排序问题如何避免OOM
May 21 Python
python+django+selenium搭建简易自动化测试
Aug 19 Python
Django Model层F,Q对象和聚合函数原理解析
Nov 12 Python
Python Socket编程详解
Apr 25 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
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
js实现图片上传并预览功能
2018/08/06 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
antd配置config-overrides.js文件的操作
2020/10/31 Javascript
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
python右对齐的实例方法
2020/07/05 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
python中常用的数据结构介绍
2021/01/12 Python
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
本科毕业生专业自荐书范文
2014/02/05 职场文书
质检员工作总结2015
2015/04/25 职场文书
MySQL InnoDB ReplicaSet(副本集)简单介绍
2021/04/24 MySQL
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS
Python+tkinter实现高清图片保存
2022/03/13 Python
Apache Linkis 中间件架构及快速安装步骤
2022/03/16 Servers
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技