我正在编写迷宫生成器。我有一个“细胞”类,如下所示:

public class Cell {
    public boolean northWall;
    public boolean southWall;
    public boolean eastWall;
    public boolean westWall;

    public Cell north;
    public Cell south;
    public Cell east;
    public Cell west;

    public boolean visited;

    public Cell() {
        northWall = true;
        southWall = true;
        eastWall = true;
        westWall = true;
        visited = false;
    }

    public boolean hasUnvisitedNeighbors() {
        return ((north != null && !north.Visited)
                || (south != null && !south.Visited)
                || (east != null && !east.Visited) || (west != null && !west.Visited));
    }

    public Cell removeRandomWall() {
        List<Cell> unvisitedNeighbors = new ArrayList<Cell>();
        if (north != null && !north.Visited)
            unvisitedNeighbors.add(north);
        if (south != null && !south.Visited)
            unvisitedNeighbors.add(south);
        if (west != null && !west.Visited)
            unvisitedNeighbors.add(west);
        if (east != null && !east.Visited)
            unvisitedNeighbors.add(east);



        if (unvisitedNeighbors.size() == 0) {
            return null;
        } else {
            Random randGen = new Random();
            Cell neighbor = unvisitedNeighbors.get(randGen
                    .nextInt((unvisitedNeighbors.size())));

            if (neighbor == north) {
                northWall = false;
                north.southWall = false;
                return north;
            } else if (neighbor == south) {
                southWall = false;
                south.northWall = false;
                return south;
            } else if (neighbor == west) {
                westWall = false;
                west.eastWall = false;
                return west;
            } else if (neighbor == east) {
                eastWall = false;
                east.westWall = false;
                return east;
            }

            return null;
        }

    }
}


我程序中的迷宫只是细胞的二维数组。创建阵列后,我手动进入并设置对相邻单元格(北,南,东,西)的所有引用。

我要清理的是removeRandomWall()。假定随机选择一个其访问标记设置为false的相邻单元,并移除此单元和连接它们的相邻单元中的墙。

因此,它需要考虑所有尚未访问过的相邻单元格,随机选择一个,然后将该单元格中的墙和相邻的单元格设置为false,以便它们之间现在有了一条路径。我在上面尝试过,但是看起来很笨拙。

谁能帮我吗?

最佳答案

而不是拥有4个单独的成员:

public Cell North;
public Cell South;
public Cell East;
public Cell West;


只有1个数组:

public Cell [] cells = new Cell[4];


还有4个常量:

public final int NORTH = 0;
public final int EAST = 1;
public final int SOUTH = 2;
public final int WEST = 3;


它使移除随机墙之类的事情变得如此容易。

关于java - 如何清理用Java写的这种方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1573955/

10-12 20:30