我试图用Union Find创建一个迷宫,但我无法移除墙壁。 这就是我到目前为止所做的。
private void createMaze (int cells, Graphics g) {
s = new int[cells*cells]; //No unions yet setting all to -1
for(int i = 0; i < cells*cells; ++i){
s[i] = -1;
}
g.setColor(Color.yellow);
random = new Random();
while(breaker){
g.setColor(Color.yellow);
int innerWall = random.nextInt(4)+0;
int randomCellX = random.nextInt(cells-1)+0;
int randomCellY = random.nextInt(cells)+0;
if(randomCellX==cells&&innerWall==2||
randomCellX==0&&innerWall==0||
randomCellY==cells-1&&innerWall==3||
randomCellY==0&&innerWall==1){
continue;
}
else{
int location = randomCellX+(randomCellY*cells);
int neighbour = 0;
if(innerWall==0){
neighbour =location-1;
}
else if(innerWall==1){
neighbour =location-cells;
}
else if(innerWall==2){
neighbour =location+1;
}
else if(innerWall==3){
neighbour =location+cells;
}
int locationRoot =find(location);
int neighbourRoot =find(neighbour);
if(locationRoot==neighbourRoot){
breaker = checkIfDone(s);
}
union(location,neighbour);
drawWall(randomCellX,randomCellY,innerWall,g);
}
}
}
如果我删除
if(randomCellX==cells&&innerWall==2||
randomCellX==0&&innerWall==0||
randomCellY==cells-1&&innerWall==3||
randomCellY==0&&innerWall==1){
continue;
}
它会删除细线,但添加时不会移除墙。该方法被调用,但没有做任何事情。
答案 0 :(得分:0)
似乎有些逻辑上的错误显而易见。但由于你没有给出你所做的逻辑的解释,所以不能特意发现。只能帮助显示问题可能发生的路径。
由于无论如何都无法访问else
阻止,if
中的一个或多个条件显然总是 true
。
(randomCellX == cells && innerWall == 2)
(randomCellX == 0 && innerWall == 0)
(randomCellY == cells - 1 && innerWall == 3)
(randomCellY == 0 && innerWall == 1)
这就是为什么你在没有做任何事情的情况下获得if条件和继续循环的原因。确保条件合适。
如果这些条件合适,下一个嫌疑人可能就是这些:
int innerWall = random.nextInt(4)+0;
int randomCellX = random.nextInt(cells-1)+0;
int randomCellY = random.nextInt(cells)+0;
检查这些随机值范围是否与您想要的完全一致。例如:您将randomCellX
的随机值从0加到单元格-2,但对于randomCellY
,范围是0到单元格-1。