List <Tuple <int, DungRoom> > FindClosest(DungRoom dr, Random rnd) { //Draw(true); //dr.MakeRed(ConsoleColor.Red); //Draw(false); //List<> res = new List<Tuple<int, DungRoom>>(); List <Tuple <int, DungRoom> > closest = new List <Tuple <int, DungRoom> >(); int maxCount = maxRoadsFrom; for (int i = 0; i < maxCount; i++) { closest.Add(new Tuple <int, DungRoom>(100, null)); } //DungRoom dr = rooms[0]; for (int w = 0; w < dr.wid * 2 + dr.hei * 2; w++) { int dist = 0; while (dist < Math.Min(wid, hei)) { ++dist; bool found = false; foreach (DungRoom r in rooms) { if (r != dr) { if ((w < dr.wid && r.HitTest(dr.left + w, dr.top - dist)) || (w >= dr.wid && w < dr.wid * 2 && r.HitTest(dr.left + w - dr.wid, dr.top + dr.hei + dist)) || (w >= dr.wid * 2 && w < dr.wid * 2 + dr.hei && r.HitTest(dr.left - dist, dr.top + w - dr.wid * 2)) || (w >= dr.wid * 2 + dr.hei && r.HitTest(dr.left + dr.wid + dist, dr.top + w - dr.wid * 2 - dr.hei)) ) { found = true; Tuple <int, DungRoom> foundT = new Tuple <int, DungRoom>(dist, r); for (int i = 0; i < maxCount; i++) { if (foundT.Item1 < closest[i].Item1) { if (closest.IndexOf(foundT) < 0) { if (closest[i].Item2 != foundT.Item2) { for (int I = maxCount - 1; I > i; I--) { closest[I] = closest[I - 1]; } } closest[i] = foundT; break; } } } break; } } } if (found) { break; } } //res.Add(new Tuple<int, DungRoom>()); } for (int i = 0; i < maxCount; i++) { if (closest[i].Item2 != null) { closest[i].Item2.MakeRed(ConsoleColor.Green); if (dr.NearRooms().IndexOf(closest[i].Item2) < 0) { dr.makeRoad(closest[i].Item2, rnd); } } } //Draw(false); return(closest); }