Computer games take on many different forms, so it is difficult to come up with useful programming tips and examples that would apply to all games. I have two principles that I follow in game design. One is to delegate the responsibilities of managing the game world to simpler objects that communicate with one other. Another is to search for a responsive, intuitive interface-some natural way that players can communicate their will to the game's world. With these ideas for designing an effective interface and an efficient internal representation of the game world, a good game concept can be turned into a good game. Without these designing ideas, however, this same concept easily could turn into one of the many "cr-applets" on the net.
I have illustrated these ideas with the game CopyCat. I broke down CopyCat into its functional parts, which communicate with each other to present and manage the game's world. In general, decomposing a game into usable objects can be very tricky. Deciding where to draw the lines between objects depends on not only the specific original intended uses of the objects, but also on possible future uses. Developing an eye for pattern recognition, along with learning good data structures, will help you develop this skill of decomposition. For beginning game programmers to learn this skill, it is good practice to constantly revise and redesign the internal workings of games to try to push the flexibility of their games. The flexibility of a game is a good measure of how well the internal workings of the game were thought out.
Also, CopyCat has a responsive intuitive interface. The essence of CopyCat's interface is that for every action the player makes in the game, there is a response so that the player knows the computer understood the attempted action. Every time the player "picks up the shape," for example, it raises slightly; the shape lowers when the player lets go of it. The control of the rolling allows for many intermediate positions. Generically, this is like a conversation between the player and the game. The player says, "blah blah blah," and the game has some response. The game may merely nod so that the player can continue talking, knowing that the last statement was understood; or, the game may do something more noticeable, depending on what the player has said. In designing the interface, the programmer is designing a limited language that the player uses to interact or converse with the game. The simpler or more familiar the language, the easier it is for the player to play the game. In CopyCat, the interface is relatively easy because it draws on people's experiences with the physical world: rolling and sliding shapes, ratchets, ink stamps, puzzles, and probably a lot more. This physicality, along with the drag-and-drop idea, makes the interface/language familiar to a lot of people.