9. f3 was a blunder, as it gave away the e pawn with check, guaranteeing that Black would have enough compensation for the sacrificed knight. 18. Ba4 didn't serve any real purpose. 19. Nb5 was an obvious blunder, as it gave away the bishop for free. 20. Nxa8 was a blunder, as White could have played Na3 or Nc3 to defend both the hanging knight and pawn. 21. Nxa8 was a blunder, as White could have moved the queen away from d2 in order to give the king an escape square.
If you want to be able to evaluate the strength of your engine, you need to either play with time controls that won't cause you to blunder repeatedly, or you need to spend a few months improving your tactical abilities.
Me v. the Engine I created

OK, so I imagine this is a rare topic of discussion, but I am in great need of advice here-- I cannot defeat my own chess engine. I know of one extra feature I need to add to my program (Quiescent searching with SEE, if that means anything to anyone out there), but my biggest problem is that I cannot see anything wrong with my program! (What an ironic situation, right?)
I started playing chess again only to create an AI-- my expecatation was that it would take so long that by the time I was ready to have a presentable result, I would be a pretty strong (1400-1500 by my standards) player, anticipating that it would take maybe a few months to create my program. Unfortunately (for lack of a better word) it only took two weeks. :P
I still need to add an opening book (as you can tell by the game below, my program has no idea what the hell it's doing in the first few moves), but other than that there is no clear problem with this program, at least to my untrained eye. This game was between me and it just now, with 5-minute time controls.
I was low on time after a third of the game, which explains a few misconceived ideas. By the time checkmate was on the horizon, I had maybe 15 seconds on the clock anyways.