python3实现飞机大战

1. 概述

飞机大战是一款非常经典的电子游戏,玩家控制一架飞机,用武器消灭飞来的敌机,尽可能地存活下来。对于初学者来说,用Python实现一个基本版的飞机大战也是一个不错的练手项目。

2. 游戏开发环境

2.1 Python版本选择

由于Python 2的停止维护,我们选择Python 3来实现飞机大战游戏。在本次开发中,我们选择Python 3.7版本。

2.2 游戏框架选择

Python中有许多游戏框架可供选择。在本次开发中,我们选择Pygame作为游戏框架。Pygame是一款Python专门用于开发2D游戏的库,它非常易于使用,文档丰富,适合初学者使用。

2.3 Pygame安装

在安装Pygame之前,我们需要先安装Python 3。而后,执行以下命令以安装Pygame:

pip install pygame

3. 实现游戏基本框架

在开发任何一个游戏时,我们需要建立一个基本的框架,包括游戏界面的搭建、游戏资源的载入、游戏事件的处理以及游戏循环的实现。

3.1 游戏界面的搭建

我们通过pygame库中的Surface对象来创建游戏界面,并设置界面的大小与标题。执行以下代码创建界面:

import pygame

# 初始化游戏

pygame.init()

# 设置屏幕宽高

SCREEN_WIDTH = 480

SCREEN_HEIGHT = 800

screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

# 设置窗口标题

pygame.display.set_caption('飞机大战')

执行上述代码后,我们可以看到一个新的窗口弹出,标题为“飞机大战”。

3.2 游戏资源的载入

游戏资源包括游戏图像、声音等。在pygame中,我们可以使用Surface对象来载入图片,并使用load函数来载入声音。执行以下代码载入游戏图片:

# 游戏图片路径

BACKGROUND_IMAGE_PATH = 'images/background.png'

PLAYER_IMAGE_PATH = 'images/hero.png'

# 载入背景图片和玩家图片

background = pygame.image.load(BACKGROUND_IMAGE_PATH)

player = pygame.image.load(PLAYER_IMAGE_PATH)

执行上述代码后,我们就可以获取到背景图片和玩家图片的Surface对象。

3.3 游戏事件的处理

游戏事件包括用户的操作和系统的事件。在pygame中,我们可以使用event.get函数来获取事件,并使用event.type来判断事件类型。例如,我们可以添加以下代码来退出游戏:

while True:

# 获取游戏事件

for event in pygame.event.get():

# 退出游戏

if event.type == pygame.QUIT:

pygame.quit()

exit()

上述代码实现了游戏的退出,当用户关闭窗口时,程序会执行quit函数退出Pygame模块,exit函数退出程序。

3.4 游戏循环的实现

游戏循环是游戏运行的核心,它会不断地更新游戏画面,并处理游戏事件。在pygame中,我们可以使用clock对象来控制游戏的帧率。

# 创建时钟对象

clock = pygame.time.Clock()

while True:

# 设置帧率

clock.tick(60)

# 处理游戏事件

for event in pygame.event.get():

if event.type == pygame.QUIT:

pygame.quit()

exit()

# 更新游戏画面

screen.blit(background, (0, 0))

screen.blit(player, (200, 600))

# 刷新游戏画面

pygame.display.update()

在上述代码中,我们使用clock.tick函数来将游戏帧率设置为60帧每秒。在游戏循环的最后,我们使用pygame.display.update函数来更新游戏画面。

4. 添加玩家飞机与移动

4.1 添加玩家飞机

在飞机大战游戏中,我们需要控制的是玩家飞机。因此,我们需要添加玩家飞机,并将其绘制到游戏界面上。执行以下代码添加玩家飞机:

# 载入玩家飞机图片

PLAYER_IMAGE_PATH = 'images/hero.png'

player = pygame.image.load(PLAYER_IMAGE_PATH)

# 获取玩家飞机的大小

player_rect = player.get_rect()

# 玩家飞机的初始位置

player_rect.left, player_rect.top = (SCREEN_WIDTH - player_rect.width) // 2, \

SCREEN_HEIGHT - player_rect.height - 50

while True:

# 更新游戏画面

screen.blit(background, (0, 0))

screen.blit(player, player_rect)

# 刷新游戏画面

pygame.display.update()

