0

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

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

4 回答 4

4

而不是拥有 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;

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

于 2009-10-15T17:46:47.050 回答
3

枚举方向,然后通过给出方向访问墙壁和邻居。

您应该将成员变量设为私有并以小写形式编写。

于 2009-10-15T17:48:20.870 回答
1

第一次尝试,如果可以的话,我会将成员变量设为私有变量:

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 unvisited(North) || unvisited(South) || unvisited(East) || unvisited(West);
    }

    private List<Cell> getUnvisitedNeighbors() {
        List<Cell> result = new ArrayList<Cell>();
        if (unvisited(North))
            result.add(North);
        if (unvisited(South))
            result.add(South);
        if (unvisited(West))
            result.add(West);
        if (unvisited(East))
            result.add(East);
        return result;
    }

    private boolean unvisited(Cell cell) {
        return cell != null && !cell.Visited;
    }

    private Cell getRandomUnvisitedNeighbor() {
        Random randGen = new Random();
        List<Cell> unvisitedNeighbors = getUnvisitedNeighbors();
        return unvisitedNeighbors.get(randGen.nextInt((unvisitedNeighbors.size())));
    }

    public Cell removeRandomWall() {
        if (!hasUnvisitedNeighbors()) {
            return null;
        }
        Cell neighbor = getRandomUnvisitedNeighbor();
        if (neighbor == North) {
            NorthWall = false;
            North.SouthWall = false;
        } else if (neighbor == South) {
            SouthWall = false;
            South.NorthWall = false;
        } else if (neighbor == West) {
            WestWall = false;
            West.EastWall = false;
        } else if (neighbor == East) {
            EastWall = false;
            East.WestWall = false;
        }

        return neighbor;

    }
}
于 2009-10-15T17:51:16.053 回答
0

尝试通过使用“null Cell”对象删除对 null 的检查...

public static final Cell NULL_CELL = new Cell();

因此,您可以使用 null 来指示不存在这样的单元格,您现在可以使用 NULL_CELL。

现在你可以更换

if (north != null && !north.Visited)
                unvisitedNeighbors.add(north);

if (!north.isVisited()) {
    unvisitedNeighbors.add(north);
}

通常在 Java 中,成员变量是私有的,您使用“getter”来访问它们......

private boolean northWall;
private boolean southWall;
private boolean eastWall;
private boolean westWall;

private Cell north;
private Cell south;
private Cell east;
private Cell west;

private boolean visited;

public boolean hasNorthWall() {
  return northWall;
}

public Cell getNorthCell() {
  return north;
}

// etc.
于 2009-10-15T19:31:39.423 回答