One of my programming electives I took was CS380 which was Artificial Intelligence for Games by Steve Rabin. During the semester, we had an ongoing and growing project that explored Behavior Trees, Terrain Analysis, and Pathfinding using A*.
A* is the union of two search algorithms Dijkstra and Greedy Best-First Search. Dijkstra is an extensive algorithm used to navigate grid and grid/graph-like spaces to calculate the ideal path, which is does perfectly if implemented correctly, but Dijkstra can be quite slow as it checks all nodes around the "Player" first and expands in a ripple pattern. Greedy Best-First is a search algorithm that prioritizes nodes calculated via a value called Heuristics to be likely candidates to be the optimal path and cut down algorithm costs. By combining the two, you can get A*, an algorithm that fuses the best of both algorithms with some edge cases.
The code snippet below is my implementation of A*. If I could go back and work on that assignment, I would optimize the code by figuring how to do the algorithm without having to sort the whole Open List with every node investigated.