python实现简单flappy bird
作者:wwxy261 发布时间:2022-08-03 12:06:33
标签:python,flappy,bird
本文实例为大家分享了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)
来源:https://blog.csdn.net/wwxy1995/article/details/81436788


猜你喜欢
- <?php // fix 404 pages: header('HTTP/1.1 200 OK'); // set 4
- 在Python所有的数据结构中,list具有重要地位,并且非常的方便,这篇文章主要是讲解list列表的高级应用,基础知识可以查看博客。 此文
- 启动targetcli时遭遇ImportError: cannot import name ALUATargetPortGrou
- 目录Blazor Server 应用程序中进行 HTTP 请求一、第三方 Web API 概览二、从 Blazor Sever 应用程序开始
- 前言最近用Django写项目的时候用到了数据的传递,一窍不通,查了点资料。记录一下。水平不高,瓜不保熟。 从两方面来说:从后端传递
- 今天给大家介绍一个电商中常见的场景 —— MySQL 数据同步 Elasticsearch。商品检索
- Vue设置反向代理和cookie设置项目场景最近使用Vue开发一个新的项目,因为服务器还没到,调取后端本地接口,因为请求接口的时候没有跨域,
- 首先安装pip install ruamel.yaml用于修改yaml文件#coding:utf-8from ruamel import y
- 由于本人经常使用笔记本共享WiFi,但是又不想笔记本开机一夜(为了低碳环保嘛 ~_~!),所以每次都要用使用DOS命令关机,感觉好麻烦。正好
- 在使用jQuery类库实现tab功能时,是获取鼠标在mousenter或click时的index值,然后切换到当前的标题和内容,把其他的标题
- 解决办法有很多: 1 . select * from 表 where
- 前言看Python代码时,碰见 numpy.transpose 用于高维数组时挺让人费解,通过一番画图分析和代码验证,发现 transpos
- 前记Asyncio的同步原语可以简化我们编写资源竞争的代码和规避资源竞争导致的Bug的出现。 但是由于协程的特性,在大部分业务代码中并不需要
- 本文实例讲述了Python异步操作MySQL。分享给大家供大家参考,具体如下:安装aiomysql依赖Python3.4+asyncioPy
- 1:构图图形的层次感图形和元素之间的层次感,可以在干扰视觉的同时,突出自身所想体现的主题,这种表现方式往往是比较直接而且有效的方式。我们所说
- 前言最近,我已经成功将我的个人网站从 Flask 迁移到 Django 了,最早接触 Django 的时候大概是在 4 年前,我记得那个时候
- 简介除ide的执行方式外,命令行的方式执行Python脚本是参数化程序执行的一种常见且简单的方法,正确处理命令行参数,可以提供给包含某种参数
- 注释标注解释,目的是帮助读者理解的文本也就是说,注释首先是文本,其二是说明,其三是思路,其四是例子注释有两种形式1. # ... 单行注释用
- 一、推理原理1.标定噪声的特征,使用cv2.inRange二值化标识噪声对图片进行二值化处理,具体代码:cv2.inRange(img, n
- pt-kill 是一个优秀的kill MySQL连接的一个工具,是percona toolkit的一部分,在因为空闲连接较多导致超过最大连接