using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Linq; using System; //UNFINISHED but tried anyway /*public class Cell { //a cell consists of its position and borders public List Borders; public Vector3 position; public bool visited; public Cell(Vector3 pos) { visited = false; position = pos; Borders = new List(); } } public enum Direction //direction's bitwise value { N = 1, //0001 S = 2, //0010 E = 4, //0100 W= 8 //1000 }*/ public class RecursiveBacktrackerCellWise { enum DX // direction's x axis movement value { E = 1, W = -1, N = 0, S = 0 } enum DY //returns direction's y axis movement value { E = 0, W = 0, N = -1, S = 1 } enum OPPOSITE//opposite of direction's bitwise value { E = 8, W = 4, N = 2, S = 1 } List> Grid = new List>(); List> CellGrid = new List>(); int GridHeight = 11; int GridWidth = 11; public List> GetNewMaze(List> Maze) { SetGridBounds(Maze); CreateCellGrid(Maze); CarvePassagesFromCell(0, 0, CellGrid); AddBorders(); return CellGrid; } void SetGridBounds(List> Maze) { GridWidth = Maze[0].Count(); GridHeight = Maze.Count(); } void CreateCellGrid(List> Maze) //CellGrid and Grid veriables are initially created { List cellRow = new List(); for (int a = 0; a < GridHeight; a++) { for (int b = 0; b < GridWidth; b++) { cellRow.Add(new Cell(Maze[a][b])); } CellGrid.Add(cellRow); cellRow = new List(); } } void CarvePassagesFromCell(int cx, int cy, List> Grid) { List Directions = new List { Direction.Up, Direction.Down, Direction.Right, Direction.Left }; Directions = Directions.OrderBy(a => Guid.NewGuid()).ToList(); //Randomize directions //Grid[cy][cx].visited = true; foreach (Direction dir in Directions) //check each direction { int nx = cx + DirToDX(dir);//translate current coordinate to drections coordinate int ny = cy + DirToDY(dir); if ((0 <= ny && ny <= GridHeight - 1) && (0 <= nx && nx <= GridWidth - 1)) //if new coordinate between the bounds { //if (!Grid[ny][nx].visited ) { //If the new coordinate unvisited Grid[cy][cx].Borders.Add(dir); //current direction added to current cell Grid[ny][nx].Borders.Add(DirToOppositeCell(dir));// DirToOpposite(dir);//opposite of current direction added to next cell bitwise CarvePassagesFromCell(nx, ny, Grid);//Carving the map continued from the next cell } } } } void AddBorders() { for (int t = 0; t < GridHeight; t++) //left border values { CellGrid[t][0].Borders.Add(Direction.Left); } for (int t = 0; t < GridWidth; t++) { CellGrid[0][t].Borders.Add(Direction.Up); } for (int t = 0; t < GridHeight; t++) //left border values { CellGrid[t][GridHeight-1].Borders.Add(Direction.Right); } for (int t = 0; t < GridWidth; t++) { CellGrid[GridWidth-1][t].Borders.Add(Direction.Down); } } int DirToDX(Direction dir)//returns direction's x axis movement value { switch (dir) { case Direction.Up: return (int)DX.N; case Direction.Down: return (int)DX.S; case Direction.Left: return (int)DX.W; case Direction.Right: return (int)DX.E; } return 0; } int DirToDY(Direction dir) //returns direction's y axis movement value { switch (dir) { case Direction.Up: return (int)DY.N; case Direction.Down: return (int)DY.S; case Direction.Left: return (int)DY.W; case Direction.Right: return (int)DY.E; } return 0; } Direction DirToOppositeCell(Direction dir) //returns direction's opposite direction value { switch (dir) { case Direction.Up: return Direction.Down; case Direction.Down: return Direction.Up; case Direction.Left: return Direction.Right; case Direction.Right: return Direction.Left; } return Direction.Up; } }