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); }
// Private update methods private void DecrementDaysBeforeDeparture() { DockedBoats.ForEach(boat => boat.DaysBeforeDeparture--); }
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++; } } }