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 MD5加密实例详解
Aug 02 Python
Python实现简单文本字符串处理的方法
Jan 22 Python
python3 判断列表是一个空列表的方法
May 04 Python
Python之dict(或对象)与json之间的互相转化实例
Jun 05 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
Apr 15 Python
在linux系统下安装python librtmp包的实现方法
Jul 22 Python
详解在python操作数据库中游标的使用方法
Nov 12 Python
sklearn-SVC实现与类参数详解
Dec 10 Python
python+selenium+PhantomJS抓取网页动态加载内容
Feb 25 Python
解决tensorflow/keras时出现数组维度不匹配问题
Jun 29 Python
python 求两个向量的顺时针夹角操作
Mar 04 Python
TensorFlow中tf.batch_matmul()的用法
Jun 02 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
有道搜索和IP138的IP的API接口(PHP应用)
2012/11/29 PHP
PHP获取MySql新增记录ID值的3种方法
2014/06/24 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
2012/02/03 Javascript
JQuery魔力之$(&quot;tagName&quot;)与selector
2012/03/05 Javascript
jquery原创弹出层折叠效果点击折叠弹出一个层
2014/03/12 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
jQuery中的基本选择器用法学习教程
2016/04/14 Javascript
Vue.js第四天学习笔记(组件)
2016/12/02 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
Python发送邮件测试报告操作实例详解
2018/12/08 Python
详解Python进阶之切片的误区与高级用法
2018/12/24 Python
python实现windows壁纸定期更换功能
2019/01/21 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
详解Django 时间与时区设置问题
2019/07/23 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
Python之Class&amp;Object用法详解
2019/12/25 Python
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
股东授权委托书
2014/10/15 职场文书
2014年政风行风评议工作总结
2014/10/21 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技