/// <summary>
        /// Initializes a new instance of the <see cref="HtmlPageBuilder"/> class.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">request.</exception>
        public HtmlPageBuilder(WebRequest request)
        {
            this.request = request ?? throw new ArgumentNullException("request");
            AddHeader(Properties.Resources.CaveWebServerHeaders);
            AddFooter($"&nbsp;<hr><address>{request.Server.ServerVersionString} Server at {NetTools.HostName} Port {request.LocalPort}<br>&copy {request.Server.ServerCopyRight}</address>");
            string protocol = (request.Server.Certificate == null) ? "http://" : "https://";
            string link     = protocol + request.Headers["host"];

            Breadcrump.Add(new WebLink()
            {
                Link = link, Text = request.Server.Title
            });
            foreach (string part in request.DecodedUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries))
            {
                link = link.TrimEnd('/') + "/" + part;
                Breadcrump.Add(new WebLink()
                {
                    Text = part, Link = link
                });
            }
        }
Beispiel #2
0
 public bool Equals(Breadcrump other)
 {
     return(Pos.Equals(other.Pos));
 }
Beispiel #3
0
    public static Path FindBestPath(this GameField gameField, Point @from, ushort[] cost, Map <float> cost2, int length, int realStart = 0, int realLen = 0)
    {
        var closedList    = GetClosedList(gameField);
        var openProcessed = GetOpenProcessedList(gameField);

        var cameFrom = new Dictionary <Point, Breadcrump>();
        var bStart   = new Breadcrump(@from, 0, 0, 0);
        var openList = GetOpenList();

        openList.Add(bStart);

        var rowLen = gameField.Width;
        var colLen = gameField.Height;

        closedList[from.ToIdx(rowLen)] = true;

        var filter = ScoreClosure(gameField, openProcessed);

        using var disCx = new DisposeContext();
        disCx.Disposed += () =>
        {
            foreach (var bc in cameFrom)
            {
                _breadcrumps.Put(bc.Value);
            }
        };
        disCx.Disposed += () =>
        {
            foreach (var bc in openList)
            {
                _breadcrumps.Put(bc);
            }
        };

        while (openList.Count > 0)
        {
            var src    = openList.FindMax(filter);
            var srcPos = src.Pos;
            var srcIdx = srcPos.Y * rowLen + srcPos.X;
            if (openProcessed[srcIdx])
            {
                break;
            }
            openProcessed[srcIdx] = true;

            // openList.Remove(src);

            if (src.Hops >= length)
            {
                return(ReconstructPath(cameFrom, srcPos, src.HScore));
            }

            var anyAdj = false;
            for (var i = 0; i < 4; i++)
            {
                var adj = new Point(srcPos.X + ColNum[i], srcPos.Y + RowNum[i]);
                Warp(ref adj, rowLen, colLen);
                if (!IsValid(adj, rowLen, colLen))
                {
                    continue;
                }

                var mapFlags = gameField.GetFlags(adj);
                if (mapFlags.CHasFlag(CellFlags.Wall))
                {
                    continue;
                }

                var adjIdx = adj.Y * rowLen + adj.X;
                if (closedList[adjIdx])
                {
                    continue;
                }
                closedList[adjIdx] = true;

                anyAdj = true;

                var adjValue = Balance.GetCellValue(mapFlags);

                /*if (mapFlags.CHasFlag(CellFlags.GemPellet)
                 *  && src.Hops < 3
                 *  && !src.Flags.CHasFlag(CellFlags.MyPac) && !src.Flags.CHasFlag(CellFlags.EnemyPac))
                 * adjValue = 0f;*/

                // inverse heuristic to make sum minimal
                var cellScore = realLen > 0
          ? adjValue * (1 - (realStart + src.Hops + 1) / (float)realLen)
          : adjValue;
                var hScore = src.HScore + cellScore;
                var gScore = cost[adjIdx] + (cost2?[adj] ?? 0);


                cameFrom[adj] = _breadcrumps.Take().Set(srcPos, src.Hops + 1, hScore, gScore, src.Flags | mapFlags);
                openList.Add(_breadcrumps.Take().Set(adj, src.Hops + 1, hScore, gScore, src.Flags | mapFlags));
            }

            if (!anyAdj)
            {
                return(ReconstructPath(cameFrom, srcPos, src.HScore));
            }
        }

        // if (lastBest.HasValue)
        // return ReconstructPath(cameFrom, lastBest.Value.Pos, Math.Abs(lastBest.Value.HScore/maxValue));
        // todo add path to last node?
        Player.Print($"path not found {from} {length}");
        return(null);
    }