Python3实现飞机大战游戏

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()

后端开发标签