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检测字符串中是否包含某字符集合中的字符
May 21 Python
开始着手第一个Django项目
Jul 15 Python
python中使用序列的方法
Aug 03 Python
Python GUI Tkinter简单实现个性签名设计
Jun 19 Python
python实现泊松图像融合
Jul 26 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 Python
Python类中self参数用法详解
Feb 13 Python
jupyter notebook 增加kernel教程
Apr 10 Python
Scrapy 配置动态代理IP的实现
Sep 28 Python
使用python实现学生信息管理系统
Feb 25 Python
如何在pycharm中快捷安装pip命令(如pygame)
May 31 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遍历解析xml字符串的方法
2016/05/05 PHP
PHP单链表的实现代码
2016/07/05 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
php反射学习之依赖注入示例
2019/06/14 PHP
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
基于javascript实现listbox左右移动
2016/01/29 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
微信小程序实现实时圆形进度条的方法示例
2017/02/24 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
Python字典操作详细介绍及字典内建方法分享
2018/01/04 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
详解python 爬取12306验证码
2019/05/10 Python
Pyinstaller 打包exe教程及问题解决
2019/08/16 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
Python matplotlib可视化实例解析
2020/06/01 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
Python configparser模块应用过程解析
2020/08/14 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
工业学校毕业生自荐信范文
2014/01/03 职场文书
幼儿园教师培训制度
2014/01/16 职场文书
学生操行评语大全
2014/04/24 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
医学专业大学生求职信
2014/07/12 职场文书
员工给公司的建议书
2019/06/24 职场文书
sql字段解析器的实现示例
2021/06/23 SQL Server