我需要一双新眼睛进行调试

时间:2011-11-15 00:04:56

标签: debugging

这个赋值的目的是创建一个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;
    }    

3 个答案:

答案 0 :(得分:1)

这里有太多未解释的逻辑,以确切知道你的程序失败的原因。

然而,只是一些有助于解决问题的想法,建议和评论。

  • 利用Open / Close括号,年轻的程序员经常会尽可能地尽量缩小他们的代码(看看我用2行代码而不是3行代码)!
  • 您不需要检查布尔变量是否为== true / false。您可以简单地说if (foundGold1)或者如果您想查看它是否为假if (!foundGold1)

那些事情说,

问题实际上归结为你似乎有一套逻辑包括

之类的东西
  • foundGold1,foundGold2,foundGold3
  • robot2(有机器人1和机器人3)?
  • foundBomb1,foundBomb2,foundBomb3
  • alive2(还有一个alive1和alive3)?

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

答案 1 :(得分:1)

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

我认为,如果一个机器人击中一枚炸弹,它就不能继续并引爆另一枚炸弹。你的代码可能允许一个机器人引发我认为的所有三枚炸弹。

答案 2 :(得分:0)

我认为你的一些代码有点过于冗长和蓬松,让你看到真正发生的事情。拿这个小部分:

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的警告:年轻的程序员经常会尽可能地尝试缩小他们的代码(看看我用2行代码代替3代!) - - 我不是在争论重新格式化的布局,因为它更小但是因为我相信这更容易阅读。根据未来代码的复杂性,我可能会提出完全相反的建议来分解条件。首要任务是编写清晰的代码。 (编译器几乎可以找出你抛出的任何东西 - 也必须能够理解它。)

他为foundBomb[]foundGold[]robot[]等使用数组的进一步建议非常棒 - 最好与使用函数参数配对编写多种功能。

而不是field.alreadyFound1()field.alreadyFound2()等,请尝试:field.alreadyFound(int something) - 当您调用它们时,它将是field.alreadyFound(2)。这使您可以将函数数减少三个(这意味着您不必在每个函数中修复三次错误),并且可以更轻松地将程序扩展到五六个字段,成堆的金币,炸弹,机器人等那它只是一个函数的参数。