Example #1
0
        private static List <MazeCell> FindShortestPath(MazeCell entryCell, MazeCell exitCell, MazeCell currentCell, Queue <MazeCell> mazeQueue, MazeCell[,] mazeArray)
        {
            currentCell = entryCell;
            mazeQueue.Enqueue(currentCell);
            while (mazeQueue.Count > 0)
            {
                currentCell = MazeQueue.Dequeue();
                mazeArray[currentCell.Y, currentCell.X].IsVisited = true;
                if (currentCell == exitCell)
                {
                    break;
                }

                if (mazeArray[currentCell.Y - 1, currentCell.X].IsVisited == false)
                {
                    mazeArray[currentCell.Y - 1, currentCell.X].Parent = mazeArray[currentCell.Y, currentCell.X];
                    mazeQueue.Enqueue(mazeArray[currentCell.Y - 1, currentCell.X]);
                }
                if (mazeArray[currentCell.Y + 1, currentCell.X].IsVisited == false)
                {
                    mazeArray[currentCell.Y + 1, currentCell.X].Parent = mazeArray[currentCell.Y, currentCell.X];
                    mazeQueue.Enqueue(mazeArray[currentCell.Y + 1, currentCell.X]);
                }
                if (mazeArray[currentCell.Y, currentCell.X - 1].IsVisited == false)
                {
                    mazeArray[currentCell.Y, currentCell.X - 1].Parent = mazeArray[currentCell.Y, currentCell.X];
                    mazeQueue.Enqueue(mazeArray[currentCell.Y, currentCell.X - 1]);
                }
                if (mazeArray[currentCell.Y, currentCell.X + 1].IsVisited == false)
                {
                    mazeArray[currentCell.Y, currentCell.X + 1].Parent = mazeArray[currentCell.Y, currentCell.X];
                    mazeQueue.Enqueue(mazeArray[currentCell.Y, currentCell.X + 1]);
                }
            }
            var mazePath = new List <MazeCell>();
            var start    = mazeArray[entryCell.Y, entryCell.X];
            var exit     = mazeArray[exitCell.Y, exitCell.X];

            mazePath.Add(exit);
            while (exit != start)
            {
                if (exit.Parent == null)
                {
                    return(null);
                }
                mazePath.Add(exit.Parent);
                exit = exit.Parent;
            }
            mazePath.Reverse();
            mazePath.RemoveAt(0);
            return(mazePath);
        }
Example #2
0
        public static void GetPathForVisualization(List <MazeCell> mazePath)
        {
            if (mazePath == null)
            {
                MazeArray[ExitCell.Y, ExitCell.X].Character    = 'x';
                MazeArray[ExitCell.Y, ExitCell.X].IsVisited    = true;
                MazeToBeShowed[ExitCell.Y - 1, ExitCell.X - 1] = new MazeCell(ExitCell.X - 1, ExitCell.Y - 1, MazeArray[ExitCell.Y, ExitCell.X].Character);
                StoredMazeArray[ExitCell.Y, ExitCell.X]        = MazeArray[ExitCell.Y, ExitCell.X];
                CopyMaze(MazeArray, StoredMazeArray);
                CopyMaze(StoredMazeToBeShowed, MazeToBeShowed);
                MazeQueue.Clear();
            }
            else
            {
                foreach (var mazeCell in mazePath)
                {
                    if (mazeCell.Character != ExitCell.Character)
                    {
                        MazeArray[mazeCell.Y, mazeCell.X].Character = '.';
                    }
                    else
                    {
                        MazeArray[mazeCell.Y, mazeCell.X].Character = '@';
                        ExitCell.Character = MazeArray[mazeCell.Y, mazeCell.X].Character;
                    }
                }
                var canvasPath = new List <MazeCell>();
                foreach (MazeCell mazeCell in mazePath)
                {
                    canvasPath.Add(new MazeCell(mazeCell.X - 1, mazeCell.Y - 1, mazeCell.Character));
                    canvasPath[0].IsVisited = mazeCell.IsVisited;
                }

                mazePath.Clear();
                mazePath.AddRange(canvasPath);
                StoredMazeArray[ExitCell.Y, ExitCell.X] = ExitCell;
                CopyMaze(MazeArray, StoredMazeArray);
                CopyMaze(StoredMazeToBeShowed, MazeToBeShowed);
                MazeQueue.Clear();
            }
            if (mazePath != null)
            {
                CellsInMazePath = mazePath.Count;
            }
        }
Example #3
0
        public void SolveMazeMultipleExits(MazeCell[,] mazeArray)
        {
            InitializeMaze(mazeArray);
            var storedMazeArray = new MazeCell[mazeArray.GetLength(0), mazeArray.GetLength(1)];

            CopyMaze(storedMazeArray, mazeArray);

            while (ExitCells.Count != 0)
            {
                ExitCell = ExitCells.Dequeue();
                mazeArray[ExitCell.Y, ExitCell.X].IsVisited = false;
                CurrentCell = EntryCell;
                var mazePath = FindShortestPath(EntryCell, ExitCell, CurrentCell, MazeQueue, mazeArray);
                if (mazePath == null)
                {
                    Console.WriteLine($"Could not find path to {ExitCell}.");
                    mazeArray[ExitCell.Y, ExitCell.X].Character = 'x';
                    mazeArray[ExitCell.Y, ExitCell.X].IsVisited = true;
                    MazeQueue.Clear();
                }
                else
                {
                    foreach (var mazeCell in mazePath)
                    {
                        if (mazeCell.Character != ExitCell.Character)
                        {
                            mazeArray[mazeCell.Y, mazeCell.X].Character = '.';
                        }
                        else
                        {
                            mazeArray[mazeCell.Y, mazeCell.X].Character = '@';
                            ExitCell.Character = mazeArray[mazeCell.Y, mazeCell.X].Character;
                        }
                        DisplayMaze(mazeArray);
                    }
                    Console.WriteLine($"Shortest path from {EntryCell} to {ExitCell} found.");
                    Console.WriteLine();
                    MazeQueue.Clear();
                    storedMazeArray[ExitCell.Y, ExitCell.X] = ExitCell;
                    CopyMaze(mazeArray, storedMazeArray);
                }
            }
        }
Example #4
0
 private void InitializeMaze(MazeCell[,] mazeArray)
 {
     foreach (var mazeCell in mazeArray)
     {
         if (mazeCell.Character == 'm')
         {
             EntryCell   = mazeCell;
             CurrentCell = EntryCell;
         }
         if (mazeCell.Character == 'e')
         {
             ExitCells.Enqueue(mazeCell);
         }
         if (mazeCell.Character == '0' || mazeCell.Character == 'm')
         {
             mazeCell.IsVisited = false;
         }
         else
         {
             mazeCell.IsVisited = true;
         }
         MazeQueue.Clear();
     }
 }