public void ScoreSpot_A_Star_With_Model_And_Gradient_Avoidance(Spot spotLinkedToCurrent, Spot destinationSpot, int currentSearchID, ILocationHeuristics locationHeuristics, PriorityQueue <Spot, float> prioritySpotQueue) { //score spot float G_Score = currentSearchSpot.traceBackDistance + currentSearchSpot.GetDistanceTo(spotLinkedToCurrent); // the movement cost to move from the starting point A to a given square on the grid, following the path generated to get there. float H_Score = spotLinkedToCurrent.GetDistanceTo2D(destinationSpot) * heuristicsFactor; // the estimated movement cost to move from that given square on the grid to the final destination, point B. This is often referred to as the heuristic, which can be a bit confusing. The reason why it is called that is because it is a guess. We really don�t know the actual distance until we find the path, because all sorts of things can be in the way (walls, water, etc.). You are given one way to calculate H in this tutorial, but there are many others that you can find in other articles on the web. float F_Score = G_Score + H_Score; if (spotLinkedToCurrent.IsFlagSet(Spot.FLAG_WATER)) { F_Score += 30; } int score = GetTriangleClosenessScore(spotLinkedToCurrent.location); score += GetTriangleGradiantScore(spotLinkedToCurrent.location, gradiantMax); F_Score += score * 2; if (!spotLinkedToCurrent.SearchScoreIsSet(currentSearchID) || F_Score < spotLinkedToCurrent.SearchScoreGet(currentSearchID)) { // shorter path to here found spotLinkedToCurrent.traceBack = currentSearchSpot; spotLinkedToCurrent.traceBackDistance = G_Score; spotLinkedToCurrent.SearchScoreSet(currentSearchID, F_Score); prioritySpotQueue.Enqueue(spotLinkedToCurrent, -F_Score); } }