这个赋值的目的是创建一个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)
。这可以让你减少三个函数的数量(这意味着你不必在每个函数中修复三次错误),并且可以更容易地将程序扩展到五个或六个字段,成堆的黄金,炸弹,机器人等。它只是一个函数的参数