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通过shutil实现快速文件复制的方法
Mar 14 Python
python虚拟环境virualenv的安装与使用
Dec 18 Python
Python基于tkinter模块实现的改名小工具示例
Jul 27 Python
python深度优先搜索和广度优先搜索
Feb 07 Python
python编程嵌套函数实例代码
Feb 11 Python
Python管理Windows服务小脚本
Mar 12 Python
Python的多维空数组赋值方法
Apr 13 Python
基于Python解密仿射密码
Oct 21 Python
pytorch1.0中torch.nn.Conv2d用法详解
Jan 10 Python
TensorFlow命名空间和TensorBoard图节点实例
Jan 23 Python
基于Python爬取素材网站音频文件
Oct 21 Python
Django解决frame拒绝问题的方法
Dec 18 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
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
php下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
php中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
php数组去重的函数代码
2013/02/03 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
2014/11/24 PHP
php编程每天必学之验证码
2016/03/03 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
JavaScript之Object类型介绍
2015/04/01 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
基于JS实现的笛卡尔乘积之商品发布
2016/05/13 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
2016/12/30 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
原生JS使用Canvas实现拖拽式绘图功能
2019/06/05 Javascript
JavaScript实现移动小精灵的案例代码
2020/12/12 Javascript
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
改进Django中的表单的简单方法
2015/07/17 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
python 实现一个反向单位矩阵示例
2019/11/29 Python
Jupyter notebook如何实现指定浏览器打开
2020/05/13 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
2020/12/15 Python
HTML5 Canvas绘制圆点虚线实例
2015/01/01 HTML / CSS
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
纪念九一八事变演讲稿:勿忘国耻
2014/09/14 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL