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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
                }
            }
        }