【问题标题】:Can anyone lend a fresh pair of eyes for debugging?任何人都可以借一双新的眼睛进行调试吗?
【发布时间】:2011-11-15 10:47:11
【问题描述】:

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

单场对象仅限于从 (0, 0) 到 (50, 50) 的正方形点,并且包含 3 块金子和 3 颗炸弹。

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

机器人被用户输入放置的炸弹摧毁。一旦收集到黄金,它就不能被另一个机器人捡起,而且一个炸弹爆炸了它就不会再这样做了。

到目前为止,这是我解决问题的尝试,我将继续努力,但希望能有第二双眼睛看到我遗漏的东西。程序可以编译,但是炸弹和金币没有被正确“找到”,输出表明后面的机器人和前面的机器人死在同一个炸弹上。此外,cmets 删除了几段代码,我这样做是为了测试程序的不同部分。我认为这部分是我遇到麻烦的地方。方法 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());
    /*gotBomb1 = field.alreadyBombed1();
    gotBomb2 = field.alreadyBombed2();
    gotBomb3 = field.alreadyBombed3();
    gotGold1 = field.alreadyFound1();
    gotGold2 = field.alreadyFound2();
    gotGold3 = field.alreadyFound3();*/

    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;} 
}

【问题讨论】:

  • 代码审查只针对工作代码。如果您希望在代码运行后将其带回代码审查以进一步改进,请随时将其带回。

标签: java


【解决方案1】:

我没有看到你在哪里设置了炸弹爆炸,所以从我在这里看到的情况来看,你错过了那部分。

下面是重新格式化和稍微重组的代码:我发现代码很难按原样使用。使用这个更短、更规范且 IMO 更具交流性的版本可能会更容易。

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());
    /*gotBomb1 = field.alreadyBombed1();
   gotBomb2 = field.alreadyBombed2();
   gotBomb3 = field.alreadyBombed3();
   gotGold1 = field.alreadyFound1();
   gotGold2 = field.alreadyFound2();
   gotGold3 = field.alreadyFound3();*/

    if (foundGold1 && !field.alreadyFound1()) {
        robot2.addGold();
        field.foundGold1();
    }

    if (foundGold2 && !field.alreadyFound2()) {
        robot2.addGold();
        field.foundGold2();
    }

    if (foundGold3 && !field.alreadyFound3()) {
        robot2.addGold();
        field.foundGold3();
    }

    if (foundBomb1 && !field.alreadyBombed1()) {
        alive2 = false;
    }

    if (foundBomb2 && !field.alreadyBombed2()) {
        alive2 = false;
    }

    if (foundBomb3 && !field.alreadyBombed3()) {
        alive2 = false;
    }

    y = y + 1;
    robot2.setLocation(x, y);

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

您还可能会因完成这项工作所需的代码量而受阻:我假设您的 robot1robot2 的代码基本相同,唯一的区别是您当前正在处理的机器人。

与其重复代码,不如考虑将currentRobot 传递给单个方法。有多种方法可以处理此类问题,但这与您已经完成的工作非常吻合。您可能希望将 isAlive 方法/属性添加到机器人类。

【讨论】:

  • 是的,简化和重构以减少错误! 1+
猜你喜欢
  • 2019-05-26
  • 2021-06-24
  • 2016-04-29
  • 2012-10-19
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
相关资源
最近更新 更多