Пример #1
0
        private void DepartBoats()
        {
            List <Boat> departingBoats = DockedBoats.Where(boat => boat.DaysBeforeDeparture <= 0).ToList();

            departingBoats.ForEach(boat => {
                boat.DockedTo.ForEach(dockNumber => {
                    Dock dock;

                    if (dockNumber <= DocksLeft.Count)
                    {
                        dock = DocksLeft[dockNumber - 1];
                    }
                    else
                    {
                        dock = DocksRight[dockNumber - DocksLeft.Count - 1];
                    }

                    if (boat.Id.Substring(0, 2) == "RB" && !dock.HasPlaceForAnotherRowingBoat)
                    {
                        dock.HasPlaceForAnotherRowingBoat = true;
                    }
                    else
                    {
                        dock.HasPlaceForAnotherRowingBoat = true;
                        dock.IsOccupied = false;
                    }
                });
            });

            DockedBoats.RemoveAll(b => b.DaysBeforeDeparture <= 0);
        }
Пример #2
0
        // Private update methods

        private void DecrementDaysBeforeDeparture()
        {
            DockedBoats.ForEach(boat => boat.DaysBeforeDeparture--);
        }
Пример #3
0
        private void DockBoat(Boat boat, List <Dock> primaryDocks, List <Dock> secondaryDocks)
        {
            bool canDock = false;

            for (int i = 0; i < primaryDocks.Count; i++)
            {
                if (!primaryDocks[i].IsOccupied && i + boat.Size < primaryDocks.Count)
                {
                    canDock = true;

                    for (int j = 1; j < boat.Size; j++)
                    {
                        if (primaryDocks[i + j].IsOccupied)
                        {
                            canDock = false;
                        }
                    }

                    if (canDock)
                    {
                        for (int k = 0; k < boat.Size; k++)
                        {
                            primaryDocks[i + k].IsOccupied = true;

                            if (boat is RowingBoat == false)
                            {
                                primaryDocks[i + k].HasPlaceForAnotherRowingBoat = false;
                            }

                            boat.DockedTo.Add(primaryDocks[i + k].DockNumber);
                        }

                        DockedBoats.Add(boat);

                        break;
                    }
                }
                else if (boat is RowingBoat && primaryDocks[i].HasPlaceForAnotherRowingBoat)
                {
                    canDock = true;
                    primaryDocks[i].HasPlaceForAnotherRowingBoat = false;
                    boat.DockedTo.Add(primaryDocks[i].DockNumber);
                    DockedBoats.Add(boat);

                    break;
                }
            }

            if (!canDock)
            {
                for (int i = secondaryDocks.Count - 1; i >= 0; i--)
                {
                    if (!secondaryDocks[i].IsOccupied && i - boat.Size - 1 > 0)
                    {
                        canDock = true;

                        for (int j = boat.Size - 1; j > 0; j--)
                        {
                            if (secondaryDocks[i - j].IsOccupied)
                            {
                                canDock = false;
                            }
                        }

                        if (canDock)
                        {
                            for (int k = boat.Size - 1; k >= 0; k--)
                            {
                                secondaryDocks[i - k].IsOccupied = true;

                                if (boat is RowingBoat == false)
                                {
                                    secondaryDocks[i - k].HasPlaceForAnotherRowingBoat = false;
                                }

                                boat.DockedTo.Add(secondaryDocks[i - k].DockNumber);
                            }

                            DockedBoats.Add(boat);

                            break;
                        }
                    }
                    else if (boat is RowingBoat && secondaryDocks[i].HasPlaceForAnotherRowingBoat)
                    {
                        canDock = true;
                        secondaryDocks[i].HasPlaceForAnotherRowingBoat = false;
                        boat.DockedTo.Add(secondaryDocks[i].DockNumber);
                        DockedBoats.Add(boat);

                        break;
                    }
                }

                if (!canDock)
                {
                    RejectedBoats++;
                }
            }
        }