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