Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 我需要一双新眼睛来调试_Debugging - Fatal编程技术网

Debugging 我需要一双新眼睛来调试

Debugging 我需要一双新眼睛来调试,debugging,Debugging,本作业的目的是创建一个Field和Robot类以及这些类的对象 单场对象限制为(0,0)到(50,50)点的平方,包含3块黄金和3枚炸弹 三个机器人对象(一个接一个)从左到右(0,0)到(0,50)搜索黄金,然后下降穿过区域(1,0)到1,50),依此类推 机器人被炸弹摧毁,炸弹是用户输入的地方。一旦收集到黄金,另一个机器人就无法将其捡起来,一个炸弹爆炸后,它就不会再这样做了 到目前为止,这是我解决问题的尝试,我仍在继续努力,但如果能有第二双眼睛盯着它看,我会很感激的。该程序进行了编译,但炸弹和

本作业的目的是创建一个Field和Robot类以及这些类的对象

单场对象限制为(0,0)到(50,50)点的平方,包含3块黄金和3枚炸弹

三个机器人对象(一个接一个)从左到右(0,0)到(0,50)搜索黄金,然后下降穿过区域(1,0)到1,50),依此类推

机器人被炸弹摧毁,炸弹是用户输入的地方。一旦收集到黄金,另一个机器人就无法将其捡起来,一个炸弹爆炸后,它就不会再这样做了

到目前为止,这是我解决问题的尝试,我仍在继续努力,但如果能有第二双眼睛盯着它看,我会很感激的。该程序进行了编译,但炸弹和黄金没有被正确“找到”,输出表明,以下机器人与之前的机器人死于同一枚炸弹上。此外,还有一些代码被注释删除,我这样做是为了测试程序的不同部分。我想这部分是我遇到麻烦的地方。方法field.alreadyFound()和field.alreadyBombed()返回一个值为true的布尔值。我的if声明应该说如果黄金/炸弹已经被发现,忽略它

