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)
# 添加爆