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选择排序、冒泡排序、合并排序代码实例
Apr 10 Python
Python实现将一个正整数分解质因数的方法分析
Dec 14 Python
Django 2.0版本的新特性抢先看!
Jan 05 Python
django做form表单的数据验证过程详解
Jul 26 Python
Python jieba库用法及实例解析
Nov 04 Python
学会python自动收发邮件 代替你问候女友
May 20 Python
Python命名空间namespace及作用域原理解析
Jun 05 Python
openCV提取图像中的矩形区域
Jul 21 Python
Python SQLAlchemy库的使用方法
Oct 13 Python
python爬虫使用scrapy注意事项
Nov 23 Python
使用Python下载抖音各大V视频的思路详解
Feb 06 Python
pandas数据分组groupby()和统计函数agg()的使用
Mar 04 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连接MySQL代码的参数说明
2008/06/07 PHP
PHP多态代码实例
2015/06/26 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
2019/03/14 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
jquery 获取json数据实现代码
2009/04/27 Javascript
jquery 实现表单验证功能代码(简洁)
2012/07/03 Javascript
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
python中Switch/Case实现的示例代码
2017/11/09 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
通过Python实现一个简单的html页面
2020/05/16 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
《童趣》教学反思
2014/02/19 职场文书
《荷花》教学反思
2014/04/16 职场文书
十周年庆典策划方案
2014/06/03 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
整改报告格式
2014/11/06 职场文书
2015年工程师工作总结
2015/04/30 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
创业计划书之家政服务
2019/09/18 职场文书
golang内置函数len的小技巧
2021/07/25 Golang