我正在尝试编写一个错误,以便在附加到自定义Room对象的数组周围移动,同时保持对每个图块被踩踏次数的计数。
Room对象以及移动和计数均正常工作。但是,错误的bugX
和bugY
的坐标在退出0
方法后以某种方式恢复为nextMove
。它们的值仅在退出方法时恢复;甚至nextMove
方法本身的最后一行代码都使用它们的新值。
该方法的相关部分已附加,但可以根据要求添加其他部分。
if (dirNum == 0 && bugY < length-1) //Move up
bugY++;
else if (dirNum == 1 && bugX < width-1) //Move right
bugX++;
else if (dirNum == 2 && bugY > 0) //Move down
bugY--;
else if (dirNum == 3 && bugX > 0) //Move left
bugX--;
else {
System.out.println("Error: Cannot move " + direction + ".");
canMove = false;
dirNum = generator.nextInt(4);
continue;
}
这是命令本身的上下文。
while (endSim == false) {
nextMove(bugX, bugY);
System.out.print(room.printRoom() + "\n\nNext move? (y/n) ");
simSentinel = in.next();
if (simSentinel.charAt(0) == 'n')
endSim = true;
}
分配起始坐标的声明不在任何循环内,更不用说调用变量本身了。
答案 0 :(得分:1)
问题是@ T.J.Crowder在回答中描述的问题,尽管适用于Java。
在Java中作为参数传递的变量按值传递。如果通过接收参数的方法更改了值,则更改仅影响该方法内部的值。 “外部”值不变。
您可以做的是将坐标封装在一个对象中,然后将封装的对象作为参数传递。 然后,该方法将按值接收对象,并更改其状态(而不是对象的值)。
更深入的了解,请参见this question
编辑我:
我稍微整理了一下代码。尽管缺少room
和simSentinel
的声明,但是如果添加,则应该有一个正在运行的示例。
public class Bug{
public int x=0;
public int y=0;
}
public class SimpleSim {
private int dirNum = 0;
private int length = 20;
private int width = 20;
private boolean canMove = true;
private Random generator = new Random();
private boolean endSim = false;
public static void main(String [] args) {
SimpleSim simpleSim = new SimpleSim();
simpleSim.start();
}
private void start() {
Bug myBug = new Bug();
// Give the bug some initial x, y values.
myBug.x = 0;
myBug.y = 0;
while (endSim == false) {
nextMove(myBug);
System.out.print(room.printRoom() + "\n\nNext move? (y/n) ");
simSentinel = in.next();
if (simSentinel.charAt(0) == 'n')
endSim = true;
}
}
}
public void nextMove(Bug bug){
if (dirNum == 0 && bug.y < length-1) //Move up
bug.y++;
else if (dirNum == 1 && bug.x < width-1) //Move right
bug.x++;
else if (dirNum == 2 && bug.y > 0) //Move down
bug.y--;
else if (dirNum == 3 && bug.x > 0) //Move left
bug.x--;
else {
System.out.println("Error: Cannot move " + "?" + ".");
canMove = false;
dirNum = generator.nextInt(4);
}
}
}
答案 1 :(得分:0)
似乎您正在按值传递bugX
和bugY
参数。在这种情况下,更改方法内部的值不会影响方法外部的值。
您可能希望使计算后的nextMove方法返回bugX
和bugY
的新值,以便可以将它们重新收集到实际的bugX
和bugY
变量中