public List <intPair> GetNeighbors(intPair pair) { List <intPair> neighbors = new List <intPair> (); intPair left = new intPair(pair.x - 1, pair.y); intPair right = new intPair(pair.x + 1, pair.y); intPair up = new intPair(pair.x, pair.y + 1); intPair down = new intPair(pair.x, pair.y - 1); if (IsInRange(left)) { neighbors.Add(left); } if (IsInRange(right)) { neighbors.Add(right); } if (IsInRange(up)) { neighbors.Add(up); } if (IsInRange(down)) { neighbors.Add(down); } return(neighbors); }
void DrunkRun() { for (int j = 0; j < drunkenRunAmt; j++) { intPair current = new intPair(Random.Range(1, sizeX - 1), Random.Range(1, sizeY - 1)); for (int i = 0; i < drunkenRunSize; i++) { maze [current.x, current.y] = 1; int direction = Random.Range(0, 4); intPair pairNew = new intPair(current.x, current.y); if (direction == 0) { pairNew.x = current.x - 1; } else if (direction == 1) { pairNew.y = current.y + 1; } else if (direction == 2) { pairNew.x = current.x + 1; } else if (direction == 3) { pairNew.y = current.y - 1; } if (IsInRange(pairNew)) { current = pairNew; } } } }
bool IsAWall(intPair pair) { if (IsInRange(pair) && maze [pair.x, pair.y] == 0) { return(true); } return(false); }
bool IsDeadEnd(intPair pair) { intPair up = new intPair(pair.x, pair.y + distance); intPair down = new intPair(pair.x, pair.y - distance); intPair left = new intPair(pair.x - distance, pair.y); intPair right = new intPair(pair.x + distance, pair.y); bool d = (IsAWall(up) || IsAWall(down) || IsAWall(left) || IsAWall(right)); return(!d); }
bool IsInRange(intPair pair) { if (pair.x >= sizeX - 1 || pair.x < 1) { return(false); } if (pair.y >= sizeY - 1 || pair.y < 1) { return(false); } return(true); }
public List <intPair> GetNeighborsCorner(intPair pair) { List <intPair> neighbors = new List <intPair> (); intPair left = new intPair(pair.x - 1, pair.y - 1); intPair right = new intPair(pair.x + 1, pair.y + 1); intPair up = new intPair(pair.x - 1, pair.y + 1); intPair down = new intPair(pair.x + 1, pair.y - 1); if (IsInRange(left)) { if (maze[pair.x - 1, pair.y] == 1 || maze[pair.x, pair.y - 1] == 1) { neighbors.Add(left); } } if (IsInRange(right)) { if (maze[pair.x + 1, pair.y] == 1 || maze[pair.x, pair.y + 1] == 1) { neighbors.Add(right); } } if (IsInRange(up)) { if (maze[pair.x - 1, pair.y] == 1 || maze[pair.x, pair.y + 1] == 1) { neighbors.Add(up); } } if (IsInRange(down)) { if (maze[pair.x + 1, pair.y] == 1 || maze[pair.x, pair.y - 1] == 1) { neighbors.Add(down); } } neighbors.AddRange(GetNeighbors(pair)); return(neighbors); }
public void GenerateMaze() { maze = new int[sizeX, sizeY]; Stack stack = new Stack(); intPair start = new intPair(sizeX / 2, sizeY / 2); if (start.x % 2 == 0) { start.x = start.x - 1; } if (start.y % 2 == 0) { start.y = start.y - 1; } Random.Range(0, 4); stack.Push(start); while (stack.Count > 0) { intPair currentTile = (intPair)stack.Peek(); maze[currentTile.x, currentTile.y] = 1; if (IsDeadEnd(currentTile)) { stack.Pop(); continue; } intPair newTile = new intPair(currentTile.x, currentTile.y); int direction = 0; while (true) { newTile.x = currentTile.x; newTile.y = currentTile.y; // Get a direction // 0 = left, 1 = up, 2 = right, distance = down direction = Random.Range(0, 4); if (direction == 0) { newTile.x = currentTile.x - distance; } else if (direction == 1) { newTile.y = currentTile.y + distance; } else if (direction == 2) { newTile.x = currentTile.x + distance; } else if (direction == 3) { newTile.y = currentTile.y - distance; } if (IsAWall(newTile)) { break; } } if (direction == 0) { //stack.Push(new intPair(currentTile.x - 1, currentTile.y)); for (int i = 1; i < distance; i++) { maze[currentTile.x - i, currentTile.y] = 1; } } else if (direction == 1) { for (int i = 1; i < distance; i++) { maze[currentTile.x, currentTile.y + i] = 1; } } else if (direction == 2) { for (int i = 1; i < distance; i++) { maze[currentTile.x + i, currentTile.y] = 1; } } else if (direction == 3) { for (int i = 1; i < distance; i++) { maze[currentTile.x, currentTile.y - i] = 1; } } stack.Push(newTile); } //perlinNoise (); DrunkRun(); DrawMaze(); }