Python实现飞机大战小游戏(含源码+图片资源)

Python实现飞机大战小游戏(含源码+图片资源)

  • 1. 项目描述
  • 2. 依赖包导入
  • 3. 代码实现
    • 3.1 类构建
    • 3.2 初始化设置
    • 3.3 排行榜功能
    • 3.4 主循环
  • 4. 效果展示
    • 4.1游戏开始界面:
    • 4.2破纪录界面显示:
    • 4.3排行榜功能:
  • 5. 不足和改进

1. 项目描述

        该飞机大战小游戏是利用python语言实现的,该项目为之前学习python时,参考一些教程并进行改进的结果。现在由于疫情呆在家里,而且这学期课程并不多,所以想花点时间整理并回顾一下这个项目,也希望对大家能有些许帮助。完整Github项目地址,欢迎大家评论和交流。
        该项目实现了飞机大战游戏的基本功能,玩家可以通过w、a、s、d键控制飞机移动,通过k键发射子弹。同时该项目实现了游戏时的暂停和继续功能以及排行榜功能,记录历史最好游戏成绩。敌方飞机有三种类型,大小、攻击力、移动速度各不相同,当然击杀获得的奖励也有差异。下图为敌机类型二系列图片:
Python实现飞机大战小游戏(含源码+图片资源)_第1张图片

2. 依赖包导入

        该项目需要导入的包如下,如果没有安装的可以利用pip命令进行安装,这里就不再进行详细叙述了。

import codecs
import pygame
from pygame.locals import *  # 常量
from sys import exit
import time
import random

3. 代码实现

        当时实现该项目时,没太注重功能的划分,因此所有的实现逻辑均在一个文件中。不过,大家放心,该项目实现逻辑比较简单的,且源代码中包含必要的注释。

3.1 类构建

        首先构建子弹类、敌机类以及我方战机类,子弹类示例代码如下(其它不予详细介绍,完整项目地址见上):

# 子弹类
class Bullet(pygame.sprite.Sprite):
    # 构造函数参数为子弹图片和初始位置
    def __init__(self, bullet_img, init_pos):
        pygame.sprite.Sprite.__init__(self)
        self.image = bullet_img
        self.rect = self.image.get_rect()
        self.rect.midbottom = init_pos
        self.speed = 10  # 子弹速度
        self.damage = 1

    # 子弹移动
    def move(self):
        self.rect.top -= self.speed

    def enemies_move(self):
        self.rect.top += self.speed

3.2 初始化设置

        初始化设置包括窗口名称、长度和宽度的设置、背景图片设置、游戏音乐加载以及子弹和战机系列图片的加载。部分代码如下:

# 初始化pygame
pygame.init()
# 初始化混音器模块
pygame.mixer.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
# 窗口名
pygame.display.set_caption("SpaceWar")
# 设置窗口图标
# ic_launcher = pygame.image.load("photoes/ic_launcher.jpg")
# pygame.display.set_icon(ic_launcher)
# 背景图片
background = pygame.image.load("photoes/background.png")
# 设置背景音乐
pygame.mixer.music.load("sounds/background.wav")
pygame.mixer.music.set_volume(0.2)  # 设置音量
# 游戏结束图片
again = pygame.image.load("photoes/again.png")

3.3 排行榜功能

        该项目数据的读取和存入属于很轻量的运用,没有必要使用数据库来存储,因此这里我利用文件实现该功能。当游戏结束后,程序会对当前得分以及历史得分进行比较,如果超越记录,界面会予以显示,并提示“NEW RECORD”。功能函数实现代码如下:

# 读取文件历史纪录分数
def readScores(path):
    with open(path, 'r', encoding="utf8") as f:
        lines = f.readlines()
    return lines


# 将成绩写入文件
def writeScores(context, srtim, path):
    f = codecs.open(path, srtim, "utf8")
    f.write(str(context))
    f.close()

3.4 主循环

        在主循环中响应暂停或继续的点击事件,该游戏核心功能,如:战机移动、战机之间碰撞、子弹与战机碰撞的检测都是在该循环中完成的。
        利用pygame.sprite.Group()来保存敌机集合、敌机坠机集合(用于展示坠机动画)以及敌方发射的子弹集合,利用pygame.sprite.collide_rect函数来检测碰撞,非常简单,不需要我们再去定义碰撞检测函数。主循环在main.py中的startGame()函数里,由于实现代码较多,这里不再展示。

4. 效果展示

4.1游戏开始界面:

Python实现飞机大战小游戏(含源码+图片资源)_第2张图片

4.2破纪录界面显示:

Python实现飞机大战小游戏(含源码+图片资源)_第3张图片

4.3排行榜功能:

Python实现飞机大战小游戏(含源码+图片资源)_第4张图片

5. 不足和改进

        该项目为早期学习阶段完成的一个小游戏,现在看来有诸多不足和改进空间。首先代码逻辑就有很大的问题,所有实现都放在了一个文件中。其次,该项目实现的功能还比较少,比如:可以添加技能的功能,击败敌方战机有概率掉落技能;多元化敌方战机移动方式,而不只是一直向下移动。
        当时实现该项目的另一个初衷是以该项目为基础,进行机器学习等,让AI操纵我方战机,进行游戏。不过,现在自己大致确定了未来的发展方向,想专一学精,因此没有再继续进一步的尝试。大家如果有兴趣的话,可以进行重构和功能的添加。该项目所有代码和图片音频资源均在上述提到的Github仓库中。
        最后补充一下,大家如果想把该项目编译成可以独立运行的exe文件或者安装程序的话,可以参考我的这篇博文,里面有提到哦。

你可能感兴趣的:(Python)