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 图片验证码代码
Dec 07 Python
在Python中marshal对象序列化的相关知识
Jul 01 Python
详解 Python 读写XML文件的实例
Aug 02 Python
深入理解Python中的*重复运算符
Oct 28 Python
在Python程序员面试中被问的最多的10道题
Dec 05 Python
Python使用re模块实现信息筛选的方法
Apr 29 Python
pandas如何处理缺失值
Jul 31 Python
Python pip 安装与使用(安装、更新、删除)
Oct 06 Python
使用matlab或python将txt文件转为excel表格
Nov 01 Python
Python的赋值、深拷贝与浅拷贝的区别详解
Feb 12 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
Jun 02 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 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
Yii2框架redis基本应用示例
2018/07/13 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
用JS实现的一个include函数
2007/07/21 Javascript
老鱼 浅谈javascript面向对象编程
2010/03/04 Javascript
在IE浏览器中resize事件执行多次的解决方法
2011/07/12 Javascript
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
JS使用正则实现去掉字符串左右空格的方法
2016/12/27 Javascript
Javascript中document.referrer隐藏来源的方法
2017/01/16 Javascript
微信小程序 下拉菜单简单实例
2017/04/13 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
2017/07/04 jQuery
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
详解Django框架中用context来解析模板的方法
2015/07/20 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
python 杀死自身进程的实现方法
2019/07/01 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
python 基于PYMYSQL使用MYSQL数据库
2020/12/24 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
马来西亚网上购物:Youbeli
2018/03/30 全球购物
《难忘的泼水节》教学反思
2014/02/27 职场文书
招股说明书范本
2014/05/06 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
办公室管理规章制度
2015/08/04 职场文书
七年级语文教学反思
2016/03/03 职场文书
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers