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 random模块常用方法
Nov 03 Python
pygame学习笔记(5):游戏精灵
Apr 15 Python
深入理解python中的浅拷贝和深拷贝
May 30 Python
利用Python获取操作系统信息实例
Sep 02 Python
使用Kivy将python程序打包为apk文件
Jul 29 Python
python如何为被装饰的函数保留元数据
Mar 21 Python
使用Python Pandas处理亿级数据的方法
Jun 24 Python
python安装scipy的方法步骤
Jun 26 Python
Python Collatz序列实现过程解析
Oct 12 Python
python字符串反转的四种方法详解
Dec 02 Python
python识别验证码图片实例详解
Feb 17 Python
Python合并多张图片成PDF
Jun 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获取中文拼音首字母类和函数分享
2014/04/24 PHP
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
2017/02/05 PHP
JavaScript 原型继承
2011/12/26 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
JavaScript实现的MD5算法完整实例
2016/02/02 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
2016/08/19 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
详解vue-router和vue-cli以及组件之间的传值
2017/07/04 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
使用Vue构建可重用的分页组件
2018/03/26 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
[01:14]TI珍贵瞬间系列(六):冠军
2020/08/30 DOTA
python通过pil为png图片填充上背景颜色的方法
2015/03/17 Python
开始着手第一个Django项目
2015/07/15 Python
解决DataFrame排序sort的问题
2018/06/07 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
Python基础教程之输入输出和运算符
2020/07/26 Python
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
自荐信如何“自荐”
2013/10/24 职场文书
实习生求职自荐信
2014/02/07 职场文书
《再见了,亲人》教学反思
2014/02/26 职场文书
大专学生求职自荐信
2014/07/06 职场文书
护士2015年终工作总结
2015/04/29 职场文书
2016年精神文明建设先进个人事迹材料
2016/02/29 职场文书
Python基础之hashlib模块详解
2021/05/06 Python
解决Pytorch中关于model.eval的问题
2021/05/22 Python
CSS link与@import的区别和用法解析
2023/05/07 HTML / CSS