I think that you are wrong to do it the way you are.
Sledge is totaly right, in that the shape Type shouldnt be dependent apon the Game type at all, otherwise there is no point in making it a full object.
I dont have your game design document, so obviously Im shooting in the dark, but the shape type shouldnt modify
anything other than the shapes, it shouldnt even be aware of what its drawing the shapes to.
I would sit down and think again about how you have split your game design up into its types, and see if there are places that type "Shape" is doing things that Tyep "Game" or Type "GameDisplay" shouuld be doing.
why have a 'game' type when you're only going to need one instance of it
Its a singleton, and the most basic reason is to hold all the globals in a seperate name space
I was planning to have 2-player "competitive" tetris ie two games side by side. Is it still a bad idea?
Thats not a bad idea at all, I would be tempted to have a "Game" type for the single globals and a "Player" type for things that each player would need to have different from the other players ie Display, score etc
I agree with the ppl above who said that they dont like cyclic referenceing, but that doesnt mean that its wrong, just that probably one or both of the types were written/concieved before the full design doc was written. However I have a type "Chicken", which becomes a type "Egg", which becomes a type "Chicken" etc.
As a General rule, think what parameters an old fashioned subprogram would need, so for example the Update you mentioned.
Update needed Shape info and game info.
Well we know that Game is going to contain shapes so the main update should be in Game, which does all the stuff Shape cannot do
because it doesnt know game exists then game passes update to each shape, which does its update stuff.
All this stuff depends totaly on how youve organised the whole game, but I would try when whenever possible to ensure that any type/object is as idependent of all the other objects that might contain it, as possible