1. 简介
飞机大战是一款非常经典的小游戏,很多人小时候都玩过。本文将通过使用Python3实现飞机大战游戏。
2. 游戏实现
2.1 游戏框架
在Python中,可以使用Pygame库来实现游戏。Pygame是一个跨平台的Python模块,旨在支持多种操作系统,如Windows、Linux、Mac OS等。下面是实现飞机大战游戏所需要的Pygame模块:
import pygame
import random
import time
其中,pygame模块是主要的模块,负责处理游戏的图形界面和事件响应等;random模块用于生成随机数;time模块用于控制游戏的速度。
2.2 游戏元素
在游戏中,我们需要定义一些元素,包括游戏窗口、玩家飞机、敌机、子弹等。下面我们先定义一些参数:
# 游戏窗口大小
WINDOW_WIDTH = 480
WINDOW_HEIGHT = 600
# 颜色定义
WHITE_COLOR = (255, 255, 255)
BLACK_COLOR = (0, 0, 0)
RED_COLOR = (255, 0, 0)
# 帧率定义
FPS = 60
# 玩家飞机定义
PLAYER_WIDTH = 50
PLAYER_HEIGHT = 60
PLAYER_SPEED = 5
# 子弹定义
BULLET_WIDTH = 6
BULLET_HEIGHT = 15
BULLET_SPEED = 10
# 敌机定义
ENEMY_WIDTH = 50
ENEMY_HEIGHT = 40
ENEMY_SPEED = 3
ENEMY_HIT_POINT = 1
其中,WINDOW_WIDTH和WINDOW_HEIGHT是游戏窗口的大小,WHITE_COLOR、BLACK_COLOR和RED_COLOR是游戏中可能用到的颜色。FPS表示游戏的帧率,玩家飞机的大小和速度、子弹的大小和速度、敌机的大小和速度以及敌机的生命值分别是PLAYER_WIDTH、PLAYER_HEIGHT、PLAYER_SPEED、BULLET_WIDTH、BULLET_HEIGHT、BULLET_SPEED、ENEMY_WIDTH、ENEMY_HEIGHT、ENEMY_SPEED和ENEMY_HIT_POINT。
2.3 实现游戏
游戏的主要逻辑包括以下几个步骤:
初始化Pygame,设置游戏窗口、背景等参数
载入游戏素材,包括玩家飞机、敌机、子弹等
设置游戏音效
循环执行游戏主体
处理游戏事件,包括键盘事件和鼠标事件
更新游戏元素状态,包括玩家飞机位置、敌机位置、子弹位置等
绘制游戏元素
处理游戏逻辑,包括碰撞检测、得分计算等
下面是代码实现:
def main():
# 初始化Pygame
pygame.init()
# 创建游戏窗口
window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("飞机大战")
# 载入游戏素材
load_game_images()
# 设置游戏音效
set_game_sounds()
# 初始化玩家飞机
player = Player(window)
# 初始化敌机列表
enemy_list = []
# 初始化子弹列表
bullet_list = []
# 初始化游戏得分
score = 0
# 循环执行游戏主体
while True:
# 处理游戏事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
elif event.key == pygame.K_SPACE:
player.shoot(bullet_list)
# 更新玩家飞机位置
player.move()
# 更新敌机位置
for enemy in enemy_list:
enemy.move()
# 更新子弹位置
for bullet in bullet_list:
bullet.move()
# 绘制游戏元素
window.fill(WHITE_COLOR)
player.draw()
for enemy in enemy_list:
enemy.draw()
for bullet in bullet_list:
bullet.draw()
# 处理游戏逻辑
process_game_logic(player, enemy_list, bullet_list, score)
# 绘制得分
draw_score(window, score)
# 刷新屏幕
pygame.display.update()
# 控制游戏速度
clock.tick(FPS)
在游戏主体循环中,我们按照上述逻辑完成了游戏的处理,其中玩家飞机、敌机、子弹等都是通过类来实现的,有兴趣的读者可以继续查看完整代码。
2.4 可调参数
在游戏中,我们还可以根据需要调整一些参数,这些参数可以通过命令行参数或配置文件进行设置,比如:
游戏窗口大小
帧率
玩家飞机大小和速度
敌机大小和速度
子弹大小和速度
敌机生命值
我们可以通过Python内置的argparse模块来实现命令行参数的解析,通过读取配置文件来实现参数的设置。
3. 总结
本文通过使用Python3和Pygame库来实现了飞机大战游戏。通过实现飞机大战游戏,我们可以更深入地了解Python和Pygame的应用,同时也可以提高我们的编程技能。完整代码可以在下面获取:
完整代码:
import pygame
import random
import sys
import time
# 游戏窗口大小
WINDOW_WIDTH = 480
WINDOW_HEIGHT = 600
# 颜色定义
WHITE_COLOR = (255, 255, 255)
BLACK_COLOR = (0, 0, 0)
RED_COLOR = (255, 0, 0)
# 帧率定义
FPS = 60
# 玩家飞机定义
PLAYER_WIDTH = 50
PLAYER_HEIGHT = 60
PLAYER_SPEED = 5
# 子弹定义
BULLET_WIDTH = 6
BULLET_HEIGHT = 15
BULLET_SPEED = 10
# 敌机定义
ENEMY_WIDTH = 50
ENEMY_HEIGHT = 40
ENEMY_SPEED = 3
ENEMY_HIT_POINT = 1
# 声音定义
SHOOT_SOUND_FILE = "shoot.wav"
EXPLODE_SOUND_FILE = "explode.wav"
# 图片定义
PLAYER_IMAGE_FILE = "player.png"
BULLET_IMAGE_FILE = "bullet.png"
ENEMY_IMAGE_FILE = "enemy.png"
EXPLODE_IMAGE_FILE = "explode.png"
# 玩家飞机类
class Player(pygame.sprite.Sprite):
def __init__(self, window):
super().__init__()
self.image = pygame.image.load(PLAYER_IMAGE_FILE).convert_alpha()
self.rect = self.image.get_rect()
self.rect.x = int((WINDOW_WIDTH - PLAYER_WIDTH) / 2)
self.rect.y = WINDOW_HEIGHT - PLAYER_HEIGHT
self.window = window
def move(self):
# 处理键盘事件
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and self.rect.x > 0:
self.rect.x -= PLAYER_SPEED
if keys[pygame.K_RIGHT] and self.rect.x < (WINDOW_WIDTH - PLAYER_WIDTH):
self.rect.x += PLAYER_SPEED
def shoot(self, bullet_list):
bullet = Bullet(self.window, self.rect.centerx, self.rect.y)
bullet_list.append(bullet)
def draw(self):
self.window.blit(self.image, self.rect)
# 敌机类
class Enemy(pygame.sprite.Sprite):
def __init__(self, window):
super().__init__()
self.image = pygame.image.load(ENEMY_IMAGE_FILE).convert_alpha()
self.rect = self.image.get_rect()
self.rect.x = random.randint(0, WINDOW_WIDTH - ENEMY_WIDTH)
self.rect.y = -ENEMY_HEIGHT
self.window = window
self.hit_point = ENEMY_HIT_POINT
def move(self):
self.rect.y += ENEMY_SPEED
def draw(self):
self.window.blit(self.image, self.rect)
# 子弹类
class Bullet(pygame.sprite.Sprite):
def __init__(self, window, x, y):
super().__init__()
self.image = pygame.image.load(BULLET_IMAGE_FILE).convert_alpha()
self.rect = self.image.get_rect()
self.rect.x = x - BULLET_WIDTH / 2
self.rect.y = y - BULLET_HEIGHT
self.window = window
def move(self):
self.rect.y -= BULLET_SPEED
def draw(self):
self.window.blit(self.image, self.rect)
# 爆炸类
class Explode(pygame.sprite.Sprite):
def __init__(self, window, x, y):
super().__init__()
self.images = []
for i in range(1, 6):
image = pygame.image.load(EXPLODE_IMAGE_FILE % i).convert_alpha()
self.images.append(image)
self.image = self.images[0]
self.rect = self.image.get_rect()
self.rect.x = x - self.rect.width / 2
self.rect.y = y - self.rect.height / 2
self.window = window
self.index = 0
self.count = 0
def update(self):
self.count += 1
if self.count > 3:
self.index += 1
if self.index >= len(self.images):
self.kill()
else:
self.image = self.images[self.index]
self.count = 0
def draw(self):
self.window.blit(self.image, self.rect)
# 声音类
class SoundEffect:
def __init__(self, filepath):
self.sound = pygame.mixer.Sound(filepath)
def play(self):
self.sound.play()
# 载入游戏图片
def load_game_images():
global PLAYER_IMAGE_FILE, BULLET_IMAGE_FILE, ENEMY_IMAGE_FILE, EXPLODE_IMAGE_FILE
PLAYER_IMAGE_FILE = "./images/player.png"
BULLET_IMAGE_FILE = "./images/bullet.png"
ENEMY_IMAGE_FILE = "./images/enemy.png"
EXPLODE_IMAGE_FILE = "./images/explode_%d.png"
# 设置游戏音效
def set_game_sounds():
global SHOOT_SOUND_FILE, EXPLODE_SOUND_FILE
SHOOT_SOUND_FILE = "./sounds/shoot.wav"
EXPLODE_SOUND_FILE = "./sounds/explode.wav"
shoot_sound = SoundEffect(SHOOT_SOUND_FILE)
explode_sound = SoundEffect(EXPLODE_SOUND_FILE)
pygame.mixer.music.load("bgm.mp3")
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1, 0.0)
return shoot_sound, explode_sound
# 处理游戏逻辑
def process_game_logic(player, enemy_list, bullet_list, score):
# 产生敌机
if len(enemy_list) == 0:
enemy = Enemy(player.window)
enemy_list.append(enemy)
# 移除越界的子弹
for bullet in bullet_list.copy():
if bullet.rect.y < -BULLET_HEIGHT:
bullet_list.remove(bullet)
# 移除越界的敌机
for enemy in enemy_list.copy():
if enemy.rect.y > WINDOW_HEIGHT:
enemy_list.remove(enemy)
# 判断子弹是否击中敌机
for bullet in bullet_list.copy():
for enemy in enemy_list.copy():
if bullet.rect.colliderect(enemy.rect):
enemy.hit_point -= 1
if enemy.hit_point == 0:
enemy_list.remove(enemy)
score += 1
explode_sound.play()
explode = Explode(player.window, enemy.rect.centerx, enemy.rect.centery)
player.window.blit(explode.image, explode.rect)
pygame.display.flip()
time.sleep(0.2)
bullet_list.remove(bullet)
break
# 判断是否与敌机相撞
for enemy in enemy_list.copy():
if enemy.rect.colliderect(player.rect):
enemy_list.remove(enemy)
explode_sound.play()
explode = Explode(player.window, enemy.rect.centerx, enemy.rect.centery)
player.window.blit(explode.image, explode.rect)
pygame.display.flip()
time.sleep(0.2)
pygame.quit()
sys.exit()
# 绘制得分
def draw_score(window, score):
font = pygame.font.SysFont(None, 20)
score_text = font.render("Score: " + str(score), True, BLACK_COLOR)
window.blit(score_text, (10, 10))
# 主函数
def main():
# 初始化Pygame
pygame.init()
# 创建游戏窗口
window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption("飞机大战")
# 载入游戏素材
load_game_images()
# 设置游戏音效
shoot_sound, explode_sound = set_game_sounds()
# 初始化玩家飞机
player = Player(window)
# 初始化敌机列表
enemy_list = []
# 初始化子弹列表
bullet_list = []
# 初始化游戏得分
score = 0
# 循环执行游戏主体
while True:
# 处理游戏事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
elif event.key == pygame.K_SPACE:
player.shoot(bullet_list)
shoot_sound.play()
# 更新玩家飞机位置
player.move()
# 更新敌机位置
for enemy in enemy_list:
enemy.move()
# 更新子弹位置
for bullet in bullet_list:
bullet.move()
# 绘制游戏元素
window.fill(WHITE_COLOR)
player.draw()
for enemy in enemy_list:
enemy.draw()
for bullet in bullet_list:
bullet.draw()
# 处理游戏逻辑
process_game_logic(player, enemy_list, bullet_list, score)
# 绘制得分
draw_score(window, score)
# 刷新屏幕
pygame.display.update()
# 控制游戏速度
clock.tick(FPS)
if __name__ == '__main__':
# 设置随机种子
random.seed(time.time())
# 创建时钟对象
clock = pygame.time.Clock()
# 运行游戏
main()