执行上述代码后,我们可以看到界面上出现了玩家飞机。

4.2 玩家飞机的移动

在游戏中,玩家需要通过键盘控制飞机的移动。在pygame中,我们使用以下代码获取当前键盘的按键情况:

# 获取当前键盘的按键情况

keys = pygame.key.get_pressed()

通过检测上下左右键,我们可以控制飞机的上下左右移动,并设置移动速度:

# 设置飞机的移动速度

PLAYER_SPEED = 5

while True:

keys = pygame.key.get_pressed()

# 玩家飞机的移动

if keys[pygame.K_UP] or keys[pygame.K_w]:

player_rect.top -= PLAYER_SPEED

if keys[pygame.K_DOWN] or keys[pygame.K_s]:

player_rect.top += PLAYER_SPEED

if keys[pygame.K_LEFT] or keys[pygame.K_a]:

player_rect.left -= PLAYER_SPEED

if keys[pygame.K_RIGHT] or keys[pygame.K_d]:

player_rect.left += PLAYER_SPEED

# 更新游戏画面

screen.blit(background, (0, 0))

screen.blit(player, player_rect)

# 刷新游戏画面

pygame.display.update()

在上述代码中,我们设置了玩家飞机的移动速度为5。当玩家按下键盘上的上下左右键或者WASD键时,飞机会做出相应的移动。并在每一帧更新游戏画面,实现飞机的连续移动。

5. 添加子弹与敌机

5.1 添加子弹

在飞机大战游戏中,玩家需要使用子弹来消灭敌机。因此,我们需要添加子弹,并在每一帧更新子弹的状态。执行以下代码添加子弹:

# 载入子弹图片

BULLET_IMAGE_PATH = 'images/bullet.png'

bullet = pygame.image.load(BULLET_IMAGE_PATH)

# 定义子弹列表存储所有子弹的状态信息

bullet_list = []

while True:

keys = pygame.key.get_pressed()

# 玩家飞机的移动

if keys[pygame.K_UP] or keys[pygame.K_w]:

player_rect.top -= PLAYER_SPEED

if keys[pygame.K_DOWN] or keys[pygame.K_s]:

player_rect.top += PLAYER_SPEED

if keys[pygame.K_LEFT] or keys[pygame.K_a]:

player_rect.left -= PLAYER_SPEED

if keys[pygame.K_RIGHT] or keys[pygame.K_d]:

player_rect.left += PLAYER_SPEED

# 添加子弹

if keys[pygame.K_SPACE]:

# 子弹的初始位置在玩家飞机的正上方

bullet_rect = pygame.Rect(player_rect.left + player_rect.width // 2 - 2, \

player_rect.top - 10, 5, 10)

bullet_list.append(bullet_rect)

# 更新子弹状态

for bullet_rect in bullet_list:

bullet_rect.top -= 10

# 更新游戏画面

screen.blit(background, (0, 0))

screen.blit(player, player_rect)

for bullet_rect in bullet_list:

screen.blit(bullet, bullet_rect)

# 刷新游戏画面

pygame.display.update()

在上述代码中,我们创建了一个子弹列表,用于存储所有子弹的状态信息。当玩家按下空格键时,我们在子弹列表中添加一颗新的子弹,并设置其初始位置为玩家飞机正上方。

在游戏循环中,我们遍历子弹列表中的每一个子弹,并将其纵坐标减10,实现子弹的向上移动效果。然后,我们在更新游戏画面时,将所有子弹绘制到游戏界面上。

5.2 添加敌机

在飞机大战游戏中,玩家需要面对不断飞来的敌机,因此我们需要添加敌机,并设置敌机的出现时间和速度。执行以下代码添加敌机:

# 载入敌机图片

ENEMY_IMAGE_PATH = 'images/enemy.png'

enemy = pygame.image.load(ENEMY_IMAGE_PATH)

# 定义敌机列表存储所有敌机的状态信息

enemy_list = []

# 定义敌机出现的时间间隔

ENEMY_APPEAR_INTERVAL = 3000

enemy_appear_timer = USEREVENT

pygame.time.set_timer(enemy_appear_timer, ENEMY_APPEAR_INTERVAL)

while True:

# 获取游戏事件

for event in pygame.event.get():

if event.type == pygame.QUIT:

pygame.quit()

exit()

# 敌机出现

