public Dungeon(int width, int height) { _width = width; _height = height; _rooms = new Room[_width, _height]; _hallways = new List <Hallway>(); _shortestPath = new Stack <Room>(); Room previousRoom = null; for (int y = 0; y < _height; y++) { // Create a row of rooms for (int x = 0; x < _width; x++) { Room room = new Room(x, y); _rooms[x, y] = room; // Link rooms horizontally with hallways if (previousRoom != null) { Hallway hallway = new Hallway(previousRoom, room); _hallways.Add(hallway); previousRoom.AdjacentHallways.Add(hallway); room.AdjacentHallways.Add(hallway); } previousRoom = room; } previousRoom = null; if (y == 0) { continue; } // Link the current row of rooms with the rooms above for (int i = 0; i < _width; i++) { Room roomAbove = _rooms[i, y - 1]; Room roomOnCurrentRow = _rooms[i, y]; Hallway hallway = new Hallway(roomOnCurrentRow, roomAbove); _hallways.Add(hallway); roomAbove.AdjacentHallways.Add(hallway); roomOnCurrentRow.AdjacentHallways.Add(hallway); } } _startRoom = _rooms[0, 0]; _endRoom = _rooms[_width - 1, _height - 1]; _startRoom.IsStart = true; _endRoom.IsEnd = true; }
public void Print() { Console.WriteLine("S = Room: Startpunt"); Console.WriteLine("E = Room: Eindpunt"); Console.WriteLine("X = Room: Niet bezocht"); Console.WriteLine("* = Room: Bezocht"); Console.WriteLine("~ = Hallway: Ingestort"); Console.WriteLine("0 = Hallway: Level tegenstander (cost)"); Console.Write(Environment.NewLine); for (int y = 0; y < _height; y++) { // Print rooms and horizontal hallways for (int x = 0; x < _width; x++) { Room room = _rooms[x, y]; Hallway rightHallway = room.AdjacentHallways.FirstOrDefault(h => h.OppositeRoom(room).X == room.X + 1); Console.Write($" - {room} - {rightHallway}"); } Console.Write(Environment.NewLine); // Print vertical hallways if (y == _height - 1) { break; } for (int hallwayY = 0; hallwayY < 3; hallwayY++) { for (int x = 0; x < _width; x++) { if (hallwayY == 1) { Room room = _rooms[x, y]; Hallway bottomHallway = room.AdjacentHallways.FirstOrDefault(h => h.OppositeRoom(room).Y == room.Y + 1); Console.Write($" {bottomHallway} "); } else { Console.Write(" | "); } } Console.Write(Environment.NewLine); } } Console.WriteLine(Environment.NewLine + "Acties: talisman, handgranaat, kompas, maaklastiger, startx [x positie], starty [y positie], eindx [x positie], eindy [y positie]" + Environment.NewLine); }
public void MakeShortestPathDifficult() { Room from = null; // For every room in the shortest path, raise the enemy level by 3 (with a maximum of 10) foreach (Room room in _shortestPath) { if (from != null) { Hallway hallway = from.AdjacentHallways.First(h => h.OppositeRoom(from) == room); hallway.EnemyLevel += 3; if (hallway.EnemyLevel >= 10) { hallway.EnemyLevel = 10; } } from = room; } Reset(); }
private string GetEnemyLevel(Room from, Room to) { Hallway hallway = from.AdjacentHallways.First(h => h.OppositeRoom(from) == to); return($"level {hallway.EnemyLevel}"); }
public void HandGrenade() { ISet <Room> visitedRooms = new HashSet <Room>(); List <Hallway> hallwaysToCollapse = new List <Hallway>(); List <Hallway> hallwaysToScan = new List <Hallway>(); List <Tree> roomTreeList = new List <Tree>(); // Copy list of hallways into hallwaysToCollapse and hallwaysToScan foreach (Hallway hallway in _hallways) { hallwaysToCollapse.Add(hallway); hallwaysToScan.Add(hallway); } for (int i = 0; i < _hallways.Count; i++) { // Find the weakest hallway Hallway weakestHallway = null; foreach (Hallway hallway in hallwaysToScan) { if (weakestHallway == null || hallway.EnemyLevel < weakestHallway.EnemyLevel) { weakestHallway = hallway; } } // Check if one or both rooms have been visited from this hallway bool entranceVisited = visitedRooms.Contains(weakestHallway.Entrance); bool exitVisited = visitedRooms.Contains(weakestHallway.Exit); if (!entranceVisited) { visitedRooms.Add(weakestHallway.Entrance); } if (!exitVisited) { visitedRooms.Add(weakestHallway.Exit); } if (!entranceVisited && !exitVisited) { // Neither have been visited, create a new tree with these two rooms CreateRoomTree(weakestHallway.Entrance, weakestHallway.Exit, roomTreeList); hallwaysToCollapse.Remove(weakestHallway); } else if (!entranceVisited) { // Exit has been visited, add the entrance to the exit's tree AddRoomToRoomTree(weakestHallway.Entrance, weakestHallway.Exit, roomTreeList); hallwaysToCollapse.Remove(weakestHallway); } else if (!exitVisited) { // Entrance has been visited, add the exit to the entrance's tree AddRoomToRoomTree(weakestHallway.Exit, weakestHallway.Entrance, roomTreeList); hallwaysToCollapse.Remove(weakestHallway); } // Both rooms have been visited, check if their trees are already connected else { Tree entranceTree = roomTreeList.First(t => t.GetChild(weakestHallway.Entrance) != null); Tree exitTree = roomTreeList.First(t => t.GetChild(weakestHallway.Exit) != null); if (entranceTree != exitTree) { // The trees are not connected, so merge these and remove one from the list hallwaysToCollapse.Remove(weakestHallway); MergeRoomTrees(entranceTree, exitTree, roomTreeList); } } // Remove the hallway from the list of hallways to be scanned hallwaysToScan.Remove(weakestHallway); } foreach (Hallway hallway in hallwaysToCollapse) { hallway.IsCollapsed = true; } // Set the enemy level of a random hallway next to the startroom to 0 Random random = new Random(); IEnumerable <Hallway> notCollapsedHallways = _startRoom.AdjacentHallways.Where(h => !h.IsCollapsed); int randomDefeatedRoom = random.Next(notCollapsedHallways.Count()); notCollapsedHallways.ElementAt(randomDefeatedRoom).EnemyLevel = 0; Console.WriteLine("De kerker schudt op zijn grondvesten, de tegenstander in een aangrenzende hallway is vermorzeld! " + "Een donderend geluid maakt duidelijk dat gedeeltes van de kerker zijn ingestort..." + Environment.NewLine); }