1. 简介
愤怒的小鸟(Angry Birds)是一款由Rovio Entertainment开发的益智游戏,推出于2009年12月,成为全球范围内最流行的手机游戏之一。该游戏的主要玩家群体为青少年和成年人。
本文将展示使用Python编写的愤怒的小鸟小游戏,使用pygame库构建游戏框架,实现基本的游戏逻辑。具体步骤如下:
1.1 游戏环境搭建
在开始编写愤怒的小鸟游戏代码之前,需要搭建游戏环境,需要在Python环境中安装pygame库。
可以使用以下指令在命令行安装pygame库:
pip install pygame
1.2 游戏开发基础知识
在开始编写愤怒的小鸟代码之前,我们需要掌握一些游戏开发的基础知识:
屏幕和窗口:游戏通常在一个窗口内进行,一个窗口可以包含多个屏幕。
游戏循环:包含所有游戏逻辑的主循环。
事件处理:通过用户与游戏交互产生的事件来实现游戏逻辑。
帧率:游戏画面的刷新速率,一般以秒为单位。
精灵和碰撞检测:游戏中的精灵可以是任何对象,碰撞检测用于判断游戏中各个精灵之间是否发生碰撞。
2. 程序代码
下面是愤怒的小鸟游戏的示例代码:
import pygame
import random
# 初始化pygame库
pygame.init()
# 设置游戏屏幕
screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption('Angry Birds')
# 定义颜色
green = (0, 255, 0)
red = (255, 0, 0)
blue = (0, 0, 255)
# 定义小鸟类
class Bird(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.image.load('bird.png').convert_alpha()
self.rect = self.image.get_rect()
self.rect.x = 100
self.rect.y = 100
self.speed = 5
self.gravity = 0.5
self.jump_height = 10
self.jump = False
self.score = 0
# 更新小鸟位置
def update(self):
if self.rect.y >= 450:
self.rect.y = 450
self.gravity = 0
self.speed = 0
else:
self.gravity += 0.5
self.rect.y += self.gravity
if self.jump:
self.rect.y -= self.jump_height
self.jump_height -= 1
if self.jump_height < -10:
self.jump = False
self.jump_height = 10
# 小鸟跳跃
def jump_bird(self):
self.jump = True
self.jump_height = 10
self.gravity = 0
self.speed = -5
# 定义障碍物类
class Obstacle(pygame.sprite.Sprite):
def __init__(self, color, width, height):
super().__init__()
self.image = pygame.Surface([width, height])
self.image.fill(color)
self.rect = self.image.get_rect()
self.rect.x = 500
self.rect.y = random.randint(70, 330)
self.speed = 5
# 更新障碍物位置
def update(self):
self.rect.x -= self.speed
# 定义生成障碍物函数
def create_obstacle():
obstacle_colors = [red, green, blue]
width = random.randint(20, 80)
height = random.randint(20, 80)
color = obstacle_colors[random.randint(0, 2)]
obstacle = Obstacle(color, width, height)
return obstacle
# 加载背景音乐
pygame.mixer.music.load('music.mp3')
pygame.mixer.music.play(-1)
# 图片资源
background = pygame.image.load('background.png').convert_alpha()
gameover = pygame.image.load('gameover.png').convert_alpha()
# 定义字体
font = pygame.font.SysFont('arial', 25)
# 定义游戏结束函数
def game_over():
screen.blit(gameover, (50, 100))
score_text = font.render('Score: ' + str(player.score), True, red)
screen.blit(score_text, (210, 250))
restart_text = font.render('Press SPACE to restart', True, blue)
screen.blit(restart_text, (150, 300))
# 定义得分函数
def show_score():
score_text = font.render('Score: ' + str(player.score), True, green)
screen.blit(score_text, (5, 5))
# 添加精灵组
obstacles = pygame.sprite.Group()
all_sprite = pygame.sprite.Group()
# 添加小鸟精灵
player = Bird()
all_sprite.add(player)
# 设置帧率
clock = pygame.time.Clock()
FPS = 60
# 游戏循环
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
if not player.jump:
player.jump_bird()
# 更新小鸟位置和画面
all_sprite.update()
screen.blit(background, (0, 0))
all_sprite.draw(screen)
# 随机生成障碍物
if len(obstacles) < 3:
obstacle = create_obstacle()
obstacles.add(obstacle)
all_sprite.add(obstacle)
# 更新障碍物位置和画面
for obstacle in obstacles:
obstacle.update()
if obstacle.rect.x <= -20:
obstacles.remove(obstacle)
all_sprite.remove(obstacle)
player.score += 1
obstacles.draw(screen)
# 显示得分
show_score()
# 碰撞检测
if pygame.sprite.spritecollide(player, obstacles, False):
game_over()
player.speed = 0
player.gravity = 0
player.jump = False
for obstacle in obstacles:
obstacles.remove(obstacle)
all_sprite.remove(obstacle)
# 刷新画面
pygame.display.flip()
# 控制游戏帧率
clock.tick(FPS)
# 退出pygame库
pygame.quit()
3. 代码讲解
3.1 初始化pygame库
在开始编写游戏代码之前,需要先初始化pygame库,并且设置游戏窗口。使用pygame.init()
指令初始化pygame库,并创建一个500x500的游戏窗口,使用pygame.display.set_mode()
。
# 初始化pygame库
pygame.init()
# 设置游戏屏幕
screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption('Angry Birds')
3.2 定义小鸟类
在游戏中,我们需要定义小鸟类,包含小鸟的位置、跳跃高度、得分等属性。
小鸟继承自pygame.sprite.Sprite类,它是一个精灵(Sprite)对象,可以与其他精灵对象进行交互。
在小鸟类中,我们使用pygame.image.load()
加载小鸟图片,并使用convert_alpha()
将PNG图像转换为内部格式,以便pygame更快地处理图像。
小鸟精灵的位置被定义为一个矩形,使用get_rect()
方法获取小鸟精灵的位置属性。
小鸟的跳跃高度和得分分别初始化为10和0。
小鸟的位置更新函数update()
根据小鸟跳跃和下落的状态进行更新。
# 定义小鸟类
class Bird(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.image.load('bird.png').convert_alpha()
self.rect = self.image.get_rect()
self.rect.x = 100
self.rect.y = 100
self.speed = 5
self.gravity = 0.5
self.jump_height = 10
self.jump = False
self.score = 0
# 更新小鸟位置
def update(self):
if self.rect.y >= 450:
self.rect.y = 450
self.gravity = 0
self.speed = 0
else:
self.gravity += 0.5
self.rect.y += self.gravity
if self.jump:
self.rect.y -= self.jump_height
self.jump_height -= 1
if self.jump_height < -10:
self.jump = False
self.jump_height = 10
# 小鸟跳跃
def jump_bird(self):
self.jump = True
self.jump_height = 10
self.gravity = 0
self.speed = -5
3.3 定义障碍物类
除了小鸟类,我们还需要定义障碍物类,包含障碍物的颜色、位置等属性。
障碍物类同样继承自pygame.sprite.Sprite类,在初始化函数中通过pygame.Surface创建一个障碍物矩形,并设置障碍物的位置。
在障碍物类中,我们定义update()
方法来更新障碍物的位置。
# 定义障碍物类
class Obstacle(pygame.sprite.Sprite):
def __init__(self, color, width, height):
super().__init__()
self.image = pygame.Surface([width, height])
self.image.fill(color)
self.rect = self.image.get_rect()
self.rect.x = 500
self.rect.y = random.randint(70, 330)
self.speed = 5
# 更新障碍物位置
def update(self):
self.rect.x -= self.speed
3.4 定义生成障碍物函数
在游戏中,我们需要随机生成障碍物。
我们定义一个create_obstacle()
函数,随机选择障碍物的颜色、宽度和高度,并返回一个障碍物实例。
# 定义生成障碍物函数
def create_obstacle():
obstacle_colors = [red, green, blue]
width = random.randint(20, 80)
height = random.randint(20, 80)
color = obstacle_colors[random.randint(0, 2)]
obstacle = Obstacle(color, width, height)
return obstacle
3.5 游戏画面更新和障碍物生成
在游戏循环中,我们需要根据每个帧的时间更新游戏画面,同时随机生成障碍物。
我们使用clock.tick(FPS)
控制游戏帧率,使用pygame.display.flip()
刷新画面。
随机生成3个以内的障碍物,根据生成的障碍物数量添加到障碍物组内。
使用障碍物类中的update()
函数更新障碍物位置,并将障碍物矩形绘制到屏幕中。
当障碍物到达左侧屏幕时,我们需要将障碍物从障碍物组中移除,同时将其从所有精灵组中移除。
# 游戏循环
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
if not player.jump:
player.jump_bird()
# 更新小鸟位置和画面
all_sprite.update()
screen.blit(background, (0, 0))
all_sprite.draw(screen)
# 随机生成障碍物
if len(obstacles) < 3:
obstacle = create_obstacle()
obstacles.add(obstacle)
all_sprite.add(obstacle)
# 更新障碍物位置和画面
for obstacle in obstacles:
obstacle.update()
if obstacle.rect.x <= -20:
obstacles.remove(obstacle)
all_sprite.remove(obstacle)
player.score += 1
obstacles.draw(screen)
# 显示得分
show_score()
# 判断碰撞检测,如果发生碰撞,则显示游戏结束画面
if pygame.sprite.spritecollide(player, obstacles, False):
game_over()
player.speed = 0
player.gravity = 0
player.jump = False
for obstacle in obstacles:
obstacles.remove(obstacle)
all_sprite.remove(obstacle)
# 刷新画面
pygame.display.flip()
# 控制游戏帧率
clock.tick(FPS)
3.6 碰撞检测和游戏结束
在游戏运行过程中,我们需要检测小鸟和障碍物是否发生碰撞。如果发生碰撞,则游戏结束。
我们使用pygame.sprite.spritecollide()
函数检测小鸟和障碍物是否发生了碰撞。这个函数会返回一个列表,包含与小鸟发生碰撞的障碍物。
当小鸟和障碍物发生碰撞时,我们显示游戏结束画面,并将小鸟的速度和重力设置为0。
同时移除障碍物,更新得分。
# 碰撞检测
if pygame.sprite.spritecollide(player, obstacles, False):
game_over()
player.speed = 0
player.gravity = 0
player.jump = False
for obstacle in obstacles:
obstacles.remove(obstacle)
all_sprite.remove(obstacle)
3.7 显示得分和游戏结束
当小鸟成功越过一堆障碍物时,我们需要更新得分,show_score()
函数用来显示得分。
游戏结束后,我们显示游戏结束画面,并在画面中显示得分和重新开始的提示。
# 显示得分
def show_score():
score_text = font.render('Score: ' + str(player.score), True, green)
screen.blit(score_text, (5, 5