python pygame 愤怒的小鸟游戏示例代码

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

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。