【日常篇】005_用Python制作《太空大战》

  继10月份在 《天文软件应用》 《自由上机》课程中完成《俄罗斯方块》后,本人决定进行下一项更为艰巨的挑战:设计一个空战游戏

  在还没有开始接触编程时,就有过想要写出一个飞机射击类游戏的想法,但当时对于不会编程的自己而言,这简直就是天方夜谭。转眼间,从大二接触C语言开始到现在,也已经码了三年的代码了。这一目标对于现在的自己而言,已不再是遥不可及,是时候去实现当年的愿望了

  本次程序依旧使用Python语言进行编写,并依旧以pygame库为主

前言

  本次的战线十分漫长,大概花费了一个多月共五六次的 《天文软件应用》 课程+两三个晚上的时间,由浅至深地实现了十一个小目标(即接下来提到的十一次迭代)。下面将会以时间顺序,从第一次迭代开始,来简要地回顾整个编写历程

第一次迭代

目标

  相应的图像能够显示在屏幕上

  按方向键可以向相应的方向移动,触碰到边界时无法继续移动

实现过程

在这里插入图片描述

  作为最开始的小目标,只需要将玩家的飞机显示在屏幕上,并能够根据按键的响应四处移动即可。由此设计出三个类:玩家(Player)类、游戏场景(Stage)类与图像展示(Display)类。玩家类存储玩家的各种信息,游戏场景类存储游戏的状况,场景中都有哪些事物,而图像展示类则用于将游戏场景类中的情形用图形界面表示出来

  每一帧刷新的时候,就会处理键盘响应与玩家的移动,同时判断玩家的移动是否合法,如果不合法则无法完成本次移动。这样一来,玩家在场景内移动的规则就设定好了。再由图像展示类将玩家的位置在背景上显示出来,就完成了第一次迭代的目标

第二次迭代

目标

  按K键发射子弹,且设置子弹发射的最短时间间隔

实现过程

在这里插入图片描述

  第二次迭代在第一次迭代的基础上引入了子弹发射系统。由此联想到需要新增子弹类(PlayerBullet)以及玩家发射子弹、子弹在场景中更新状态、子弹图像显示的相应方法

  考虑到后期,玩家的子弹和敌人的子弹会有所区别,故在此设计子弹的基类(BaseBullet),后续制作的敌人的子弹也将会继承自这里

  对于玩家发射子弹的操作,如何实现最短发射时间间隔的限制?我的解决方案是:给玩家分配最近一次发射时间(lastTimeFired)这一成员

  因为内容实在是太多了,加上隔了也有一定的时间了,因此后面直接贴出当时的简要记录:

第三次迭代

目标

  设置1血敌人

  敌人被命中后直接消失

  敌人会左右移动,同时不断前进

在这里插入图片描述

第四次迭代

目标

  敌人会发射子弹,且设置发射时间间隔,固定时间发射

  玩家设置血量,命中玩家后扣除相应血量

  玩家血条显示

在这里插入图片描述

第五次迭代

目标

  子弹命中后会有爆炸的动画效果

在这里插入图片描述

第六次迭代

目标

  新增敌人种类

双排战士——DoubleWarrior

  血量中,一次连排发射两个子弹,径直纵向移动,移动速度低,射击速度中等,防御力中

三线射手——TripleShooter

  血量低,一次向三个方向发射子弹,径直纵向移动,移动速度中等,射击速度低

在这里插入图片描述

第七次迭代

目标

  使用外置文件设定敌人的出场模式

  BOSS战,所有敌机不继续刷新

文件格式

  采用json格式:

{
    "enemies" : [
        {
            "className" : "敌人1的类名",
            "appearBy" : "出场依据:timeInterval——根据时间间隔",
            "appearMode" : "出场位置:random——随机位置|fix——固定位置",
            "mu" : "时间间隔的均值,仅在time依据下使用",
            "std" : "时间间隔的标准差,仅在time依据下使用",
            "posX" : "出场位置的X轴,仅在fix位置下使用"
        },
        {
            "className" : "敌人2的类名",
            ......
        }
    ]
}

在这里插入图片描述

第八次迭代

目标

  增加道具掉落

  击败不同类型敌机时,有不同的概率掉落道具

  击败BOSS时,掉落多个道具

回血

  提升50血量

  掉落权重10

增加血量上限

  提升血量上限25

  掉落权重2

火力加强

  提高射速(每秒的次数+1)

  掉落权重5

攻击加强

  攻击力提升2

  掉落权重2

防御加强

  防御力提升1

  掉落权重2

在这里插入图片描述

第九次迭代

目标

  完善BOSS战

  BOSS战期间,BOSS血条显示

  BOSS死亡后,重设时间戳到BOSS出现前,以解决BOSS接连出现的问题

  在等间隔出场的基础上,设置第一次出场时间

在这里插入图片描述

第十次迭代

目标

  设计更多的BOSS,并不局限于一般的移动模式

冲锋者——Sticker

  发射5连并排霰弹,5秒随机横向移动模式+3秒向前突刺模式+2秒复位模式

跟踪者——Tracker

  位置上不断接近玩家,子弹对着玩家射

风车——Windmiller

  在中心矩形路线移动,并旋转着向四个方向发射子弹

钛战机(Vader)——TieVader

  8秒横向移动,2秒追踪玩家

歼星舰——StarDestroyer

  本体只能左右移动,但却可以不断地放出普通钛战机对玩家进行攻击

  本体也能发射爆能束,且攻击力极高

普通钛战机——Tie

  斜着飞行,发射爆能束,攻击力中偏高,血量中,速度快,射速高 (命中低)

  对应地,让玩家也能在后期使用爆能束,增加一项让玩家获得爆能束的道具

死星——DeathStar

  最终BOSS,爆能束的发射位置是随机的,并且可以随时放出各种类型的敌机,一次放出1——3架

  有两种爆能束可以发射,一种是普通的红色,另一种是能够摧毁行星的绿色

在这里插入图片描述

第十一次迭代

目标

提高平衡性

  玩家子弹最多能变为三排并发

  每打完一个BOSS,都会提升敌人的属性:

  攻击+20%

  防御+20%

  血量+20%

  开火间隔时间-15%,下限50

打开碰撞箱快捷键

  按b打开碰撞箱

增加分数系统

  命中敌人时,按敌人扣血量加分,Game Over时游戏继续,但在命令行显示分数

增加暂停系统

  按p键暂停,画面静止

优化界面

  在血条左侧显示玩家飞机图标

血量数值显示

  按h键开启血量数值显示

在这里插入图片描述

最终效果展示

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  视频展示:http://home.ustc.edu.cn/~caimx/video/SkyWars_Video.mp4

总结

  本次代码的编写过程整体还算顺利,基本上每一两个小时都能完成一次迭代。但从逻辑与画面的分离这个方面来讲,还是做的很不好。游戏的逻辑部分应该尽量由逻辑模块实现,而不是交给画面显示模块去做。这一点在后续的扫雷中倒是得到了很大程度的改善

代码链接

  https://github.com/VtaSkywalker/20211028_001_SkyWars

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值