Example #1
0
        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);
        }