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文档生成工具pydoc使用介绍
Jun 02 Python
详解Python的Django框架中的模版继承
Jul 16 Python
python操作 hbase 数据的方法
Dec 18 Python
浅谈Python实现Apriori算法介绍
Dec 20 Python
对python numpy数组中冒号的使用方法详解
Apr 17 Python
Python异常处理操作实例详解
May 10 Python
python实现集中式的病毒扫描功能详解
Jul 09 Python
Python遍历字典方式就实例详解
Dec 28 Python
Python生成词云的实现代码
Jan 14 Python
Python使用enumerate获取迭代元素下标
Feb 03 Python
简单了解Django项目应用创建过程
Jul 06 Python
python redis存入字典序列化存储教程
Jul 16 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
ftp类(myftp.php)
2006/10/09 PHP
实用函数3
2007/11/08 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
说说PHP的autoLoad自动加载机制
2012/09/27 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
js 操作select相关方法函数
2009/12/06 Javascript
javascript 实现简单的table排序及table操作练习
2012/12/28 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
Javascript检查图片大小不要让大图片撑破页面
2014/11/04 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
基于JavaScript实现的折半查找算法示例
2017/04/14 Javascript
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
JSON字符串操作移除空串更改key/value的介绍
2019/01/05 Javascript
jquery实现两个div中的元素相互拖动的方法分析
2020/04/05 jQuery
jQuery中event.target和this的区别详解
2020/08/13 jQuery
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
python实现网站的模拟登录
2016/01/04 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
python实现UDP协议下的文件传输
2020/03/20 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
英国现代绅士品牌:Hackett
2017/12/17 全球购物
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
学生个人求职自荐信格式
2013/09/23 职场文书
护士辞职信范文
2014/01/19 职场文书
领班岗位职责范文
2014/02/06 职场文书
党支部特色活动方案
2014/08/20 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
校长师德表现自我评价
2015/03/05 职场文书