Let me put it this way as a game programmer who recently returned to University to get my degree. You DO NEED the degree to do anything remotely useful in game development.
Topics that you will need to know that only Univeristy can teach you are:
- 3D graphics (not how to use OpenGL or DX but the actual algorithms used)
- Multivariable calculus and differential equations (required for graphics and animation)
- Linear Algebra (required for graphics and animation)
- Data Structures (required in all programming)
I know the saying that you can learn anything on your own but in reality, it's not true unless you're Isaac Newton. The programming language the school uses to teach you is irrelevant as your concern should be the algorithms and how to implement them. So stay in school, study hard and apply what you learned a little at a time.
I do Flash game programming professionally and I'm not really aware that Farmville uses CSS for its in game menus (but I'm not sure). However I think Actionscript and Flash are actually great tools for rapidly prototyping a game and is currently the de facto standard for games on the web. Whether that remains in the near future is a bit uncertain with the push towards HTML 5 however I still believe it is a valuable tool to use for fast prototyping and maybe even for a portfolio.
You should make use of the Creative Suite demo before deciding whether to purchase as the investment is fairly heavy. I know you can do open source Actionscript development but I think you'd be limiting your potential to create great things without the Flash IDE.
As stated use a heap based priority queue to store the open list. Do not use a closed list at all, just store a flag on each tile representing whether it's open, closed or neither. Only clear the cost and parent pointers on the tile when you visit it for the first time in a particular A* session so that would mean encapsulating the algorithm in a class with a static variable that always increments a search id. Use hierarchical pathfinding A*. Hope that helps.
You might want to look in to Hierarchical Pathfinding A* (HPA*). Secondly, it is quicker to store the open list in a heap based priority queue as opposed to a linked list. Your algorithm is extremely slow because you're potentially looping through thousands of entries to find the lowest cost node. As you insert nodes into the open and closed list, you should flag the nodes as being in the list so that you never have to search. Another point to think about is that the costs and parent pointers for the nodes need to be cleared when the next AI entity begins it's A* search. A quick way to handle this is to use a static variable to give each A* request a unique id and then tag each node with the current search id when it's visited for the first time in that search instance.