python实现简单flappy bird


Posted in Python onDecember 24, 2018

本文实例为大家分享了python实现flappy bird的简单代码,供大家参考,具体内容如下

import pygame
from pygame.locals import *
from sys import exit
import random
 
# 屏幕宽度
SCREENWIDTH = 288
# 屏幕高度
SCREENHEIGHT = 512
IMAGES = {}
# 背景图片地址
BACKGROUND_PATH = 'back_ground.png'
PIPE_PATH = 'pipe.png'
BASE_PATH = 'base.png'
PLAYER_PATH = (
  'bird2_0.png',
  'bird2_1.png',
  'bird2_2.png',
)
# 初始化
pygame.init()
# 创建窗口
SCREEN = pygame.display.set_mode((SCREENHEIGHT, SCREENHEIGHT))
# 设置窗口标题
pygame.display.set_caption("Flappy Bird")
 
# 加载图片,透明用convert_alpha,不透明用convert
IMAGES['background'] = pygame.image.load(BACKGROUND_PATH).convert()
IMAGES['base'] = pygame.image.load(BASE_PATH).convert_alpha()
IMAGES['bird'] = (
  pygame.image.load(PLAYER_PATH[0]).convert_alpha(),
  pygame.image.load(PLAYER_PATH[1]).convert_alpha(),
  pygame.image.load(PLAYER_PATH[2]).convert_alpha(),
)
IMAGES['pipe'] = (
  pygame.transform.rotate(pygame.image.load(PIPE_PATH).convert_alpha(), 180),
  pygame.image.load(PIPE_PATH).convert_alpha()
 
)
BASEY = SCREENHEIGHT * 0.82
 
# 设置帧率
FPS = 30
FPSCLOCK = pygame.time.Clock()
 
PIPE_WIDTH = IMAGES['pipe'][0].get_width()
PIPE_HEIGHT = IMAGES['pipe'][0].get_height()
PLAYER_WIDTH = IMAGES['bird'][0].get_width()
PLAYER_HEIGHT = IMAGES['bird'][0].get_height()
 
 
PIPEGAPSIZE = 100 # 两个水管之间的距离
x = SCREENWIDTH//2
y = SCREENHEIGHT//2
move_x = 0
move_y = 0
 
flap = 0 # 小鸟初始状态
pipeVelX = -4 # 管道x方向的速度
playerVelY = 0 # 小鸟y方向的初速度
playerMaxVelY = 10 # 小鸟y方向的最大速度
playerMinVelY = -8 # 小鸟y方向的最小速度
playerAccY = 2 # 小鸟y方向的下降加速度
playerFlapAcc = -3 # 小鸟y方向的上升加速度
playerFLapped = False # 当小鸟飞的时候为真
playery = int((SCREENHEIGHT - PLAYER_HEIGHT)/2)
 
 
# 随机移动柱子
def getRandomPipe():
  # 两个水管之间的距离有如下变量
  gapYs = [20, 30, 40, 50, 60, 70, 80, 90]
  index = random.randint(0, len(gapYs) - 1)
  gapY = gapYs[index]
 
  gapY += int(BASEY * 0.2)
  # 水管x坐标
  pipeX = SCREENWIDTH + 10
 
  return [
    {'x': pipeX, 'y': gapY - PIPE_HEIGHT},  # 上面水管的左上角位置
    {'x': pipeX, 'y': gapY + PIPEGAPSIZE},  # 下面水管的左上角位置
  ]
 
 
 
 
newPipel = getRandomPipe()
 
upperPipes = [
  {'x': SCREENWIDTH, 'y':newPipel[0]['y']}
]
lowerPipes = [
  {'x': SCREENWIDTH, 'y':newPipel[1]['y']}
]
 
