This is a picture of a locally hosted game with two AI and one remote player. The arrows represent who functions on what class. They all connect to a facade (interface) class which instructs the engine (cGame) when everything is ready to compute. The player is updated on changes in the game state by an observer (modeled after java's Observer class) which tells the userinterface class. This class has all the models/sound/textures through cMedia. It also has inputs (keyboard, mouse) (not shown). The data is sent to cPlayer, a superclass for all the types of players. For the particular local player, it simply passes on information from the userinterface.
The remote player would likely see this. Notice that only one player talks to the facade. Here, the dotted lines represent network communication. The other players do exist, but thtere is no engine in this model to receive the input. There's reason an AI could not exist here and also talk to the server through the facade, however that would increase network traffic. By only having the engine on one computer, desynchronization is nearly a moot point, and players will have a hard time cheating (except the one hosting the game).
Again this is an upper level suggestion. There are many classes involved which aren't shown, and communication is simplified. Hopefully, communication isn't too simplified.
So... What does everyone think?