该飞机大战小游戏是利用python语言实现的,该项目为之前学习python时,参考一些教程并进行改进的结果。现在由于疫情呆在家里,而且这学期课程并不多,所以想花点时间整理并回顾一下这个项目,也希望对大家能有些许帮助。完整Github项目地址,欢迎大家评论和交流。
该项目实现了飞机大战游戏的基本功能,玩家可以通过w、a、s、d键控制飞机移动,通过k键发射子弹。同时该项目实现了游戏时的暂停和继续功能以及排行榜功能,记录历史最好游戏成绩。敌方飞机有三种类型,大小、攻击力、移动速度各不相同,当然击杀获得的奖励也有差异。下图为敌机类型二系列图片:
该项目需要导入的包如下,如果没有安装的可以利用pip命令进行安装,这里就不再进行详细叙述了。
import codecs
import pygame
from pygame.locals import * # 常量
from sys import exit
import time
import random
当时实现该项目时,没太注重功能的划分,因此所有的实现逻辑均在一个文件中。不过,大家放心,该项目实现逻辑比较简单的,且源代码中包含必要的注释。
首先构建子弹类、敌机类以及我方战机类,子弹类示例代码如下(其它不予详细介绍,完整项目地址见上):
# 子弹类
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
初始化设置包括窗口名称、长度和宽度的设置、背景图片设置、游戏音乐加载以及子弹和战机系列图片的加载。部分代码如下:
# 初始化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")
该项目数据的读取和存入属于很轻量的运用,没有必要使用数据库来存储,因此这里我利用文件实现该功能。当游戏结束后,程序会对当前得分以及历史得分进行比较,如果超越记录,界面会予以显示,并提示“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()
在主循环中响应暂停或继续的点击事件,该游戏核心功能,如:战机移动、战机之间碰撞、子弹与战机碰撞的检测都是在该循环中完成的。
利用pygame.sprite.Group()来保存敌机集合、敌机坠机集合(用于展示坠机动画)以及敌方发射的子弹集合,利用pygame.sprite.collide_rect函数来检测碰撞,非常简单,不需要我们再去定义碰撞检测函数。主循环在main.py中的startGame()函数里,由于实现代码较多,这里不再展示。
该项目为早期学习阶段完成的一个小游戏,现在看来有诸多不足和改进空间。首先代码逻辑就有很大的问题,所有实现都放在了一个文件中。其次,该项目实现的功能还比较少,比如:可以添加技能的功能,击败敌方战机有概率掉落技能;多元化敌方战机移动方式,而不只是一直向下移动。
当时实现该项目的另一个初衷是以该项目为基础,进行机器学习等,让AI操纵我方战机,进行游戏。不过,现在自己大致确定了未来的发展方向,想专一学精,因此没有再继续进一步的尝试。大家如果有兴趣的话,可以进行重构和功能的添加。该项目所有代码和图片音频资源均在上述提到的Github仓库中。
最后补充一下,大家如果想把该项目编译成可以独立运行的exe文件或者安装程序的话,可以参考我的这篇博文,里面有提到哦。