坦克发射多颗子弹思路[java坦克大战]

目前问题:我方坦克发射出一颗子弹后,再次发射一颗子弹,那上一颗子弹就会凭空消失。

问题原因:在Hero类中,只有一个属性Shot shot = null;即只有一颗子弹。按下J键创建一颗新的子弹,那么原先的子弹就变成一个垃圾。,绘制的时候也绘制的是新的子弹。

1.我方坦克在发射的子弹消亡后,才能发射新的子弹

在按下J键后,立即判断子弹对象是否还存在,若不存在才能触发射击方法从而创建新的子弹
(注意:判断我方子弹是否还存在时,不能单纯的只用if语句判断子弹的isLive是ture或false,因为发射子弹前,子弹对象还没有创建,会抛出空指针异常,所以应该是 判断我方子弹对象是否还存在 或者 子弹的isLive是否为false)。子弹线程消亡并不表示子弹对象为空

2.扩展为我方坦克可以发射多颗子弹,发射出的子弹并不会消失

把发射出的子弹都放入集合
把新创建的shot放入到shots中
绘制发射的子弹时,绘制集合里的所有子弹。先从集合中取出,再判断该子弹对象是否为空并且是否存活。若不满足任一条件就从集合中删除,都满足则绘制该子弹。
按下J键时直接调用射击敌人坦克方法,不需要设置限制为只发射一颗子弹

3.控制面板上最多只有5颗我方子弹

老师的方法:在我的坦克射击方法内,如果子弹集合的元素个数等于5了,就直接return退出该方法。否则程序继续,创建新的子弹。

我的方法:在按下J键后,立即if判断子弹集合元素个数是否小于等于5再决定是否调用射击方法。
if (hero.shots.size() <= 5) {
hero.shotEnemyTank();
}
先说结论,我的方法是错误的
问题一:子弹可以一次射出6颗子弹。
原因是:因为当第一次按下j键时,shots集合的元素个数为0,满足if条件(0<=5)。(为什么为0?因为先判断的是集合元素个数是否满足条件,满足后才会调用射击方法创建子弹,然后将子弹加入到集合)所以会if语句会满足6次(0,1,2,3,4,5),调用6次射击方法,创建6颗子弹。
问题二:6颗子弹全部消失后,才能继续发射子弹。(需求应该是面板上的子弹少于限制的个数后就可以继续发射)
我将方法换为老师的方法进行测试过后发现也是错的。于是我对代码进行了对比发现:
在这里插入图片描述
问题就出现这两段代码,亮的是老师的代码,注销的是我的,老师的代码是对的。乍一看两段代码没有问题
但其实细看在if条件判断时,应该调的是当前取出的shot对象的isLive(shot.isLive),而我调的却是 我的坦克的子弹的isLive(hero.shot.isLive)。这两种为何方式为何第二种不行呢?

现在做两次测试:

测试1:

在这里插入图片描述

在这里插入图片描述

测试2:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

分析得出结论:

测试1shot.isLive调用时,子弹射出射出面板范围外后,shot.isLive调用的是false
测试2hero.shot.isLive调用时,子弹射出射出面板范围外后,hero.shot.isLive调用的不是false
那么测试2为什么最后所有子弹销毁之后就从集合中删除了呢?
每当按下J时,shot对象就会创建,但是当用我的坦克调shot时,就会让当前的shot引用指向一个新的shot对象,即调到的是最新创建的shot对象数据,即调的是最后一次发射的子弹的属性。
当子弹到达5个时,不再创建新的shot对象,因为shot集合到达五个会直接返回不再创建。当开始有子弹出去后,isLive会被置为false,但当前的shot对象的isLive不会被影响,被置为false的isLive是已经创建了的对象的属性,他更改它的,不影响最后一颗子弹的isLive。因为当前shot引用指向的是最新的对象,即发射的最后一颗子弹对象,直到最后一颗子弹也出去,当前对象的isLive才会被改为false,所以hero.shot.isLive才会调到false;并且循环调当前对象 子弹集合元素个数(加入了发射的5颗子弹) 次的false
在这里插入图片描述
而shot.isLive调的是我方坦克每个子弹的isLive。当程序检测到子弹射出面板时立即将isLive置为false,并且从集合中删除,此时就可以再发射一颗子弹,从而一直保持面板上少于5颗子弹时就可以继续发射子弹。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又见明月清风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值