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实现数通设备端口使用情况监控实例
Jul 15 Python
Python操作SQLite数据库的方法详解
Jun 16 Python
Python2.7编程中SQLite3基本操作方法示例
Aug 09 Python
django用户注册、登录、注销和用户扩展的示例
Mar 19 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
Apr 20 Python
Python单元测试简单示例
Jul 03 Python
浅谈python3发送post请求参数为空的情况
Dec 28 Python
python自定义函数实现一个数的三次方计算方法
Jan 20 Python
python实现对图片进行旋转,放缩,裁剪的功能
Aug 07 Python
python Django框架实现web端分页呈现数据
Oct 31 Python
Python基于Tensor FLow的图像处理操作详解
Jan 15 Python
Python中Selenium对Cookie的操作方法
Jul 09 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高效率写法(详解原因)
2013/06/20 PHP
PHP文件上传类实例详解
2016/04/08 PHP
php实现映射操作实例详解
2019/10/02 PHP
laravel 数据验证规则详解
2019/10/23 PHP
一个tab标签切换效果代码
2009/03/27 Javascript
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
JSON JQUERY模板实现说明
2010/07/03 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
JS实现图片产生波纹一样flash效果的方法
2015/02/27 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
2016/02/06 Javascript
深入浅析JavaScript中数据共享和数据传递
2016/04/25 Javascript
js获取指定字符前/后的字符串简单实例
2016/10/27 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
bootstrap table服务端实现分页效果
2017/08/10 Javascript
浅析Vue自定义组件的v-model
2017/11/26 Javascript
浅谈React高阶组件
2018/03/28 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
使用post方法实现json往返传输数据的方法
2019/03/30 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
Python跳出循环语句continue与break的区别
2014/08/25 Python
python获取当前日期和时间的方法
2015/04/30 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
django将图片上传数据库后在前端显式的方法
2018/05/25 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
几个Linux面试题笔试题
2016/08/01 面试题
应用英语专业自荐信
2014/01/26 职场文书
学校消防演习方案
2014/02/19 职场文书
前台接待岗位职责
2015/02/03 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server