/// <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($" <hr><address>{request.Server.ServerVersionString} Server at {NetTools.HostName} Port {request.LocalPort}<br>© {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 }); } }
public bool Equals(Breadcrump other) { return(Pos.Equals(other.Pos)); }
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); }