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命令行参数sys.argv使用示例
Jan 28 Python
用Python编写一个简单的俄罗斯方块游戏的教程
Apr 03 Python
Django与JS交互的示例代码
Aug 23 Python
使用Flask集成bootstrap的方法
Jul 24 Python
使用python批量化音乐文件格式转换的实例
Jan 09 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
bluepy 一款python封装的BLE利器简单介绍
Jun 25 Python
python3使用GUI统计代码量
Sep 18 Python
Python with语句和过程抽取思想
Dec 23 Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 Python
通过Python实现一个简单的html页面
May 16 Python
你需要掌握的20个Python常用技巧
Feb 28 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
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
php 参数过滤、数据过滤详解
2015/10/26 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
extjs之去除s.gif的影响
2010/12/25 Javascript
Javascript异步编程模型Promise模式详细介绍
2014/05/08 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
JavaScript图像延迟加载库Echo.js
2016/04/05 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
简单实现js倒计时功能
2017/02/13 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
小谈angular ng deploy的实现
2020/04/07 Javascript
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
python生成带有表格的图片实例
2019/02/03 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
python生成并处理uuid的实现方式
2020/03/03 Python
推荐技术人员一款Python开源库(造数据神器)
2020/07/08 Python
英国派对礼服和连衣裙购物网站:TFNC London
2018/07/07 全球购物
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
如何安装ruby on rails
2014/02/09 面试题
总经理职责范文
2013/11/08 职场文书
工程监理应届生求职信
2013/11/09 职场文书
学校搬迁方案
2014/06/15 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
法定代表人身份证明书
2014/09/10 职场文书
单位接收函格式
2015/01/30 职场文书
高中信息技术教学反思
2016/02/16 职场文书
Python time库的时间时钟处理
2021/05/02 Python
Mysql 用户权限管理实现
2021/05/25 MySQL