if event.type == enemy_appear_timer:

# 敌机的初始位置和移动速度

enemy_rect = pygame.Rect(random.randint(0, SCREEN_WIDTH-enemy.get_width()), \

-enemy.get_height(), \

enemy.get_width(), \

enemy.get_height())

enemy_speed = random.randint(1, 5)

enemy_list.append([enemy_rect, enemy_speed])

keys = pygame.key.get_pressed()

# 玩家飞机的移动

if keys[pygame.K_UP] or keys[pygame.K_w]:

player_rect.top -= PLAYER_SPEED

if keys[pygame.K_DOWN] or keys[pygame.K_s]:

player_rect.top += PLAYER_SPEED

if keys[pygame.K_LEFT] or keys[pygame.K_a]:

player_rect.left -= PLAYER_SPEED

if keys[pygame.K_RIGHT] or keys[pygame.K_d]:

player_rect.left += PLAYER_SPEED

# 添加子弹

if keys[pygame.K_SPACE]:

# 子弹的初始位置在玩家飞机的正上方

bullet_rect = pygame.Rect(player_rect.left + player_rect.width // 2 - 2, \

player_rect.top - 10, 5, 10)

bullet_list.append(bullet_rect)

# 更新子弹状态

for bullet_rect in bullet_list:

bullet_rect.top -= 10

# 更新敌机状态

for enemy_info in enemy_list:

enemy_rect, enemy_speed = enemy_info

enemy_rect.top += enemy_speed

# 更新游戏画面

screen.blit(background, (0, 0))

screen.blit(player, player_rect)

for bullet_rect in bullet_list:

screen.blit(bullet, bullet_rect)

for enemy_info in enemy_list:

enemy_rect, _ = enemy_info

screen.blit(enemy, enemy_rect)

# 刷新游戏画面

pygame.display.update()

在上述代码中,我们创建了一个敌机列表,用于存储所有敌机的状态信息。为了使敌机不是同时出现,我们使用Pygame提供的计时器函数,并在每3000毫秒(3秒)内随机添加一架新的敌机到敌机列表中。当敌机出现后,我们设置其初始位置为随机位置的屏幕上方,并设置移动速度为1~5之间的随机数。

在游戏循环中,我们遍历敌机列表中的每一个敌机,并将其纵坐标加上对应的移动速度。然后,我们在更新游戏画面时,将所有敌机绘制到游戏界面上。

6. 更多功能的实现

以上是一个非常基本的飞机大战游戏框架。实现上述功能只是开始,我们还可以添加更多的功能,例如爆炸效果、得分系统等等。以下是一个简单的爆炸效果实现:

# 载入爆炸效果图片

EXPLODE_IMAGE_PATH = 'images/explosion.png'

explode = pygame.image.load(EXPLODE_IMAGE_PATH)

# 爆炸效果列表

explode_list = []

while True:

keys = pygame.key.get_pressed()

# 玩家飞机的移动

if keys[pygame.K_UP] or keys[pygame.K_w]:

player_rect.top -= PLAYER_SPEED

if keys[pygame.K_DOWN] or keys[pygame.K_s]:

player_rect.top += PLAYER_SPEED

if keys[pygame.K_LEFT] or keys[pygame.K_a]:

player_rect.left -= PLAYER_SPEED

if keys[pygame.K_RIGHT] or keys[pygame.K_d]:

player_rect.left += PLAYER_SPEED

# 添加子弹

if keys[pygame.K_SPACE]:

# 子弹的初始位置在玩家飞机的正上方

bullet_rect = pygame.Rect(player_rect.left + player_rect.width // 2 - 2, \

player_rect.top - 10, 5, 10)

bullet_list.append(bullet_rect)

# 更新子弹状态

for bullet_rect in bullet_list:

bullet_rect.top -= 10

# 更新敌机状态

for enemy_info in enemy_list:

enemy_rect, enemy_speed = enemy_info

enemy_rect.top += enemy_speed

# 检测子弹是否击中敌机

for bullet_rect in bullet_list:

for enemy_info in enemy_list:

enemy_rect, _ = enemy_info

if bullet_rect.colliderect(enemy_rect):

# 将敌机从敌机列表中删除

enemy_list.remove(enemy_info)

# 将子弹从子弹列表中删除

bullet_list.remove(bullet_rect)

# 添加爆