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



这个赋值的目的是创建一个Field和Robot类以及这些类的对象。

单个字段对象被限制在(0,0)到(50,50)点的正方形内,并包含3枚金币和3枚炸弹。

三个机器人对象从左到右(0,0)到(0,50)依次搜索区域寻找金子,然后下降穿过区域(1,0)到1,50),以此类推。

机器人被炸弹摧毁,炸弹是由用户输入放置的。一旦金币被收集起来,它就不能被另一个机器人捡起来,如果炸弹爆炸了,它就不会再这样做了。

这是我迄今为止解决这个问题的尝试,我还在继续努力,但我希望能有第二双眼睛来发现我遗漏的东西。程序可以编译,但是炸弹和金币没有被正确地"找到",并且输出表明后面的机器人和之前的机器人死于相同的炸弹。此外,有几段代码被注释删除了,我这样做是为了测试程序的不同部分。我想这部分是我遇到麻烦的地方。方法field.alreadyFound()和field. alreadybomber()返回值为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;
    }    

这里有太多无法解释的逻辑,无法确切地知道程序失败的原因。

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

  • 使用开/闭括号,年轻的程序员经常会试图尽可能地减少他们的代码(看,我用了2行代码而不是3行)!
  • 您不需要检查布尔变量是否== true/false。你可以简单地输入if (foundGold1) OR如果你想知道它是否为假你可以输入if (!foundGold1)

那些话,

问题归结为你似乎有一组逻辑,其中包括

  • foundGold1, foundGold2, foundGold3
  • robot2(有一个robot1和robot3)?
  • 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的警告:年轻的程序员经常会试图尽可能地缩小他们的代码(看,我用了2行代码而不是3行!)——我不是在争论重新格式化的布局,因为它更小,而是因为我相信这更容易阅读。根据未来代码的复杂性,我可能会给出完全相反的建议来分解条件。最重要的是编写易读的代码。(编译器几乎可以找出你扔给它的任何东西——也必须能够理解它。)

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

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

最新更新