while True:
 
  for event in pygame.event.get():
    if event.type == QUIT:
      exit()
    elif event.type == KEYDOWN:
      if event.key == K_LEFT:
        move_x = -3
      elif event.key == K_RIGHT:
        move_x = 3
      elif event.key == K_UP:
        move_y = -3
      elif event.key == K_DOWN:
        move_y = 3
    elif event.type == KEYUP:
      move_x = 0
      move_y = 0
 
  x = x + move_x
  y = y + move_y
 
  # 防止冲出边界
  if x > SCREENWIDTH:
    x = 0
  elif x < 0:
    x = SCREENWIDTH
 
  if y > SCREENHEIGHT:
    y = 0
  elif y < 0:
    y = SCREENHEIGHT
 
  # 贴图在左上角
  SCREEN.blit(IMAGES['background'], (0, 0)) # 背景
  # 显示水管
  for uPipe, lPipe in zip(upperPipes, lowerPipes):
    SCREEN.blit(IMAGES['pipe'][0], (uPipe['x'], uPipe['y']))
    SCREEN.blit(IMAGES['pipe'][1], (lPipe['x'], lPipe['y']))
 
 
 
  # 放小鸟
  SCREEN.blit(IMAGES['bird'][flap], (x, y))
  flap = flap + 1
 
  if flap % 3 == 0:
    flap = 0
 
 
  for uPipe, lPipe in zip(upperPipes, lowerPipes):
    uPipe['x'] += pipeVelX
    lPipe['x'] += pipeVelX
 
 
  # 当水管移动到某一位置的时候,生成新的水管
 
  if 0 < upperPipes[0]['x'] < 5:
    newPipe = getRandomPipe()
    upperPipes.append(newPipe[0])
    lowerPipes.append(newPipe[1])
  
 
  # 如果水管从右往左移动到边缘,则摧毁水管
  if upperPipes[0]['x'] < -PIPE_WIDTH:
    # 队列头出队
    upperPipes.pop(0)
    lowerPipes.pop(0)
 
 
  # 刷新画面
  pygame.display.update()
  FPSCLOCK.tick(FPS)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
深入解析Python中的__builtins__内建对象
Jun 21 Python
python使用tkinter实现简单计算器
Jan 30 Python
Python自定义线程池实现方法分析
Feb 07 Python
python学习入门细节知识点
Mar 29 Python
Python根据欧拉角求旋转矩阵的实例
Jan 28 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
使用Django开发简单接口实现文章增删改查
May 09 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
Jul 12 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 Python
Python 解析简单的XML数据
Jul 24 Python
基于python实现操作git过程代码解析
Jul 27 Python
浅析关于Keras的安装(pycharm)和初步理解
Oct 23 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
Dec 24 #Python
python正则表达式去除两个特殊字符间的内容方法
Dec 24 #Python
对python修改xml文件的节点值方法详解
Dec 24 #Python
用Python读取几十万行文本数据
Dec 24 #Python
python实现flappy bird小游戏
Dec 24 #Python
python实现Flappy Bird源码
Dec 24 #Python
python3安装speech语音模块的方法
Dec 24 #Python
You might like
域名查询代码公布
2006/10/09 PHP
php 显示指定路径下的图片
2009/10/29 PHP
php安全之直接用$获取值而不$_GET 字符转义
2012/06/03 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
javascript Xml增删改查(IE下)操作实现代码
2009/01/30 Javascript
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
javascript向flash swf文件传递参数值注意细节
2012/12/11 Javascript
往光标所在位置插入值的js代码
2013/09/22 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
分享JavaScript与Java中MD5使用两个例子
2015/12/23 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
Jquery实现无缝向上循环滚动列表的特效
2019/02/13 jQuery
vue 实现动态路由的方法
2020/07/06 Javascript
Python实现全局变量的两个解决方法
2014/07/03 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
专门出售各种儿童读物的网站:Put Me In The Story
2016/08/07 全球购物
迪士尼法国在线商店:shopDisney FR
2020/12/03 全球购物
学生实习自我鉴定
2013/10/11 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
公证委托书大全
2014/04/04 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB