我正在尝试解决Blockworld问题的一个实例。基本上,NxN网格包含块A,B,C和代理。只有代理可以移动,如果遇到阻止,那么他们的位置将被切换。例如,代理(1,0)左边遇到块B(0,0),那么两个的新位置将是代理(0,0)和B(1,0)。
我的Agent和Block类都是Entity的子类。
这是我的函数swap()。它检查移动后,代理是否在一个块上,然后新的块位置将是代理的先前位置。
我尝试使用(块块:blockList)并且当我尝试使用多态时它可以工作,但不能使用(实体en:entityList)。
有人能发现我犯的错误吗?
public void swap() {
for (Entity en : entityList) {
if (agent.position.equals(block.position) && (en instanceof Block)) {
System.out.print("Agent overlap block: " + en);
en.previousPosition = new Dimension(block.position.width, block.position.height);
en.setPosition(agent.previousPosition);
}
}
}
答案 0 :(得分:1)
首先,你还没有告诉if语句中的“块”来自何处。 您可能需要做的是:
public void swap(){
for(Entity en:entityList){
if((en instanceof Block)&&(en.position.equals(agent.position)){
// ^here is "en" instead of block
System.out.println("Agent overlab block: "+en);
en.previousPosition=new Dimension(
en.position.width,
en.position.height);
en.setPosition(agent.previousPosition);
}
}
}
最后,您可以使用java.awt.Point而不是Dimension。 此外,您应该对字段“previousPosition”使用setter方法。
答案 1 :(得分:0)
您的问题是,如果agent.position
和block.position
相等,您的代码会执行操作;但在您谈到的示例中,agent.position
和block.position
是不同的。因此,您的代码实际上从未进行任何更改。
答案 2 :(得分:0)
您在函数中使用block
变量的任何地方都需要使用en
进行更改,因为您的for循环不再创建名为block
的变量。
当您在此功能中移动实体时,请注意不要意外尝试将代理与自身交换!