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深入学习之特殊方法与多范式
Aug 31 Python
Python中的is和==比较两个对象的两种方法
Sep 06 Python
Python引用传值概念与用法实例小结
Oct 07 Python
对Python中list的倒序索引和切片实例讲解
Nov 15 Python
python矩阵/字典实现最短路径算法
Jan 17 Python
Python configparser模块常用方法解析
May 22 Python
Pyinstaller 打包发布经验总结
Jun 02 Python
python有几个版本
Jun 17 Python
Pycharm及python安装详细教程(图解)
Jul 31 Python
python中二分查找法的实现方法
Dec 06 Python
总结Python常用的魔法方法
May 25 Python
Python实现灰色关联分析与结果可视化的详细代码
Mar 25 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二分法在IP地址查询中的应用
2008/08/12 PHP
php中error与exception的区别及应用
2014/07/28 PHP
php中的动态调用实例分析
2015/01/07 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
PHP生成唯一订单号
2015/07/05 PHP
yii2 页面底部加载css和js的技巧
2016/04/21 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
PHP之header函数详解
2021/03/02 PHP
js验证是否为数字的总结
2013/04/14 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
JS教程:window.location使用方法的区别介绍
2013/10/04 Javascript
javascript模拟map输出与去除重复项的方法
2015/02/09 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
Web开发必知Javascript技巧大全
2016/02/23 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
vue里input根据value改变背景色的实例
2018/09/29 Javascript
[04:41]2014DOTA2国际邀请赛 Liquid顺利突围晋级正赛
2014/07/09 DOTA
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
简单使用Python自动生成文章
2014/12/25 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
Fanatics官网:运动服装、球衣、运动装备
2020/10/12 全球购物
电子信息专业学生自荐信
2013/11/09 职场文书
党员教师工作决心书
2014/03/13 职场文书
中国好声音华少广告词
2014/03/17 职场文书
美丽乡村建设实施方案
2014/03/23 职场文书
党员个人党性分析材料
2014/12/18 职场文书
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python