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 相关文章推荐
17个Python小技巧分享
Jan 23 Python
Python实现网络端口转发和重定向的方法
Sep 19 Python
pyenv命令管理多个Python版本
Mar 26 Python
Python实现的单向循环链表功能示例
Nov 10 Python
Python2与python3中 for 循环语句基础与实例分析
Nov 20 Python
Python Scapy随心所欲研究TCP协议栈
Nov 20 Python
python实现对输入的密文加密
Mar 20 Python
零基础使用Python读写处理Excel表格的方法
May 02 Python
python如果快速判断数字奇数偶数
Nov 13 Python
关于Django Models CharField 参数说明
Mar 31 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 Python
pytorch 一行代码查看网络参数总量的实现
May 12 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手册及PHP编程标准
2006/12/17 PHP
PHPMailer安装方法及简单实例
2008/11/25 PHP
php批量更改数据库表前缀实现方法
2013/10/26 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
php中异常处理方法小结
2015/01/09 PHP
thinkphp微信开发(消息加密解密)
2015/12/02 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
php简单实现文件或图片强制下载的方法
2016/12/06 PHP
php生成无限栏目树
2017/03/16 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
js批量设置样式的三种方法不推荐使用with
2013/02/25 Javascript
javascript常用的正则表达式实例
2014/05/15 Javascript
JS原型链 详解及示例代码
2016/09/06 Javascript
JS对大量数据进行多重过滤的方法
2016/11/04 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
原生js更改css样式的两种方式
2017/03/15 Javascript
JS中去掉array中重复元素的方法
2017/05/26 Javascript
基于element-ui组件手动实现单选和上传功能
2018/12/06 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
2019/10/23 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
django中ORM模型常用的字段的使用方法
2019/03/05 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
CSS3制作半透明边框(Facebox)类似渐变
2012/12/09 HTML / CSS
美国渔具店:FishUSA
2019/08/07 全球购物
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
C语言编程练习
2012/04/02 面试题
幼儿园秋季开学寄语
2014/08/02 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
建党伟业观后感
2015/06/01 职场文书
汤姆叔叔的小屋读书笔记
2015/06/30 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书