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中使用插入排序算法的简单分析与代码示例
May 04 Python
Python中字典的浅拷贝与深拷贝用法实例分析
Jan 02 Python
pandas数据框,统计某列数据对应的个数方法
Apr 11 Python
python中使用iterrows()对dataframe进行遍历的实例
Jun 09 Python
使用numpy和PIL进行简单的图像处理方法
Jul 02 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
Dec 15 Python
Python操作qml对象过程详解
Sep 26 Python
Python3 main函数使用sys.argv传入多个参数的实现
Dec 25 Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 Python
Python单元测试及unittest框架用法实例解析
Jul 09 Python
python pip如何手动安装二进制包
Sep 30 Python
python开发制作好看的时钟效果
May 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遍历数组的几种方法
2012/03/22 PHP
PHP计算一年多少个星期和每周的开始和结束日期
2014/07/01 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
2010/03/09 Javascript
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
window.open()实现post传递参数
2015/03/12 Javascript
js绘制圆形和矩形的方法
2015/08/05 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
2015/12/03 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
2016/05/26 Javascript
详解.vue文件中监听input输入事件(oninput)
2017/09/19 Javascript
javaScript之split与join的区别(详解)
2017/11/08 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
2018/09/12 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
[57:59]EG vs Secret 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Tensorflow 利用tf.contrib.learn建立输入函数的方法
2018/02/08 Python
python3实现猜数字游戏
2020/12/07 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
Python之多进程与多线程的使用
2021/02/23 Python
幼儿园开学寄语
2014/04/03 职场文书
十八大演讲稿
2014/05/22 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
模范教师材料大全
2014/12/16 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python