public void Copy_Returns_Road_With_TheSame_Number_Of_Buildings() { var road = new Road(new[] { new Point(1, 0), new Point(1, 1), new Point(1, 2), new Point(1, 3) }); road.AddBuilding(new Residence() { Position = new Point(0, 0) }); road.AddBuilding(new Residence() { Position = new Point(0, 2) }); road.AddBuilding(new Residence() { Position = new Point(2, 2) }); var copy = road.Copy(); Assert.AreEqual(3, copy.Buildings.Count); }
public void GenerateAttached_With_Existing_Single_Road() { var road = new Road(new[] { new Point(0, 3), new Point(0, 4) }); road.AddBuilding(new Residence() { Position = new Point(1, 3) }); var actual = _roadGenerator.GenerateAttached(new RoadGenerationAttached() { Fields = _fields, Road = road, Roads = new List <IRoad>() { road }, MinRoadLength = 4, MaxRoadLength = 5 }); var expected = new[] { new Point(1, 4), new Point(2, 4), new Point(3, 4), new Point(4, 4) }; CollectionAssert.AreEquivalent(expected, actual); }
public void GetPossiblePositionsToAttachBuilding_When_There_Are_Buildings_But_No_Already_Attached_Roads() { var road = new Road(new[] { new Point(1, 0), new Point(1, 1), new Point(1, 2), new Point(1, 3) }); road.AddBuilding(new Residence() { Position = new Point(0, 0) }); road.AddBuilding(new Residence() { Position = new Point(0, 2) }); road.AddBuilding(new Residence() { Position = new Point(2, 2) }); var expected = new[] { new Point(0, 1), new Point(0, 3), new Point(2, 0), new Point(2, 1), new Point(2, 3) }; var actual = road.GetPossibleBuildingPositions(new PossibleBuildingPositions(new List <IRoad>() { road }, _fields)); CollectionAssert.AreEquivalent(expected, actual); }
public void When_Building_Is_Above_The_Horizontal_Road_Its_Direction_Is_Set_To_Up() { var road = new Road(new[] { new Point(0, 1), new Point(1, 1) }); var building = new Residence() { Position = new Point(0, 2) }; road.AddBuilding(building); Assert.AreEqual(Direction.Up, building.Direction); }
public void When_Building_Is_On_The_Right_Side_The_Vertical_Road_Its_Direction_Is_Set_To_Right() { var road = new Road(new[] { new Point(1, 0), new Point(1, 1) }); var building = new Residence() { Position = new Point(2, 0) }; road.AddBuilding(building); Assert.AreEqual(Direction.Right, building.Direction); }
public void GenerateAttached_Horizontal_With_Existing_Multiple_Roads_And_Two_Intersection_Points() { var road = new Road(new[] { new Point(0, 3), new Point(0, 4) }); road.AddBuilding(new Residence() { Position = new Point(1, 3) }); var road2 = new Road(new[] { new Point(2, 3), new Point(2, 4) }); var road3 = new Road(new[] { new Point(4, 3), new Point(4, 4) }); var actual = _roadGenerator.GenerateAttached(new RoadGenerationAttached() { Fields = _fields, Road = road, Roads = new List <IRoad>() { road, road2, road3 }, MinRoadLength = 1, MinDistanceBetweenRoads = 3, MaxRoadLength = 100 }); var expected = new[] { new Point(1, 4) }; CollectionAssert.AreEquivalent(expected, actual); }
public void GetPossiblePositionsToAttachRoad_When_There_Are_Buildings_There_Are_Already_Attached_Road_On_Both_Sides_Of_The_Road() { var road = new Road(new[] { new Point(2, 0), new Point(2, 1), new Point(2, 2), new Point(2, 3) }); road.AddBuilding(new Residence() { Position = new Point(1, 0) }); var road2 = new Road(new[] { new Point(0, 3), new Point(1, 3) }); var road3 = new Road(new[] { new Point(3, 3), new Point(4, 3) }); var expected = new[] { new Point(3, 0) }; var actual = road.GetPossibleRoadPositions(new PossibleRoadPositions(new List <IRoad>() { road, road2, road3 }) { MinDistanceBetweenRoads = 2 }); CollectionAssert.AreEquivalent(expected, actual); }
private void InitializeGenes() { var minRadius = Fields.GetLength(0) / 100 < 10 ? 10 : Fields.GetLength(0) / 100; var maxRadius = Fields.GetLength(0) / 10 < 10 ? 10 : Fields.GetLength(0) / 10; var settlementFields = Fields.ToList() .Where(f => f.InSettlement && f.Position.X > maxRadius && f.Position.X <Fields.GetLength(0) - maxRadius && f.Position.Y> maxRadius && f.Position.Y < Fields.GetLength(1) - maxRadius) .ToList(); Point center = new Point(-1, -1); int radius = -1; for (int r = maxRadius; r >= minRadius; r--) { Field centerField = settlementFields .FirstOrDefault(f => f.Position.GetCircularPoints(r, Math.PI / 17.0f) .All(p => Fields[p.X, p.Y].InSettlement) && f.Position.GetCircularPoints(r / 2.0, Math.PI / 17.0f) .All(p => Fields[p.X, p.Y].InSettlement) && f.Position.GetCircularPoints(r / 4.0, Math.PI / 17.0f) .All(p => Fields[p.X, p.Y].InSettlement) && f.Position.GetCircularPoints(r / 6.0, Math.PI / 17.0f) .All(p => Fields[p.X, p.Y].InSettlement) && f.Position.GetCircularPoints(r / 8.0, Math.PI / 17.0f) .All(p => Fields[p.X, p.Y].InSettlement) && f.Position.GetCircularPoints(r / 10.0, Math.PI / 17.0f) .All(p => Fields[p.X, p.Y].InSettlement)); if (centerField != null) { radius = r; center = centerField.Position; break; } if (r == minRadius) { throw new Exception("Cannot find center for initial point"); } } SettlementCenter = center; var roadGenerator = new RoadPointsGenerator(); var initialRoads = new List <IRoad>(InitialRoadsCount); var firstRoadPoints = roadGenerator.GenerateStraight(new RoadGenerationTwoPoints() { Start = new Point(center.X - radius / 2, center.Y), End = new Point(center.X + radius / 2, center.Y), Fields = Fields }); var firstRoad = new Road(firstRoadPoints); while (firstRoad.Buildings.Count < 0.25 * firstRoad.Length) { var possiblePlaces = firstRoad.GetPossibleBuildingPositions(new PossibleBuildingPositions(this.Roads, this.Fields)); var building = new Residence { Position = possiblePlaces[RandomProvider.Next(possiblePlaces.Count)], Road = firstRoad, Fitness = 0.1, Material = Material.Wood }; firstRoad.AddBuilding(building); } initialRoads.Add(firstRoad); AddRoad(initialRoads.First()); while (initialRoads.Count != InitialRoadsCount) { var roadToAttach = initialRoads[RandomProvider.Next(initialRoads.Count)]; var roadPoints = roadGenerator.GenerateAttached(new RoadGenerationAttached() { Road = roadToAttach, Roads = initialRoads, Fields = Fields, MaxRoadLength = MaxRoadLength, MinRoadLength = MinRoadLength, MinDistanceBetweenRoads = MinDistanceBetweenRoads }).ToList(); if (!roadPoints.Any()) { continue; } var newRoad = new Road(roadPoints); initialRoads.Add(newRoad); while (newRoad.Buildings.Count < 0.25 * newRoad.Length) { var possiblePlaces = newRoad.GetPossibleBuildingPositions(new PossibleBuildingPositions(this.Roads, Fields)); var building = new Residence { Position = possiblePlaces[RandomProvider.Next(possiblePlaces.Count)], Road = newRoad, Fitness = 0.1, Material = Material.Wood }; newRoad.AddBuilding(building); } if (CanAddRoad(newRoad)) { AddRoad(newRoad); } } }