private void CreateRooms() { //setup rooms = new MazeRoomSetup[_gridSizeX * 2, _gridSizeY * 2]; rooms[_gridSizeX, _gridSizeY] = new MazeRoomSetup(Vector2.zero, MazeRoomSetup.RoomKind.Start); _takenPositions.Add(Vector2.zero); Vector2 checkPos; for (var i = 0; i < _numberOfRooms - 1; i++) { var randomPerc = i / ((float)_numberOfRooms - 1); var randomCompare = Mathf.Lerp(RandomCompareStart, RandomCompareEnd, randomPerc); checkPos = NewPosition(); //test new position if (NumberOfNeighbors(checkPos) > 1 && Random.value > randomCompare) { var iterations = 0; while (NumberOfNeighbors(checkPos) > 1) { checkPos = SelectiveNewPosition(); } if (iterations++ >= 50) { throw new ArithmeticException($"Wasn't able to create room pos within {iterations} iterations"); } } //finalize position rooms[(int)checkPos.x + _gridSizeX, (int)checkPos.y + _gridSizeY] = new MazeRoomSetup(checkPos, MazeRoomSetup.RoomKind.Normal); _takenPositions.Add(checkPos); } }
private GameObject FindSuitableRoom(MazeRoomSetup mazeRoomSetup) { List <GameObject> allRooms; switch (mazeRoomSetup.Kind) { case MazeRoomSetup.RoomKind.Start: allRooms = RoomObj.ToList(); break; case MazeRoomSetup.RoomKind.Normal: allRooms = RoomObj.ToList(); break; case MazeRoomSetup.RoomKind.Boss: allRooms = BossRooms.ToList(); break; default: throw new ArgumentOutOfRangeException(); } var sb = new StringBuilder(); sb.Append(mazeRoomSetup.doorDown ? "d" : ""); sb.Append(mazeRoomSetup.doorUp ? "u" : ""); sb.Append(mazeRoomSetup.doorLeft ? "l" : ""); sb.Append(mazeRoomSetup.doorRight ? "r" : ""); var roomDoors = sb.ToString().ToCharArray(); var suitableRooms = allRooms.Where(obj => { var chars = obj.name.ToLower().Where(char.IsLetter).ToList(); return(chars.All(roomDoors.Contains) && chars.Count == roomDoors.Length); }).ToList(); var index = Random.Range(0, suitableRooms.Count - 1); return(suitableRooms[index]); }
private int NumberOfNeighbors(MazeRoomSetup mazeRoomSetup) { return((mazeRoomSetup.doorDown ? 1 : 0) + (mazeRoomSetup.doorUp ? 1 : 0) + (mazeRoomSetup.doorLeft ? 1 : 0) + (mazeRoomSetup.doorRight ? 1 : 0)); }