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正则表达式操作指南(re使用)
Sep 06 Python
python检测lvs real server状态
Jan 22 Python
Python基础教程之正则表达式基本语法以及re模块
Mar 25 Python
python使用turtle库绘制树
Jun 25 Python
python实现单链表中删除倒数第K个节点的方法
Sep 28 Python
Python运行不显示DOS窗口的解决方法
Oct 22 Python
详解配置Django的Celery异步之路踩坑
Nov 25 Python
Numpy数组array和矩阵matrix转换方法
Aug 05 Python
django 自定义filter 判断if var in list的例子
Aug 20 Python
python3通过udp实现组播数据的发送和接收操作
May 05 Python
详解Python利用configparser对配置文件进行读写操作
Nov 03 Python
pytorch 实现多个Dataloader同时训练
May 29 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
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
yii分页组件用法实例分析
2015/12/28 PHP
php下载文件超时时间的设置方法
2016/10/06 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
php命令行模式代码实例详解
2021/02/26 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
Javascript中的apply()方法浅析
2015/03/15 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
JQuery日期插件datepicker的使用方法
2016/03/03 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
详解在create-react-app使用less与antd按需加载
2018/12/06 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
微信小程序 确认框的实现(附代码)
2019/07/23 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
vue 出现data-v-xxx的原因及解决
2020/08/04 Javascript
Python3安装Pymongo详细步骤
2017/05/26 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
2017/06/05 Python
Python之Scrapy爬虫框架安装及使用详解
2017/11/16 Python
如何通过python画loss曲线的方法
2019/06/26 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
伦敦最著名的老字号百货公司:Selfridges(塞尔福里奇百货)
2016/07/25 全球购物
花园仓库建筑:Garden Buildings Direct
2018/02/16 全球购物
医院护士求职自荐信格式
2013/09/21 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
浅谈Python数学建模之数据导入
2021/06/23 Python