Пример лабиринта не генерирует лабиринт

Я следую учебному пособию по лабиринту от YouTube Программирование на Android - Maze Game Pt4

Код наставника в видео генерирует случайные лабиринты. Я следовал коду до 'T', но мой эмулятор выдает только следующий вывод - мой эмулятор выводит

Вот мой код Может кто-нибудь сказать мне, что я пропустил из учебника, которому я следовал, или у самого учебника есть ошибки кодирования? -

public class MazaGame extends View {
    private Cell[][] cells;
    private static final int COLS = 7, ROWS = 10;
    private static final float WALL_THICKNESS = 4;
    private float cellSize,hMargin,vMargin;
    private Paint wallPaint;
    private Random random;

    public MazaGame(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        wallPaint = new Paint();
        wallPaint.setColor(Color.BLACK);
        wallPaint.setStrokeWidth(WALL_THICKNESS);

        random = new Random();

        createMaze();
    }

    private Cell getNeighbor(Cell cell){
        ArrayList<Cell> neighbors = new ArrayList<>();

        //left neighbor
        if(cell.col >0)
            if(!cells[cell.col-1][cell.row].visited)
                neighbors.add(cells[cell.col-1][cell.row]);

        //right neighbor
        if(cell.col < COLS-1)
            if(!cells[cell.col+1][cell.row].visited)
                neighbors.add(cells[cell.col+1][cell.row]);

        //top neighbor
        if(cell.row >0)
            if(!cells[cell.col][cell.row-1].visited)
                neighbors.add(cells[cell.col][cell.row-1]);

        //bottom neighbor
        if(cell.row < ROWS-1)
            if(!cells[cell.col][cell.row+1].visited)
                neighbors.add(cells[cell.col][cell.row+1]);

        if(neighbors.size()>0) {
            int index = random.nextInt(neighbors.size());
            return neighbors.get(index);
        }
        return null;
    }

    private void removeWall(Cell current, Cell next){
        if(current.col == next.col && current.row == next.row+1){
            current.topWall = false;
            next.bottomWall = false;
        }

        if(current.col == next.col && current.row == next.row-1){
            current.bottomWall = false;
            next.topWall = false;
        }

        if(current.col == next.col+1 && current.row == next.row){
            current.leftWall = false;
            next.rightWall = false;
        }

        if(current.col == next.col-1 && current.row == next.row){
            current.rightWall = false;
            next.leftWall = false;
        }
    }

    private void createMaze() {
        Stack<Cell> stack = new Stack<>();
        Cell current, next;

        cells = new Cell[COLS][ROWS];

        for (int x = 0; x < COLS; x++) {
            for (int y = 0; y < ROWS; y++) {
                cells[x][y] = new Cell(x, y);
            }
        }
        do {
            current = cells[0][0];
            current.visited = true;

            next = getNeighbor(current);
            if (next != null) {
                removeWall(current, next);
                stack.push(current);
                current = next;
                current.visited = true;
            } else
                current = stack.pop();
        }while (!stack.empty());
    }
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.RED);

        int width = getWidth();
        int height = getHeight();

        if(width/height < COLS/ROWS)
            cellSize = width/(COLS+1);
        else
            cellSize = height/(ROWS+1);

        hMargin = (width-COLS*cellSize)/2;
        vMargin = (height-ROWS*cellSize)/2;

        canvas.translate(hMargin,vMargin);

        for(int x=0;x<COLS;x++){
            for(int y=0;y<ROWS;y++){
                if(cells[x][y].topWall)
                    canvas.drawLine(
                            x*cellSize,
                            y*cellSize,
                            (x+1)*cellSize,
                            y*cellSize,
                            wallPaint);

                if(cells[x][y].leftWall)
                    canvas.drawLine(
                            x*cellSize,
                            y*cellSize,
                            x*cellSize,
                            (y+1)*cellSize,
                            wallPaint);

                if(cells[x][y].bottomWall)
                    canvas.drawLine(
                            x*cellSize,
                            (y+1)*cellSize,
                            (x+1)*cellSize,
                            (y+1)*cellSize,
                            wallPaint);

                if(cells[x][y].rightWall)
                    canvas.drawLine(
                            (x+1)*cellSize,
                            y*cellSize,
                            (x+1)*cellSize,
                            (y+1)*cellSize,
                            wallPaint);
            }
        }
    }

    private class Cell{
        boolean
            topWall = true,
            rightWall = true,
            bottomWall = true,
            leftWall = true,
            visited = false;

        int col,row;

        public Cell(int col, int row) {
            this.col = col;
            this.row = row;
        }
    }
}

1 ответ

Решение

Я не собираюсь тратить время на полное усвоение 100% кода, который вы разместили, но этот раздел выглядит подозрительно:

    do {
        current = cells[0][0];
        current.visited = true;

        next = getNeighbor(current);
        if (next != null) {
            removeWall(current, next);
            stack.push(current);
            current = next;
            current.visited = true;
        } else
            current = stack.pop();
    }while (!stack.empty());

Я подозреваю, что вы хотите, чтобы это выглядело так:

    current = cells[0][0];
    current.visited = true;

    do {
        next = getNeighbor(current);
        if (next != null) {
            removeWall(current, next);
            stack.push(current);
            current = next;
            current.visited = true;
        } else
            current = stack.pop();
    }while (!stack.empty());

То, что у вас есть сейчас, будет постоянно сбрасываться current быть ячейкой в ​​(0,0), потому что каждый раз в цикле вы выполняете

current = cells[0][0];
current.visited = true;

Я подозреваю, что это просто начальная установка для первой ячейки, и вы не хотите, чтобы это происходило каждый раз в цикле.

Другие вопросы по тегам