我正在爲自己的樂趣和培訓而設計一款小遊戲。遊戲的真實身份與我的實際問題毫不相干,假設它是Mastermind遊戲(它實際上是:)控制檯和GUI的通用設計
我在這裏的真正目標是有一個接口IPlayer
它將用於任何玩家:計算機或人,控制檯或gui,本地或網絡。我也打算有一個GameController,它只處理兩個IPlayer
。
的IP層接口會是這個樣子:
class IPlayer
{
public:
//dtor
virtual ~IPlayer()
{
}
//call this function before the game starts. In subclasses,
//the overriders can, for example, generate and store the combination.
virtual void PrepareForNewGame() = 0;
//make the current guess
virtual Combination MakeAGuess() = 0;
//return false if lie is detected.
virtual bool ProcessResult(Combination const &, Result const &) = 0;
//Answer to opponent's guess
virtual Result AnswerToOpponentsGuess(Combination const&) = 0;
};
的GameController類會做這樣的事情:
IPlayer* pPlayer1 = PlayerFactory::CreateHumanPlayer();
IPlayer* pPlayer1 = PlayerFactory::CreateCPUPlayer();
pPlayer1->PrepareForNewGame();
pPlayer2->PrepareForNewGame();
while(no_winner)
{
Guess g = pPlayer1->MakeAguess();
Result r = pPlayer2->AnswerToOpponentsGuess(g);
bool player2HasLied = ! pPlayer1->ProcessResult(g, r);
etc.
etc.
}
通過這種設計,我願意做GameController類不變,即是,我在其中填充了正義的遊戲規則,沒有其他任何東西,所以既然遊戲本身已經建立,那麼這個類就不應該改變。對於遊戲機遊戲來說,這種設計可以完美運行我會HumanPlayer
,在其MakeAGuess
方法會從標準輸入讀取Combination
和CPUPlayer
,這會在一定程度隨機生成它等
現在,這裏是我的問題:IPlayer
接口,隨着GameController
類,在本質上是同步的。我無法想象當GUIHumanPlayer
的MakeAGuess
方法必須等待(例如,某些鼠標移動和點擊)時,我將如何實現具有相同GameController
的遊戲的GUI變體。當然,我可以啓動一個等待用戶輸入的新線程,而主線程會阻塞,以模仿同步IO,但不知何故,這個想法讓我感到厭惡。或者,也可以將控制器和播放器設計爲異步。在這種情況下,對於控制檯遊戲,我必須模仿異步,這比第一個版本更容易。
您是否對我的設計和我對選擇同步或異步設計的擔憂發表評論?另外,我感覺我比GameController類對玩家類承擔了更多的責任。等等。
非常感謝您提前。
P.S.我不喜歡我的問題的標題。隨意編輯:)
我喜歡標題:-) – 2011-03-07 12:33:36
我刪除了C#標記,因爲在這個問題附近沒有C#任何地方。 – Puppy 2011-03-07 12:46:40
由於語言無關緊要,我希望得到C#專家的意見 – 2011-03-07 14:36:17