/// <summary> /// Calculate A* path between two Cells /// </summary> /// <param name="startLocation"></param> /// <param name="destination"></param> /// <returns>A* Path</returns> public List <PathNode> CalculatePath(Cell startLocation, Cell destination, bool fourNeighbours = false) { // Reset Game World's pathfinding scores to default for (int i = 0; i < _game.X; i++) { for (int j = 0; j < _game.Y; j++) { _board[i, j] = new PathNode(_game.GetCell(i, j)); _board[i, j].GScore = int.MaxValue; _board[i, j].CameFrom = null; } } // Get starting Cell, add to open list and begin AStar search PathNode startNode = _board[startLocation.X, startLocation.Y]; PathNode destNode = _board[destination.X, destination.Y]; startNode.GScore = 0; startNode.HScore = CalulateMoveCost(startNode, destNode); openListP = new List <PathNode> { startNode }; closedListP = new List <PathNode>(); while (openListP.Count > 0) { PathNode currentNode = GetLowestFCost(openListP); if (currentNode == destNode) { // path found! return(TracePath(destNode)); } openListP.Remove(currentNode); closedListP.Add(currentNode); List <PathNode> neighbours = FindNeighbours(currentNode, fourNeighbours); foreach (PathNode neighbour in neighbours) { if (closedListP.Contains(neighbour)) { continue; } int tenGScore = currentNode.GScore + CalulateMoveCost(currentNode, neighbour); if (tenGScore < neighbour.GScore) { neighbour.CameFrom = currentNode; neighbour.GScore = tenGScore; neighbour.HScore = CalulateMoveCost(neighbour, destNode); if (!openListP.Contains(neighbour)) { openListP.Add(neighbour); } } } } return(null); }
/// <summary> /// Calculate A* path between two Cells /// </summary> /// <param name="startLocation"></param> /// <param name="destination"></param> /// <returns>A* Path</returns> public List <Cell> CalculatePath(Cell startLocation, Cell destination) { // Reset Game World's pathfinding scores to default for (int i = 0; i < _game.X; i++) { for (int j = 0; j < _game.Y; j++) { Cell cell = _game.GetCell(i, j); cell.GScore = int.MaxValue; cell.CameFrom = null; } } // Get starting Cell, add to open list and begin AStar search Cell startCell = _game.GetCell(startLocation); Cell destCell = _game.GetCell(destination); startCell.GScore = 0; startCell.HScore = CalulateMoveCost(startCell, destCell); openList = new List <Cell> { startCell }; closedList = new List <Cell>(); while (openList.Count > 0) { Cell currentCell = GetLowestFCost(openList); if (currentCell == destCell) { // path found! return(TracePath(destCell)); } openList.Remove(currentCell); closedList.Add(currentCell); List <Cell> neighbours = FindNeighbours(currentCell); foreach (Cell neighbour in neighbours) { if (closedList.Contains(neighbour)) { continue; } int tenGScore = currentCell.GScore + CalulateMoveCost(currentCell, neighbour); if (tenGScore < neighbour.GScore) { neighbour.CameFrom = currentCell; neighbour.GScore = tenGScore; neighbour.HScore = CalulateMoveCost(neighbour, destCell); if (!openList.Contains(neighbour)) { openList.Add(neighbour); } } } } return(null); }