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

news/2025/1/15 7:50:02/

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键发射子弹。同时该项目实现了游戏时的暂停和继续功能以及排行榜功能,记录历史最好游戏成绩。敌方飞机有三种类型,大小、攻击力、移动速度各不相同,当然击杀获得的奖励也有差异。下图为敌机类型二系列图片:
敌机类型二系列图片

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_imgself.rect = self.image.get_rect()self.rect.midbottom = init_posself.speed = 10  # 子弹速度self.damage = 1# 子弹移动def move(self):self.rect.top -= self.speeddef 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游戏开始界面:

4.2破纪录界面显示:

4.3排行榜功能:

5. 不足和改进

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


http://www.ppmy.cn/news/377723.html

相关文章

史上最清晰的雷霆战机游戏开发全过程(基于java,素材和源码均齐全)

前情提要 此次咕咕为大家准备了雷霆战机游戏开发的全过程,我将整个开发都写在了文档中,有图有真相,步步到位,供大家进行细节功能实现上的参考,除此之外,游戏所需的图片与音乐素材、逻辑脑图都一 一放在了文…

【Canvas】童年玩过的雷霆战机你还记得吗?

按键机的年代,想必大家都玩过类似雷电,雷霆战机之类的飞行射击类游戏吧,今天我就试着用canvas来还原一下游戏场景。 素材准备 还原场景的第一步是准备素材,首先我们需要一架雷霆战机,经过九牛二虎之力,我…

前端案例:飞机大战( js+dom 操作,代码完整,附图片素材)

目录 一、案例效果 二、实现思路 三、完整代码详细注释 四、涉及要点 五、案例素材 一、案例效果 二、实现思路 创建游戏背景板;创建我方战机,鼠标进入游戏面板后其随鼠标轨迹运动; onmousemove创建子弹,让子弹周期性的在战…

飞机大战——图文详解

文章目录 1.前言2.效果展示3.图片素材的准备4.需要构建的函数5.变量的定义6.数据的初始化7.画面的呈现8.飞机移动的实现9.子弹的构建和移动9.1子弹的构建9.2子弹的移动 10.敌机的创建和移动11.敌机消灭函数12.结束语13.完整代码14.内容更新 1.前言 本次需要用到easyx图形库&am…

自动化运维工具—Ansible

一、Ansible概述 1.1 Ansible是什么 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。 Ansible能批量配…

MySQL索引:让你的数据库查询快到起飞!

💕世界上最美好的东西之一,就是你每天都有机会开始全新的一天。💕 🐼作者:不能再留遗憾了🐼 🎆专栏:MySQL学习🎆 🚗本文章主要内容:详细介绍如何查…

中国联通 光猫 吉比特 G-140W-UG 管理员 账号密码

账号:cuadmin 密码:cuadmin (均是小写)

EZStation如何登陆云端账号、密码?

Q: EZStation如何登陆云端账号、密码? A:点击【设备管理】-【云端设备】 ,用户名、密码使用自己注册的云端账号、密码进行登陆即可。