Проблемы при создании лабиринта DFS - PullRequest
1 голос
/ 20 марта 2012
import java.util.*;

public class MazeGenerator
{
public void init()
{
    String Maze[][] = new String [20][20];

    for (int i =0; i <20; i++) {
        for (int j = 0; j < 20; j++) {
            Maze[i][j] = "#";
        }
    }

    generate(Maze);

    for (int i =0; i <20; i++) {
        for (int j = 0; j < 20; j++) {
            System.out.print(" " + Maze[i][j]);
        }
        System.out.println("");
    }
}

public void generate (String Maze[][])
{
    Stack <String> CellStack = new Stack<String>();
    int TotalCells = Maze.length * Maze.length;
    int x = 10, y = 10;

    String CurrentCell = Maze[x][y];
    Maze[x][y] = "-";
    CellStack.push(CurrentCell);
    int VisitedCell = 1;

    boolean EastT, WestT, NorthT, SouthT;

    while(VisitedCell < TotalCells)
    {
        String EAST = Maze[x+1][y];
        String WEST = Maze[x-1][y];
        String NORTH = Maze[x][y+1];
        String SOUTH = Maze[x][y-1];

        if(EAST == "#")
            EastT = true;
        else
            EastT = false;

        if(WEST == "#")
            WestT = true;
        else
            WestT = false;

        if(NORTH == "#")
            NorthT = true;
        else
            NorthT = false;

        if(SOUTH == "#")
            SouthT = true;
        else
            SouthT = false;    

        if(WestT == true || EastT == true || NorthT == true || SouthT == true)
        {
            double Random = (int) (Math.random() * 4) + 1;

            switch ((int) Random)
            {   
                case 1: 
                if(EastT == true){   
                    CurrentCell = EAST;
                    break;
                }
                else 
                    break;

                case 2:
                if(WestT == true){   
                    CurrentCell = WEST;
                    break;
                }
                else
                    break;

                case 3:
                if(NorthT == true){   
                    CurrentCell = NORTH;
                    break;
                }
                else
                    break;

                case 4:
                if(SouthT == true){   
                    CurrentCell = SOUTH;
                    break;
                }
                else
                    break;
            }
            CurrentCell = "-";
            CellStack.push(CurrentCell);
            VisitedCell++;
        }
        else
        {
            CurrentCell = CellStack.pop();
        }
    }
}
}

Когда я распечатываю его, я получаю Лабиринт, в котором есть все "#" (с одним "-" в первом месте), что означает, что Лабиринт не был создан правильным образом. Но я не могу понять, почему это не работает. Я думаю, что это может иметь отношение к переменной CurrentCell, но я не уверен. Может ли кто-нибудь помочь мне узнать мою ошибку, я пытался найти ее, но безрезультатно. Очень признателен!

Ответы [ 2 ]

1 голос
/ 11 апреля 2012

Хорошо.Это не полностью исправляет вашу программу, но исправляет проблему в вашем коде:

Вы много тестируете для if(EAST == "#") (или подобных команд).Однако вы не можете использовать == со строками, так как это сравнивает их ссылку.Вы должны использовать .equals().Так что вместо этого вы бы использовали: if(EAST.equals("#")).

Я также не вижу, где вы меняете содержимое массива Maze [] [].Похоже, что вы редактируете стек, но игнорируете массив, который в конечном итоге печатаете.

Настройки стиля:

  1. Если у вас есть логическая переменная (давайте назовем это var), вам не нужно использовать if(var == true), вместо этого используйте if(var).

  2. Не используйте операторы if / else для назначения логических переменных,Например:

    if(WEST == "#")
        WestT = true;
    else
        WestT = false;
    

    Можно упростить до: WestT = WEST.equals("#");

0 голосов
/ 11 апреля 2012

Есть несколько проблем с вашей реализацией.Вы правы, когда видите, что самая большая проблема связана с переменной CurrentCell.Это ТОЛЬКО строковая переменная, и вы изменяете значение переменной, но никогда не касались реальных значений ячеек лабиринта, кроме ячейки в (10,10).

Предложение: создайте объект Cell для представления ячейки лабиринта со свойствами x, y координаты, символ "#" или "-" в качестве значения ячейки лабиринта и логическое значение "посещения", чтобы указать, действительно лиэто было посещено.Обновите координаты x, y для текущей ячейки.После каждого хода установите текущее значение ячейки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...