I wanted the enemies in my games to feel alive. Finding a way around an obstacle was part of that. I taught myself A* in C++, with DarkGDK drawing the result, because I wanted to understand how to make that decision myself.
Letting an engine supply the enemy behaviour felt like cheating to me at the time. DarkGDK could handle the drawing while I worked out what made an enemy seem intelligent, even if that meant building each part before I had much of a game.
The hardest part of the pathfinding project was how I stored the data. My first approach was too slow. That sent me into binary trees, binary search trees and binary heaps. Learning those structures was a bigger hurdle than I'd expected from a project about getting an enemy across a map.
For years I called A* the project I was most proud of. The first recording shows it finding paths in 2D and 3D, in a demo I later recorded for my university submission.
The reason why I was so proud, was because no-one had taught me at all how to do anything like this. So the learning came from library books, forums and late night debugging sessions.
It was one of roughly ten small projects where I tried to isolate a piece of game AI. The second recording shows another of them, a detection system simulating what an enemy could see. Pathfinding answered where an enemy could go. This tool explored what it could notice.
I never brought all those parts together into a full game. Life always finds a way to get in the way of your side projects. Instead, I had a collection of tools for making enemies, each answering a different question about how they should behave.