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; } }
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); } } }
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(); } }