while(x <= 50 && y <= 50 && alive2 == true)
{   foundGold1 = robot2.look(field.locateGold1());
    foundGold2 = robot2.look(field.locateGold2());
    foundGold3 = robot2.look(field.locateGold3());
    foundBomb1 = robot2.look(field.locateBomb1()); 
    foundBomb2 = robot2.look(field.locateBomb2());
    foundBomb3 = robot2.look(field.locateBomb3());

    if (foundGold1 == true)
    {
        if (field.alreadyFound1() == true) 
        { 
        }
        else
        {
            robot2.addGold();
            field.foundGold1();
        }
    }
    if (foundGold2 == true)
    {
        if (field.alreadyFound2() == true) 
        { 
        }
        else
        {
            robot2.addGold();
            field.foundGold2();
        }
    }
    if (foundGold3 == true)
    {
        if (field.alreadyFound3() == true) 
        { 
        }
        else
        {
            robot2.addGold();
            field.foundGold3();
        }
    }
    if (foundBomb1 == true)
    {
        if (field.alreadyBombed1() == true)
        {
        }
        else
        {
            alive2 = false;
        }
    }
    if (foundBomb2 == true)
    {
        if (field.alreadyBombed2() == true)
        {
        }
        else
        {
            alive2 = false;
        }
    }
    if (foundBomb3 == true)
    {
        if (field.alreadyBombed3() == true)
        {
        }
        else
        {
            alive2 = false;
        }
    }
    y = y + 1;
    robot2.setLocation(x, y);
    //System.out.println(y);

    if (y == 50)
    {
        x = x + 1;
        y = 0;
    }    

while(x这里有太多未解释的逻辑,无法确切知道程序失败的原因

然而,只有一些想法、建议和评论可以帮助你解决问题

  • 利用开/闭括号,年轻的程序员经常陷入尽可能多地缩小他们的代码的过程中(看,我是用2行代码而不是3行代码完成的)
  • 您不需要检查布尔变量是否==true/false。您可以简单地说
    if(foundGold1)
    或者如果您想查看它是否为false,您可以说
    if(!foundGold1)
那些话说,

问题其实可以归结为你似乎有一套逻辑,其中包括

  • foundGold1,foundGold2,foundGold3
  • 机器人2(是否有机器人1和机器人3)
  • foundBomb1,foundBomb2,foundBomb3
  • alive2(是否存在alive1和alive3)

您可以将这些存储在阵列中,以真正减少必要的检查,但我认为这在某种程度上取决于您没有透露的一些细节。

我可以看到一个潜在问题,尽管它可能与您的问题无关


我认为,如果一个机器人撞上炸弹,它应该无法继续并引爆另一颗炸弹。我认为,你的代码可能允许一个机器人引爆所有三颗炸弹。

我认为你的一些代码有点过于冗长和模糊,无法让你了解到底发生了什么。请看下面这一小部分:

if (foundGold1 == true)
{
    if (field.alreadyFound1() == true) 
    { 
    }
    else
    {
        robot2.addGold();
        field.foundGold1();
    }
}
可以这样写:

if (foundGold1) {
    if (! field.alreadyFound1()) {
        robot2.addGold();
        field.foundGold1();
    }
}
根据此代码随时间“增长”的方式,您可能希望进一步简化它:

if (foundGold1 && ! field.alreadyFound1()) {
    robot2.addGold();
    field.foundGold1();
}
请注意Matthew Cox的警告:年轻的程序员经常被困在尽可能多地缩小他们的代码中(看,我是用两行代码而不是三行代码完成的!)--我不赞成重新格式化的布局,因为它更小,但因为我相信它更容易阅读。根据未来代码的复杂性,我可能会给出完全相反的建议来分解条件。首要任务是编写易读的代码。(编译器几乎可以计算出你对它抛出的任何东西——你也必须能够理解它。)

他进一步建议为
foundBomb[]
foundGold[]
robot[]
等使用数组,这是一个极好的建议——最好与使用函数参数搭配使用,而不是编写多个函数


不要使用
field.alreadyFound1()
field.alreadyFound2()
等,尝试:
field.alreadyFound(int something)
——调用它们时,它将是
field.alreadyFound(2)
。这样可以将函数数量减少三个(这意味着不必在每个函数中修复三次错误)使程序更容易扩展到五个或六个字段、成堆的黄金、炸弹、机器人等。这只是一个函数的参数。

即使在那里,您也可能会得到更好的结果,但是,您可能希望尽可能缩小这堵代码墙,以便更离散地表示您正在尝试执行的操作。请正确设置代码格式我们可以读easily@user1043550自由编辑你的代码,这样你就可以看到如何更有效地格式化它。再次尝试调试你的问题,如果解决方案现在对你来说更明显,我不会感到惊讶。最糟糕的。标题。永远。标题需要是个问题!哦,看起来证券交易所评论纳粹分子就是她e、 哈,我认为这里的开/闭括号太多了。@Sarnold可能有。.他有if检查,但什么也做不了(虽然这可能是有效的,但通常有更好的方法)…逻辑肯定需要重新设置,但这与其说是打开/关闭的数量的问题,不如说是不必要的检查。嗯,我已经编程10多年了,我仍然尽可能多地使用一行,除非行太长,需要换行到下一行,以便我可以一次看到所有内容。有有些例外情况是,用3行中的2行会适得其反或变得难以理解,但总的来说,我总是尽量让它简洁,只要它仍然可以理解。我讨厌花括号。我尽可能省略它们。我甚至没有想到要分析逻辑,但你是对的。然而,一个机器人应该ld如果它有HP或其他类型的生命计数器&一颗炸弹造成的伤害不足以杀死它。同样,没有足够的细节来真正确定。你不需要检查你的逻辑思考。机器人只是在寻找一块金子…而不是1/2/3。它甚至不需要知道那里有什么