友情提示:380元/半年,儿童学编程,就上码丁实验室。
各位小伙伴大家好:
上期我们实现了英雄的捡枪和安装子弹的功能,本期我们来实现后面的功能。逻辑上有点复杂,会有点绕。如果你是初学者,可能需要一些时间去理解各个类之间的互相调用。
首先我们接着来实现安装弹夹的功能:
英雄调用安装弹夹方法如图:
安装弹夹需要两个参数,一个是目标枪,一个是弹夹。
安装弹夹这个动作虽然是人发出的,但保存弹夹这个功能还得枪来实现。
所以在英雄类中调用了枪类中的保存方法(save保存方法定义在枪类中)
到目前为止人、枪、弹夹、子弹都有了,我们先来做一个小小的测试,看看各个功能是否能正常使用。
有一种测试方法就是“print”,也就是在需要检测的代码后面加一行打印信息,如果打印成功则表示程序正常运行。
一起来看看吧!
这里我们分别在英雄捡枪、保存子弹、弹夹安装这几处增加了测试行代码。
所增加的测试信息都打印成功,表示程序运行正常,这当然是我已经调试过的,大家伙自己也可以去试试。
下面就是本期的重点内容,也是整个程序逻辑上最复杂的一部分了。
接下来我们就一起来完善英雄开枪射击的功能:
对,就是这个功能。这个方法是由英雄发出的,所以由英雄调用。
现在我们回到英雄类中去定义这个射击方法,大家应该还记得英雄类中有个属性gun,它保存英雄的枪的信息。
具体的设计过程是英雄扣动扳机,就相当于告诉枪:你可以发射子弹了。
也就是说当英雄调用shoot方法的时候,并不能让子弹射出去。真正发射子弹的是枪,所以还需要进一步调用枪类中的发射子弹方法也就是fire()。
那么这个方法在哪呢?在枪类中,接下来就是到枪类中去调用fire方法。
下面我们就进入枪类,去调用fire方法让枪类发射子弹。
定义如下图:
接下来枪就开始发射子弹了,可子弹在哪呢?——还在弹夹中。
于是我们还得再进入弹夹类中去获取子弹,也就是程序的第34行。
还能怎么办呢?继续找弹夹呗。
于是乎,我们又在弹夹中定义了一个弹出子弹类out_bullet,它的定义如下:
是的,结果返回的是一个子弹的引用,在正常调用第43行后,上面的第34中的bullet就指向了一颗子弹,也就是说枪拿到了一颗子弹。
好了现在终于有子弹了,接下就是让子弹飞出去伤害敌人。
因为让敌人受伤害的是子弹,所以子弹还需要一个让敌人受伤的功能。
于是就有了子弹类中的第41行,hurt方法的定义。
具体怎么掉血呢?看第42行又回到了英雄类——调用英雄类中的loss_blood方法。
也就是说真正让敌人血量降低的是英雄类中的方法。
兜兜转转一大圈,又回到了英雄类。
最后来看一下运行结果:
亚瑟开枪,小兵掉血,运行成功。
开枪射击这个程序相对比较复杂,初学者或许较难理解。
下面是整个亚瑟开枪的大体流程:
1、英雄调用shoot方法(扣动扳机)告诉枪射击fire。
2、程序接到shoot指令后进入枪类中调用fire方法,告诉弹夹弹出一颗子弹,上图41行。
3、程序接到弹出子弹指令后,进入弹夹类调用out_bullet方法弹出子弹,并将子弹的引用返回给枪,接着回到枪类中(上图第43行)
4、枪在得到子弹后,进入子弹类调用hurt方法,让子弹击发(上图第36行)
5、子弹完成击发,进入英雄类调用loss_blood方法敌人产生伤害掉血(上图第22行)。
是不是有点绕,下面是完整代码,大家自己去琢磨琢磨吧。
本期就为大家分享到这里,为我们下期再聊。
转自公众号:
高维数学