如何在 Pygame 中制作 Flappy Bird 游戏?
在本文中,我们将看到如何在 Pygame 中制作一个飞扬的小鸟游戏。
我们都熟悉这个游戏。在这个游戏中,玩家的主要目标是通过保护小鸟免受障碍来获得最高分。在这里,我们将使用Python构建我们自己的 Flappy Bird 游戏。
我们将使用 Pygame(一个Python库)来创建这个 Flappy Bird 游戏。 Pygame是一个开源库,专为制作视频游戏而设计。它帮助我们在Python创建功能齐全的游戏和多媒体程序。
首先,您必须使用以下命令安装 Pygame 库:-
pip install pygame
分步实施
第 1 步:在第一步中,我们必须导入库。
之后,我们必须设置游戏将要播放的屏幕的高度和宽度。现在我们必须定义一些我们将在我们的游戏中使用的图像,例如作为障碍的管道、鸟类图像以及飞扬的鸟类游戏的背景图像。
Python3
# For generating random height of pipes
import random
import sys
import pygame
from pygame.locals import *
# Global Variables for the game
window_width = 600
window_height = 499
# set height and width of window
window = pygame.display.set_mode((window_width, window_height))
elevation = window_height * 0.8
game_images = {}
framepersecond = 32
pipeimage = 'images/pipe.png'
background_image = 'images/background.jpg'
birdplayer_image = '/images/bird.png'
sealevel_image = '/images/base.jfif'
Python3
# program where the game starts
if __name__ == "__main__":
# For initializing modules of pygame library
pygame.init()
framepersecond_clock = pygame.time.Clock()
# Sets the title on top of game window
pygame.display.set_caption('Flappy Bird Game')
# Load all the images which we will use in the game
# images for displaying score
game_images['scoreimages'] = (
pygame.image.load('images/0.png').convert_alpha(),
pygame.image.load('images/1.png').convert_alpha(),
pygame.image.load('images/2.png').convert_alpha(),
pygame.image.load('images/3.png').convert_alpha(),
pygame.image.load('images/4.png').convert_alpha(),
pygame.image.load('images/5.png').convert_alpha(),
pygame.image.load('images/6.png').convert_alpha(),
pygame.image.load('images/7.png').convert_alpha(),
pygame.image.load('images/8.png').convert_alpha(),
pygame.image.load('images/9.png').convert_alpha()
)
game_images['flappybird'] = pygame.image.load(birdplayer_image).convert_alpha()
game_images['sea_level'] = pygame.image.load(sealevel_image).convert_alpha()
game_images['background'] = pygame.image.load(background_image).convert_alpha()
game_images['pipeimage'] = (pygame.transform.rotate(pygame.image.load(pipeimage)
.convert_alpha(),
180),
pygame.image.load(pipeimage).convert_alpha())
print("WELCOME TO THE FLAPPY BIRD GAME")
print("Press space or enter to start the game")
Python3
while True:
# sets the coordinates of flappy bird
horizontal = int(window_width/5)
vertical = int((window_height - game_images['flappybird'].get_height())/2)
# for selevel
ground = 0
while True:
for event in pygame.event.get():
# if user clicks on cross button, close the game
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
pygame.quit()
# Exit the program
sys.exit()
# If the user presses space or up key,
# start the game for them
elif event.type == KEYDOWN and (event.key == K_SPACE or event.key == K_UP):
flappygame()
# if user doesn't press anykey Nothing happen
else:
window.blit(game_images['background'], (0, 0))
window.blit(game_images['flappybird'], (horizontal, vertical))
window.blit(game_images['sea_level'], (ground, elevation))
# Just Refresh the screen
pygame.display.update()
# set the rate of frame per second
framepersecond_clock.tick(framepersecond)
Python3
def createPipe():
offset = window_height/3
pipeHeight = game_images['pipeimage'][0].get_height()
# generating random height of pipes
y2 = offset + random.randrange(
0, int(window_height - game_images['sea_level'].get_height() - 1.2 * offset))
pipeX = window_width + 10
y1 = pipeHeight - y2 + offset
pipe = [
# upper Pipe
{'x': pipeX, 'y': -y1},
# lower Pipe
{'x': pipeX, 'y': y2}
]
return pipe
Python3
# Checking if bird is above the sealevel.
def isGameOver(horizontal, vertical, up_pipes, down_pipes):
if vertical > elevation - 25 or vertical < 0:
return True
# Checking if bird hits the upper pipe or not
for pipe in up_pipes:
pipeHeight = game_images['pipeimage'][0].get_height()
if(vertical < pipeHeight + pipe['y']
and abs(horizontal - pipe['x']) < game_images['pipeimage'][0].get_width()):
return True
# Checking if bird hits the lower pipe or not
for pipe in down_pipes:
if (vertical + game_images['flappybird'].get_height() > pipe['y'])
and abs(horizontal - pipe['x']) < game_images['pipeimage'][0].get_width():
return True
return False
Python3
def flappygame():
your_score = 0
horizontal = int(window_width/5)
vertical = int(window_width/2)
ground = 0
mytempheight = 100
# Generating two pipes for blitting on window
first_pipe = createPipe()
second_pipe = createPipe()
# List containing lower pipes
down_pipes = [
{'x': window_width+300-mytempheight,
'y': first_pipe[1]['y']},
{'x': window_width+300-mytempheight+(window_width/2),
'y': second_pipe[1]['y']},
]
# List Containing upper pipes
up_pipes = [
{'x': window_width+300-mytempheight,
'y': first_pipe[0]['y']},
{'x': window_width+200-mytempheight+(window_width/2),
'y': second_pipe[0]['y']},
]
pipeVelX = -4 #pipe velocity along x
bird_velocity_y = -9 # bird velocity
bird_Max_Vel_Y = 10
bird_Min_Vel_Y = -8
birdAccY = 1
# velocity while flapping
bird_flap_velocity = -8
# It is true only when the bird is flapping
bird_flapped = False
while True:
# Handling the key pressing events
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
pygame.quit()
sys.exit()
if event.type == KEYDOWN and (event.key == K_SPACE or event.key == K_UP):
if vertical > 0:
bird_velocity_y = bird_flap_velocity
bird_flapped = True
# This function will return true if the flappybird is crashed
game_over = isGameOver(horizontal, vertical, up_pipes, down_pipes)
if game_over:
return
# check for your_score
playerMidPos = horizontal + game_images['flappybird'].get_width()/2
for pipe in up_pipes:
pipeMidPos = pipe['x'] + game_images['pipeimage'][0].get_width()/2
if pipeMidPos <= playerMidPos < pipeMidPos + 4:
# Printing the score
your_score += 1
print(f"Your your_score is {your_score}")
if bird_velocity_y < bird_Max_Vel_Y and not bird_flapped:
bird_velocity_y += birdAccY
if bird_flapped:
bird_flapped = False
playerHeight = game_images['flappybird'].get_height()
vertical = vertical + min(bird_velocity_y, elevation - vertical - playerHeight)
# move pipes to the left
for upperPipe, lowerPipe in zip(up_pipes, down_pipes):
upperPipe['x'] += pipeVelX
lowerPipe['x'] += pipeVelX
# Add a new pipe when the first is about
# to cross the leftmost part of the screen
if 0 < up_pipes[0]['x'] < 5:
newpipe = createPipe()
up_pipes.append(newpipe[0])
down_pipes.append(newpipe[1])
# if the pipe is out of the screen, remove it
if up_pipes[0]['x'] < -game_images['pipeimage'][0].get_width():
up_pipes.pop(0)
down_pipes.pop(0)
# Lets blit our game images now
window.blit(game_images['background'], (0, 0))
for upperPipe, lowerPipe in zip(up_pipes, down_pipes):
window.blit(game_images['pipeimage'][0],
(upperPipe['x'], upperPipe['y']))
window.blit(game_images['pipeimage'][1],
(lowerPipe['x'], lowerPipe['y']))
window.blit(game_images['sea_level'], (ground, elevation))
window.blit(game_images['flappybird'], (horizontal, vertical))
# Fetching the digits of score.
numbers = [int(x) for x in list(str(your_score))]
width = 0
# finding the width of score images from numbers.
for num in numbers:
width += game_images['scoreimages'][num].get_width()
Xoffset = (window_width - width)/1.1
# Blitting the images on the window.
for num in numbers:
window.blit(game_images['scoreimages'][num], (Xoffset, window_width*0.02))
Xoffset += game_images['scoreimages'][num].get_width()
# Refreshing the game window and displaying the score.
pygame.display.update()
# Set the framepersecond
framepersecond_clock.tick(framepersecond)
Python3
# Import module
import random
import sys
import pygame
from pygame.locals import *
# All the Game Variables
window_width = 600
window_height = 499
# set height and width of window
window = pygame.display.set_mode((window_width, window_height))
elevation = window_height * 0.8
game_images = {}
framepersecond = 32
pipeimage = 'images/pipe.png'
background_image = 'images/background.jpg'
birdplayer_image = 'images/bird.png'
sealevel_image = 'images/base.jfif'
def flappygame():
your_score = 0
horizontal = int(window_width/5)
vertical = int(window_width/2)
ground = 0
mytempheight = 100
# Generating two pipes for blitting on window
first_pipe = createPipe()
second_pipe = createPipe()
# List containing lower pipes
down_pipes = [
{'x': window_width+300-mytempheight,
'y': first_pipe[1]['y']},
{'x': window_width+300-mytempheight+(window_width/2),
'y': second_pipe[1]['y']},
]
# List Containing upper pipes
up_pipes = [
{'x': window_width+300-mytempheight,
'y': first_pipe[0]['y']},
{'x': window_width+200-mytempheight+(window_width/2),
'y': second_pipe[0]['y']},
]
# pipe velocity along x
pipeVelX = -4
# bird velocity
bird_velocity_y = -9
bird_Max_Vel_Y = 10
bird_Min_Vel_Y = -8
birdAccY = 1
bird_flap_velocity = -8
bird_flapped = False
while True:
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
pygame.quit()
sys.exit()
if event.type == KEYDOWN and (event.key == K_SPACE or event.key == K_UP):
if vertical > 0:
bird_velocity_y = bird_flap_velocity
bird_flapped = True
# This function will return true
# if the flappybird is crashed
game_over = isGameOver(horizontal,
vertical,
up_pipes,
down_pipes)
if game_over:
return
# check for your_score
playerMidPos = horizontal + game_images['flappybird'].get_width()/2
for pipe in up_pipes:
pipeMidPos = pipe['x'] + game_images['pipeimage'][0].get_width()/2
if pipeMidPos <= playerMidPos < pipeMidPos + 4:
your_score += 1
print(f"Your your_score is {your_score}")
if bird_velocity_y < bird_Max_Vel_Y and not bird_flapped:
bird_velocity_y += birdAccY
if bird_flapped:
bird_flapped = False
playerHeight = game_images['flappybird'].get_height()
vertical = vertical + \
min(bird_velocity_y, elevation - vertical - playerHeight)
# move pipes to the left
for upperPipe, lowerPipe in zip(up_pipes, down_pipes):
upperPipe['x'] += pipeVelX
lowerPipe['x'] += pipeVelX
# Add a new pipe when the first is
# about to cross the leftmost part of the screen
if 0 < up_pipes[0]['x'] < 5:
newpipe = createPipe()
up_pipes.append(newpipe[0])
down_pipes.append(newpipe[1])
# if the pipe is out of the screen, remove it
if up_pipes[0]['x'] < -game_images['pipeimage'][0].get_width():
up_pipes.pop(0)
down_pipes.pop(0)
# Lets blit our game images now
window.blit(game_images['background'], (0, 0))
for upperPipe, lowerPipe in zip(up_pipes, down_pipes):
window.blit(game_images['pipeimage'][0],
(upperPipe['x'], upperPipe['y']))
window.blit(game_images['pipeimage'][1],
(lowerPipe['x'], lowerPipe['y']))
window.blit(game_images['sea_level'], (ground, elevation))
window.blit(game_images['flappybird'], (horizontal, vertical))
# Fetching the digits of score.
numbers = [int(x) for x in list(str(your_score))]
width = 0
# finding the width of score images from numbers.
for num in numbers:
width += game_images['scoreimages'][num].get_width()
Xoffset = (window_width - width)/1.1
# Blitting the images on the window.
for num in numbers:
window.blit(game_images['scoreimages'][num],
(Xoffset, window_width*0.02))
Xoffset += game_images['scoreimages'][num].get_width()
# Refreshing the game window and displaying the score.
pygame.display.update()
framepersecond_clock.tick(framepersecond)
def isGameOver(horizontal, vertical, up_pipes, down_pipes):
if vertical > elevation - 25 or vertical < 0:
return True
for pipe in up_pipes:
pipeHeight = game_images['pipeimage'][0].get_height()
if(vertical < pipeHeight + pipe['y'] and\
abs(horizontal - pipe['x']) < game_images['pipeimage'][0].get_width()):
return True
for pipe in down_pipes:
if (vertical + game_images['flappybird'].get_height() > pipe['y']) and\
abs(horizontal - pipe['x']) < game_images['pipeimage'][0].get_width():
return True
return False
def createPipe():
offset = window_height/3
pipeHeight = game_images['pipeimage'][0].get_height()
y2 = offset + \
random.randrange(
0, int(window_height - game_images['sea_level'].get_height() - 1.2 * offset))
pipeX = window_width + 10
y1 = pipeHeight - y2 + offset
pipe = [
# upper Pipe
{'x': pipeX, 'y': -y1},
# lower Pipe
{'x': pipeX, 'y': y2}
]
return pipe
# program where the game starts
if __name__ == "__main__":
# For initializing modules of pygame library
pygame.init()
framepersecond_clock = pygame.time.Clock()
# Sets the title on top of game window
pygame.display.set_caption('Flappy Bird Game')
# Load all the images which we will use in the game
# images for displaying score
game_images['scoreimages'] = (
pygame.image.load('images/0.png').convert_alpha(),
pygame.image.load('images/1.png').convert_alpha(),
pygame.image.load('images/2.png').convert_alpha(),
pygame.image.load('images/3.png').convert_alpha(),
pygame.image.load('images/4.png').convert_alpha(),
pygame.image.load('images/5.png').convert_alpha(),
pygame.image.load('images/6.png').convert_alpha(),
pygame.image.load('images/7.png').convert_alpha(),
pygame.image.load('images/8.png').convert_alpha(),
pygame.image.load('images/9.png').convert_alpha()
)
game_images['flappybird'] = pygame.image.load(
birdplayer_image).convert_alpha()
game_images['sea_level'] = pygame.image.load(
sealevel_image).convert_alpha()
game_images['background'] = pygame.image.load(
background_image).convert_alpha()
game_images['pipeimage'] = (pygame.transform.rotate(pygame.image.load(
pipeimage).convert_alpha(), 180), pygame.image.load(
pipeimage).convert_alpha())
print("WELCOME TO THE FLAPPY BIRD GAME")
print("Press space or enter to start the game")
# Here starts the main game
while True:
# sets the coordinates of flappy bird
horizontal = int(window_width/5)
vertical = int(
(window_height - game_images['flappybird'].get_height())/2)
ground = 0
while True:
for event in pygame.event.get():
# if user clicks on cross button, close the game
if event.type == QUIT or (event.type == KEYDOWN and \
event.key == K_ESCAPE):
pygame.quit()
sys.exit()
# If the user presses space or
# up key, start the game for them
elif event.type == KEYDOWN and (event.key == K_SPACE or\
event.key == K_UP):
flappygame()
# if user doesn't press anykey Nothing happen
else:
window.blit(game_images['background'], (0, 0))
window.blit(game_images['flappybird'],
(horizontal, vertical))
window.blit(game_images['sea_level'], (ground, elevation))
pygame.display.update()
framepersecond_clock.tick(framepersecond)
第 2 步:在声明游戏变量并导入库之后,我们必须初始化 Pygame
使用的文件可以从这里下载。
使用pygame.init()初始化程序并设置窗口的标题。这里 pygame.time.Clock() 将在游戏的主循环中进一步使用来改变小鸟的速度。使用 pygame.image.load() 从 pygame 中的系统加载图像。
蟒蛇3
# program where the game starts
if __name__ == "__main__":
# For initializing modules of pygame library
pygame.init()
framepersecond_clock = pygame.time.Clock()
# Sets the title on top of game window
pygame.display.set_caption('Flappy Bird Game')
# Load all the images which we will use in the game
# images for displaying score
game_images['scoreimages'] = (
pygame.image.load('images/0.png').convert_alpha(),
pygame.image.load('images/1.png').convert_alpha(),
pygame.image.load('images/2.png').convert_alpha(),
pygame.image.load('images/3.png').convert_alpha(),
pygame.image.load('images/4.png').convert_alpha(),
pygame.image.load('images/5.png').convert_alpha(),
pygame.image.load('images/6.png').convert_alpha(),
pygame.image.load('images/7.png').convert_alpha(),
pygame.image.load('images/8.png').convert_alpha(),
pygame.image.load('images/9.png').convert_alpha()
)
game_images['flappybird'] = pygame.image.load(birdplayer_image).convert_alpha()
game_images['sea_level'] = pygame.image.load(sealevel_image).convert_alpha()
game_images['background'] = pygame.image.load(background_image).convert_alpha()
game_images['pipeimage'] = (pygame.transform.rotate(pygame.image.load(pipeimage)
.convert_alpha(),
180),
pygame.image.load(pipeimage).convert_alpha())
print("WELCOME TO THE FLAPPY BIRD GAME")
print("Press space or enter to start the game")
第三步:初始化小鸟的位置并开始游戏循环
将鸟类和海平面的位置初始化为地面。在循环中添加条件定义了游戏条件。变量水平和垂直用于设置鸟的位置。我们必须运行程序直到用户停止或退出(使用sys.exit() )如果程序是这样,我们将创建一个无限的 while 循环。
蟒蛇3
while True:
# sets the coordinates of flappy bird
horizontal = int(window_width/5)
vertical = int((window_height - game_images['flappybird'].get_height())/2)
# for selevel
ground = 0
while True:
for event in pygame.event.get():
# if user clicks on cross button, close the game
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
pygame.quit()
# Exit the program
sys.exit()
# If the user presses space or up key,
# start the game for them
elif event.type == KEYDOWN and (event.key == K_SPACE or event.key == K_UP):
flappygame()
# if user doesn't press anykey Nothing happen
else:
window.blit(game_images['background'], (0, 0))
window.blit(game_images['flappybird'], (horizontal, vertical))
window.blit(game_images['sea_level'], (ground, elevation))
# Just Refresh the screen
pygame.display.update()
# set the rate of frame per second
framepersecond_clock.tick(framepersecond)
第 4 步:创建一个生成随机高度的新管道的函数
首先,我们必须使用getheight()函数获取管道的高度。在这之后生成一个介于 0 到一个数字之间的随机数(这样管道的高度应该可以调整到我们的窗口高度)。之后,我们创建一个包含上下管道坐标的字典列表并返回它。
蟒蛇3
def createPipe():
offset = window_height/3
pipeHeight = game_images['pipeimage'][0].get_height()
# generating random height of pipes
y2 = offset + random.randrange(
0, int(window_height - game_images['sea_level'].get_height() - 1.2 * offset))
pipeX = window_width + 10
y1 = pipeHeight - y2 + offset
pipe = [
# upper Pipe
{'x': pipeX, 'y': -y1},
# lower Pipe
{'x': pipeX, 'y': y2}
]
return pipe
第 5 步:现在我们创建一个GameOver()函数,它表示鸟是撞到管道还是落入海中。
按照我的想法,三个条件导致游戏结束的情况。如果我们的海拔和某个高度之间的差异小于垂直,这意味着小鸟已经越过它的边界,导致游戏结束,如果小鸟击中了上下点中的任何一个,那么这也将导致游戏结束。
蟒蛇3
# Checking if bird is above the sealevel.
def isGameOver(horizontal, vertical, up_pipes, down_pipes):
if vertical > elevation - 25 or vertical < 0:
return True
# Checking if bird hits the upper pipe or not
for pipe in up_pipes:
pipeHeight = game_images['pipeimage'][0].get_height()
if(vertical < pipeHeight + pipe['y']
and abs(horizontal - pipe['x']) < game_images['pipeimage'][0].get_width()):
return True
# Checking if bird hits the lower pipe or not
for pipe in down_pipes:
if (vertical + game_images['flappybird'].get_height() > pipe['y'])
and abs(horizontal - pipe['x']) < game_images['pipeimage'][0].get_width():
return True
return False
第 6 步:现在我们将创建我们的主函数( flappygame() ),它将执行以下操作:
通过 createPipe()函数初始化变量并创建两个管道。创建两个列表,第一个是下管道,另一个是下管道。定义鸟速、最小鸟速、最大鸟速和管道速度。使用pygame.event.get()处理关键事件并检查游戏是否结束从函数返回。更新分数和 blit 游戏图像,例如窗口上的背景、管道和鸟。
蟒蛇3
def flappygame():
your_score = 0
horizontal = int(window_width/5)
vertical = int(window_width/2)
ground = 0
mytempheight = 100
# Generating two pipes for blitting on window
first_pipe = createPipe()
second_pipe = createPipe()
# List containing lower pipes
down_pipes = [
{'x': window_width+300-mytempheight,
'y': first_pipe[1]['y']},
{'x': window_width+300-mytempheight+(window_width/2),
'y': second_pipe[1]['y']},
]
# List Containing upper pipes
up_pipes = [
{'x': window_width+300-mytempheight,
'y': first_pipe[0]['y']},
{'x': window_width+200-mytempheight+(window_width/2),
'y': second_pipe[0]['y']},
]
pipeVelX = -4 #pipe velocity along x
bird_velocity_y = -9 # bird velocity
bird_Max_Vel_Y = 10
bird_Min_Vel_Y = -8
birdAccY = 1
# velocity while flapping
bird_flap_velocity = -8
# It is true only when the bird is flapping
bird_flapped = False
while True:
# Handling the key pressing events
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
pygame.quit()
sys.exit()
if event.type == KEYDOWN and (event.key == K_SPACE or event.key == K_UP):
if vertical > 0:
bird_velocity_y = bird_flap_velocity
bird_flapped = True
# This function will return true if the flappybird is crashed
game_over = isGameOver(horizontal, vertical, up_pipes, down_pipes)
if game_over:
return
# check for your_score
playerMidPos = horizontal + game_images['flappybird'].get_width()/2
for pipe in up_pipes:
pipeMidPos = pipe['x'] + game_images['pipeimage'][0].get_width()/2
if pipeMidPos <= playerMidPos < pipeMidPos + 4:
# Printing the score
your_score += 1
print(f"Your your_score is {your_score}")
if bird_velocity_y < bird_Max_Vel_Y and not bird_flapped:
bird_velocity_y += birdAccY
if bird_flapped:
bird_flapped = False
playerHeight = game_images['flappybird'].get_height()
vertical = vertical + min(bird_velocity_y, elevation - vertical - playerHeight)
# move pipes to the left
for upperPipe, lowerPipe in zip(up_pipes, down_pipes):
upperPipe['x'] += pipeVelX
lowerPipe['x'] += pipeVelX
# Add a new pipe when the first is about
# to cross the leftmost part of the screen
if 0 < up_pipes[0]['x'] < 5:
newpipe = createPipe()
up_pipes.append(newpipe[0])
down_pipes.append(newpipe[1])
# if the pipe is out of the screen, remove it
if up_pipes[0]['x'] < -game_images['pipeimage'][0].get_width():
up_pipes.pop(0)
down_pipes.pop(0)
# Lets blit our game images now
window.blit(game_images['background'], (0, 0))
for upperPipe, lowerPipe in zip(up_pipes, down_pipes):
window.blit(game_images['pipeimage'][0],
(upperPipe['x'], upperPipe['y']))
window.blit(game_images['pipeimage'][1],
(lowerPipe['x'], lowerPipe['y']))
window.blit(game_images['sea_level'], (ground, elevation))
window.blit(game_images['flappybird'], (horizontal, vertical))
# Fetching the digits of score.
numbers = [int(x) for x in list(str(your_score))]
width = 0
# finding the width of score images from numbers.
for num in numbers:
width += game_images['scoreimages'][num].get_width()
Xoffset = (window_width - width)/1.1
# Blitting the images on the window.
for num in numbers:
window.blit(game_images['scoreimages'][num], (Xoffset, window_width*0.02))
Xoffset += game_images['scoreimages'][num].get_width()
# Refreshing the game window and displaying the score.
pygame.display.update()
# Set the framepersecond
framepersecond_clock.tick(framepersecond)
以下是完整的实现:
蟒蛇3
# Import module
import random
import sys
import pygame
from pygame.locals import *
# All the Game Variables
window_width = 600
window_height = 499
# set height and width of window
window = pygame.display.set_mode((window_width, window_height))
elevation = window_height * 0.8
game_images = {}
framepersecond = 32
pipeimage = 'images/pipe.png'
background_image = 'images/background.jpg'
birdplayer_image = 'images/bird.png'
sealevel_image = 'images/base.jfif'
def flappygame():
your_score = 0
horizontal = int(window_width/5)
vertical = int(window_width/2)
ground = 0
mytempheight = 100
# Generating two pipes for blitting on window
first_pipe = createPipe()
second_pipe = createPipe()
# List containing lower pipes
down_pipes = [
{'x': window_width+300-mytempheight,
'y': first_pipe[1]['y']},
{'x': window_width+300-mytempheight+(window_width/2),
'y': second_pipe[1]['y']},
]
# List Containing upper pipes
up_pipes = [
{'x': window_width+300-mytempheight,
'y': first_pipe[0]['y']},
{'x': window_width+200-mytempheight+(window_width/2),
'y': second_pipe[0]['y']},
]
# pipe velocity along x
pipeVelX = -4
# bird velocity
bird_velocity_y = -9
bird_Max_Vel_Y = 10
bird_Min_Vel_Y = -8
birdAccY = 1
bird_flap_velocity = -8
bird_flapped = False
while True:
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
pygame.quit()
sys.exit()
if event.type == KEYDOWN and (event.key == K_SPACE or event.key == K_UP):
if vertical > 0:
bird_velocity_y = bird_flap_velocity
bird_flapped = True
# This function will return true
# if the flappybird is crashed
game_over = isGameOver(horizontal,
vertical,
up_pipes,
down_pipes)
if game_over:
return
# check for your_score
playerMidPos = horizontal + game_images['flappybird'].get_width()/2
for pipe in up_pipes:
pipeMidPos = pipe['x'] + game_images['pipeimage'][0].get_width()/2
if pipeMidPos <= playerMidPos < pipeMidPos + 4:
your_score += 1
print(f"Your your_score is {your_score}")
if bird_velocity_y < bird_Max_Vel_Y and not bird_flapped:
bird_velocity_y += birdAccY
if bird_flapped:
bird_flapped = False
playerHeight = game_images['flappybird'].get_height()
vertical = vertical + \
min(bird_velocity_y, elevation - vertical - playerHeight)
# move pipes to the left
for upperPipe, lowerPipe in zip(up_pipes, down_pipes):
upperPipe['x'] += pipeVelX
lowerPipe['x'] += pipeVelX
# Add a new pipe when the first is
# about to cross the leftmost part of the screen
if 0 < up_pipes[0]['x'] < 5:
newpipe = createPipe()
up_pipes.append(newpipe[0])
down_pipes.append(newpipe[1])
# if the pipe is out of the screen, remove it
if up_pipes[0]['x'] < -game_images['pipeimage'][0].get_width():
up_pipes.pop(0)
down_pipes.pop(0)
# Lets blit our game images now
window.blit(game_images['background'], (0, 0))
for upperPipe, lowerPipe in zip(up_pipes, down_pipes):
window.blit(game_images['pipeimage'][0],
(upperPipe['x'], upperPipe['y']))
window.blit(game_images['pipeimage'][1],
(lowerPipe['x'], lowerPipe['y']))
window.blit(game_images['sea_level'], (ground, elevation))
window.blit(game_images['flappybird'], (horizontal, vertical))
# Fetching the digits of score.
numbers = [int(x) for x in list(str(your_score))]
width = 0
# finding the width of score images from numbers.
for num in numbers:
width += game_images['scoreimages'][num].get_width()
Xoffset = (window_width - width)/1.1
# Blitting the images on the window.
for num in numbers:
window.blit(game_images['scoreimages'][num],
(Xoffset, window_width*0.02))
Xoffset += game_images['scoreimages'][num].get_width()
# Refreshing the game window and displaying the score.
pygame.display.update()
framepersecond_clock.tick(framepersecond)
def isGameOver(horizontal, vertical, up_pipes, down_pipes):
if vertical > elevation - 25 or vertical < 0:
return True
for pipe in up_pipes:
pipeHeight = game_images['pipeimage'][0].get_height()
if(vertical < pipeHeight + pipe['y'] and\
abs(horizontal - pipe['x']) < game_images['pipeimage'][0].get_width()):
return True
for pipe in down_pipes:
if (vertical + game_images['flappybird'].get_height() > pipe['y']) and\
abs(horizontal - pipe['x']) < game_images['pipeimage'][0].get_width():
return True
return False
def createPipe():
offset = window_height/3
pipeHeight = game_images['pipeimage'][0].get_height()
y2 = offset + \
random.randrange(
0, int(window_height - game_images['sea_level'].get_height() - 1.2 * offset))
pipeX = window_width + 10
y1 = pipeHeight - y2 + offset
pipe = [
# upper Pipe
{'x': pipeX, 'y': -y1},
# lower Pipe
{'x': pipeX, 'y': y2}
]
return pipe
# program where the game starts
if __name__ == "__main__":
# For initializing modules of pygame library
pygame.init()
framepersecond_clock = pygame.time.Clock()
# Sets the title on top of game window
pygame.display.set_caption('Flappy Bird Game')
# Load all the images which we will use in the game
# images for displaying score
game_images['scoreimages'] = (
pygame.image.load('images/0.png').convert_alpha(),
pygame.image.load('images/1.png').convert_alpha(),
pygame.image.load('images/2.png').convert_alpha(),
pygame.image.load('images/3.png').convert_alpha(),
pygame.image.load('images/4.png').convert_alpha(),
pygame.image.load('images/5.png').convert_alpha(),
pygame.image.load('images/6.png').convert_alpha(),
pygame.image.load('images/7.png').convert_alpha(),
pygame.image.load('images/8.png').convert_alpha(),
pygame.image.load('images/9.png').convert_alpha()
)
game_images['flappybird'] = pygame.image.load(
birdplayer_image).convert_alpha()
game_images['sea_level'] = pygame.image.load(
sealevel_image).convert_alpha()
game_images['background'] = pygame.image.load(
background_image).convert_alpha()
game_images['pipeimage'] = (pygame.transform.rotate(pygame.image.load(
pipeimage).convert_alpha(), 180), pygame.image.load(
pipeimage).convert_alpha())
print("WELCOME TO THE FLAPPY BIRD GAME")
print("Press space or enter to start the game")
# Here starts the main game
while True:
# sets the coordinates of flappy bird
horizontal = int(window_width/5)
vertical = int(
(window_height - game_images['flappybird'].get_height())/2)
ground = 0
while True:
for event in pygame.event.get():
# if user clicks on cross button, close the game
if event.type == QUIT or (event.type == KEYDOWN and \
event.key == K_ESCAPE):
pygame.quit()
sys.exit()
# If the user presses space or
# up key, start the game for them
elif event.type == KEYDOWN and (event.key == K_SPACE or\
event.key == K_UP):
flappygame()
# if user doesn't press anykey Nothing happen
else:
window.blit(game_images['background'], (0, 0))
window.blit(game_images['flappybird'],
(horizontal, vertical))
window.blit(game_images['sea_level'], (ground, elevation))
pygame.display.update()
framepersecond_clock.tick(framepersecond)
输出: