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 相关文章推荐
linux系统使用python监测网络接口获取网络的输入输出
Jan 15 Python
Python格式化css文件的方法
Mar 10 Python
Python简单遍历字典及删除元素的方法
Sep 18 Python
通过python将大量文件按修改时间分类的方法
Oct 17 Python
Python UnboundLocalError和NameError错误根源案例解析
Oct 31 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
python循环输出三角形图案的例子
Nov 22 Python
用Python开发app后端有优势吗
Jun 29 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 Python
教你使用Pandas直接核算Excel中快递费用
May 12 Python
Python获取指定日期是"星期几"的6种方法
Mar 13 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
PHP中的超全局变量
2006/10/09 PHP
php&amp;mysql 日期操作小记
2012/02/27 PHP
php标签云的实现代码
2012/10/10 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
微信公众平台之快递查询功能用法实例
2015/04/14 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
php中文验证码实现方法
2015/06/18 PHP
常用PHP数组排序函数归纳
2016/08/08 PHP
nicejforms——美化表单不用愁
2007/02/20 Javascript
对JavaScript的eval()中使用函数的进一步讨论
2008/07/26 Javascript
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
jQuery仿写百度百科的目录树
2017/01/03 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
详解开发react应用最好用的脚手架 create-react-app
2018/04/24 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
在Python中使用正则表达式的方法
2015/08/13 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
python里 super类的工作原理详解
2019/06/19 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
什么是Python包的循环导入
2020/09/08 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
人力资源部副职的竞聘演讲稿
2014/01/07 职场文书
2014年社会实践活动总结范文
2014/04/29 职场文书
运动会加油口号
2014/06/07 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
python数据处理之Pandas类型转换
2022/04/28 Python