m0_64073443 2023-09-18 20:14 采纳率: 0%
浏览 15
已结题

关于韩顺平java坦克大战的子弹消除问题

在他写的paint方法里面,有一个if的判断,如果shot.isLive=true 就执行画子弹,如果是false就把子弹从Vector里面拿走。我的想法是如果子弹要被拿除,应该是子弹接触到坦克的时候,执行这段代码,所以我就跳转到hitTank方法里面,方法中写有如果击中坦克,那么执行s.islive=false。我的疑惑是,这里的s.islive和最上面的shot.islive不是一个东西啊,那程序是怎么执行paint方法里面的if判断的呢?

img

img

  • 写回答

14条回答 默认 最新

  • 疯狂小赤兔 2023-09-18 21:00
    关注
    获得7.50元问题酬金

    引用 皆我百晓生 小程序回复内容作答:
    程序执行paint方法里面的if判断是根据每个子弹对象的isLive属性来确定是否执行画子弹的操作。在hitTank方法中,当子弹击中坦克时,会将shot对象的isLive属性设置为false,之后在循环中遍历enemyTankshots列表,如果子弹的isLive属性为true,则执行画子弹的操作,否则移除该子弹。

    所以,虽然s.isLiveshot.isLive不是同一个变量,但通过在hitTank方法中修改s.isLive的值,可以影响到paint方法中的if判断,从而决定是否画出子弹。

    顺便吐槽下两个细节问题:

    img

    评论 编辑记录
    1人已打赏
  • 小明说Java 2023-09-18 20:58
    关注

    应该是的islive,都是从列表中获取的,但是paint方没看到 啊

    评论
  • 高大人在上 2023-09-18 21:01
    关注

    paint应该是每一帧都会执行的,因为子弹过一会儿就会移动一下,子弹被拿除有2个点,1是碰到坦克,1是超出距离或者超出屏幕。s和shot是一个东西,只是你下面这张图的子弹为什么挂在空坦克上,我看不明白。具体得看看这个数据存的方式

    评论
  • Leodong. 2023-09-18 21:08
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    根据您提供的截图,我们可以看到paint方法中的if判断语句是通过访问名为"shot"的变量来确定是否要画子弹或移除子弹。而在hitTank方法中,当子弹击中坦克时,设置了变量"s.isLive"为false。

    根据您的描述,"shot.isLive"和"s.isLive"不是同一个变量,这可能是由于在代码其他部分定义了多个相关的变量。为了确定具体情况,建议您检查代码的其他部分,特别是在paint方法之外的地方,查找是否存在名为"shot"的变量。

    如果"shot"变量确实在其他地方定义,并且与"s.isLive"变量没有关联,那么在hitTank方法中修改"s.isLive"的值不会直接影响到paint方法中的if判断。在这种情况下,您可能需要进一步修改代码,以确保在子弹击中坦克时正确地设置"shot.isLive"的值,以便在paint方法中进行适当的判断和处理。

    请注意,由于我无法直接查看完整的代码,以上只是根据您提供的信息给出的一般建议。如需更准确的帮助,请提供更多相关代码或详细说明。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    评论
  • 数据大魔王 2023-09-19 10:42
    关注

    存在两个不同的变量 s.isLive 和 shot.isLive,它们分别用于表示子弹的生存状态。程序中的 paint 方法中的 if 判断使用的是 shot.isLive,而 hitTank 方法中的 s.isLive 用于表示坦克的生存状态。

    这两个变量是不同的,因为它们分别用于不同的对象:shot 表示子弹对象,s 表示坦克对象。在游戏中,通常会有多个子弹和多辆坦克,每个子弹和坦克都有自己的生存状态。

    在 paint 方法中的 if 判断,用于检查是否要绘制子弹,是基于 shot.isLive 的值来做出的决定。如果 shot.isLive 为 true,则会执行绘制子弹的代码;如果 shot.isLive 为 false,则会将子弹从向量中移除,因此 paint 方法中的 if 与子弹的生存状态相关。

    在 hitTank 方法中,s.isLive 用于表示被击中的坦克的生存状态。当坦克被击中时,将 s.isLive 设置为 false,表示该坦克已经被摧毁。这是坦克的状态,与子弹的生存状态是不同的。

    评论
  • 全栈项目讲解 2023-09-19 12:54
    关注

    跟踪代码走一遍,要有全局的审视代码各个变量

    评论
  • coder_small_bell 2023-09-19 21:37
    关注

    从列表获取的把

    评论
  • yy64ll826 2023-09-20 17:54
    关注
    评论
  • 心梓知识 2023-09-21 01:40
    关注

    结合GPT给出回答如下请题主参考
    在韩顺平java坦克大战的代码中,可以在 Bullet 类中添加一个 hitTank(Tank tank) 方法来检查子弹是否击中坦克,然后在 GameClient 的 repaint() 方法中调用该方法来判断子弹是否击中。

    具体的代码实现如下:

    首先在 Bullet 类中添加一个 hitTank() 方法,其中传入的参数为要判断的坦克对象:

    public boolean hitTank(Tank tank) {
        if (this.isLive && this.getRect().intersects(tank.getRect()) && tank.isLive()) {
            this.isLive = false; // 子弹消失
            tank.setLive(false); // 坦克消失
            return true;
        }
        return false;
    }
    

    然后在 GameClient 的 repaint() 方法中添加以下代码:

    for (int i = 0; i < bullets.size(); i++) {
        Bullet b = bullets.get(i);
        if (!b.isLive()) {
            bullets.remove(b);
        } else {
            b.draw(g); // 画子弹
            // 遍历所有坦克,检查子弹是否击中坦克
            for (int j = 0; j < tanks.size(); j++) {
                Tank t = tanks.get(j);
                if (b.hitTank(t)) { // 判断子弹是否击中坦克
                    // 如果击中,从 Vector 中移除坦克和子弹
                    tanks.remove(t);
                    bullets.remove(b);
                    break;
                }
            }
        }
    }
    

    其中 b.hitTank(t) 调用了 Bullet 类中的 hitTank() 方法来检查子弹是否击中坦克,如果击中,则从 Vector 中移除坦克和子弹。

    评论
  • bug菌¹ Java领域优质创作者 2023-09-24 21:23
    关注

    该回答引用ChatGPT,希望对题主有所帮助,如有帮助,还望采纳。


    其实,这两个都是同一个变量。在韩顺平老师的代码中,子弹的属性和状态是由Shot类来维护的,而在hitTank方法中,传入的参数s就是Shot类的一个实例,s.isLive=false 就是改变了这个实例的属性值,也就是说,通过hitTank方法改变了Shot实例的状态,从而影响了paint方法中对应的画图操作。因此,paint中的if判断仍然可以正常执行。

    评论
  • 代码调试大神 2023-09-25 15:00
    关注

    需要进一步修改代码,以确保在子弹击中坦克时正确地设置"shot.isLive"的值

    评论
  • Minuw 2023-09-25 17:34
    关注

    参考gpt

    在韩顺平老师的代码中,shot 是子弹对象,isLive 是子弹的状态属性。当 isLivetrue 时,表示子弹仍然存在,需要绘制;当 isLivefalse 时,表示子弹已经击中了坦克或者超出了边界,需要将其从 Vector 中移除。

    paint 方法中,通过遍历 Vector 中的子弹对象,根据 isLive 的状态来决定是否绘制子弹。如果 isLivetrue,则绘制子弹;如果 isLivefalse,则将子弹从 Vector 中移除。

    而在 hitTank 方法中,当子弹击中坦克时,会将 isLive 设置为 false,表示子弹已经消失。这样,在下一次 paint 方法执行时,就会根据子弹的 isLive 状态来判断是否绘制子弹。

    所以,s.isLiveshot.isLive 是同一个东西,都表示子弹的状态属性。当子弹击中坦克时,通过修改 isLive 的值,来控制子弹是否绘制和移除。

    评论
  • 会跑的小鹿 2023-09-25 19:36
    关注

    通过变量来存储判断子弹的状态

    评论
  • GIS工具开发 2023-09-25 21:23
    关注

    在子弹击中坦克时,修改变量状态

    评论

报告相同问题?

问题事件

  • 系统已结题 9月26日
  • 赞助了问题酬金15元 9月18日
  • 创建了问题 9月18日

悬赏问题

  • ¥15 vue引入sdk后的回调问题
  • ¥15 求一个智能家居控制的代码
  • ¥15 ad软件 pcb布线pcb规则约束编辑器where the object matpcb布线pcb规则约束编辑器where the object matchs怎么没有+15v只有no net
  • ¥15 虚拟机vmnet8 nat模式可以ping通主机,主机也能ping通虚拟机,但是vmnet8一直未识别怎么解决,其次诊断结果就是默认网关不可用
  • ¥20 求各位能用我能理解的话回答超级简单的一些问题
  • ¥15 yolov5双目识别输出坐标代码报错
  • ¥15 这个代码有什么语法错误
  • ¥15 给予STM32按键中断与串口通信
  • ¥15 使用QT实现can通信
  • ¥15 关于sp验证的一些东西,求告知如何解决,