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)

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值