Greatest Programming Experiences;
-Learning to start small. My first project(finished) was a Tic-Tac-Toe game....small right? It should have been, but by the end it had single player, 2 player and a full networked multiplayer version. The problem with this is, I did not know anything when I brought the original 2 player version over form a console (DOS not X-Box, etc) version. So this project took over 6months to complete (not working on it everyday but it took a long time).
-Don't jump right into 3D. For me, my latest math class was Grade 11 Functions, so when I tried to write my first game; a FPS (see point one as well) it took me weeks of working on it all day to just get a few models on the screen correctly and than trying to program camera controls, without the math...eeek. Needless to say I was very discouraged and stopped all game related development for months. After a long time I came back and realized the downfalls. 1)I started too big. 2)I did not know anything other than how to PLAY a FPS and 3)I really needed to learn a lot before I could do this. As much as (I thought) I didn't like 2D, I jumped to it. Now I can write a fairly simple 2D game in a couple of weeks and it feels great to finish projects and see things come together.
-People always say do not write engines, write games. To an extent I fully agree, but personally for me jumping right onto an Engine, I didn't feel like I was learning anything. I than started to write my own engine (if you could call it that). Let me clarify though, my engine was not really for other people to use or even me if I was going commercial, it was to learn the different building blocks of an engine, how they work, what even defines an engine. Doing this, I learnt a huge amount about game development and now feel like I could use someone's engine and actually have a rough idea of what is going on.
-Have a plan. I used to just jump right into games but the problem was that I could (kindof?)get a game done but there was a lot of frustration about where I was going with things, and it was very easy to loose motivation because I had no proof of what was done. Now every project has a GameNote.txt file. In that note it has my milestones and intentions of the project. An example can be seen below.
Game Note Example:
White boarding - this step is where I brainstorm all of objects required (of course I never get ALL of them but most) and roughly their member variables and support methods they will have (all in psuedo code, not actually writing implementations for methods).
Modeling the objects - This is where I actually create files and the basic model's outlines (variables they will need, support methods).
Render main menu -I always like to get the main menu up and running right away, so you initially have something done and working
Implement the game states -This is handling the transition from menus and what not
Render the main play area -Whether this is a Tic-Tac-Toe board or chess it doesn't matter its all the same.
Write game play -this is usually broken into several steps depending on the size of the game (such as catch keyboard input, keyboard input, placement algorithms, etc)
Render the HUD
A note about this simple template is that you can add in as many steps as you want and break down all the tasks however you want, but the purpose is to have a road map but also if you start to feel unmotivated, you can look at this and say "Wow, I already have this, this, and this done". For me this model for writing games is working very well. Keep in mind I only write little games at this time as I am still a beginner.
I am like just about every other developer, we do not like to plan, we like to just jump right in. But the truth is, that if you take the time to push through as much planning as you can up front, your overall development will be a lot faster and you will have a cleaner implementation.