के लिए सामान्य डिजाइन मैं अपने मजेदार और प्रशिक्षण के लिए एक छोटा सा गेम तैयार कर रहा हूं। गेम की वास्तविक पहचान मेरे वास्तविक प्रश्न के लिए काफी अप्रासंगिक है, मान लीजिए कि यह Mastermind गेम है (जो वास्तव में है :)कंसोल और जीयूआई
मेरा असली लक्ष्य यहां इंटरफ़ेस IPlayer
है जिसका उपयोग किसी भी प्लेयर के लिए किया जाएगा: कंप्यूटर या मानव, कंसोल या गुई, स्थानीय या नेटवर्क। मैं गेमकंट्रोलर रखने का भी इरादा रखता हूं, जो केवल दो IPlayer
एस के साथ सौदा करेगा।
iPlayer इंटरफेस कुछ इस तरह दिखेगा:
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
वर्ग के साथ साथ, उनकी प्रकृति में तुल्यकालिक हैं। मैं कल्पना नहीं कर सकता कि मैं GameController
के साथ गेम के जीयूआई संस्करण को कैसे कार्यान्वित करूं, की MakeAGuess
विधि के लिए प्रतीक्षा करना होगा, उदाहरण के लिए, कुछ माउस आंदोलनों और क्लिक। बेशक, मैं एक नया धागा लॉन्च कर सकता हूं जो उपयोगकर्ता इनपुट की प्रतीक्षा करेगा, जबकि मुख्य धागा अवरुद्ध होगा, ताकि सिंक्रोनस आईओ की नकल करने के लिए, लेकिन किसी भी तरह से यह विचार मुझे घृणा करता है। या, वैकल्पिक रूप से, मैं नियंत्रक और खिलाड़ी दोनों को असीमित होने के लिए डिजाइन कर सकता था। इस मामले में, एक कंसोल गेम के लिए, मुझे एसिंक्रोनसनेस का अनुकरण करना होगा, जो कि पहले संस्करण की तुलना में आसान लगता है।
क्या आप कृपया मेरे डिजाइन और सिंक्रोनस या असिंक्रोनस डिज़ाइन चुनने के बारे में मेरी चिंताओं पर टिप्पणी करेंगे? साथ ही, मुझे लगता है कि मैंने गेमकंट्रोलर क्लास की तुलना में प्लेयर क्लास पर अधिक ज़िम्मेदारी डाली है। आदि, आदि
अग्रिम में बहुत बहुत धन्यवाद।
पीएस मुझे अपने प्रश्न का शीर्षक पसंद नहीं है। संपादित यह :)
मुझे शीर्षक पसंद है :-) –
मैंने सी # टैग हटा दिया, क्योंकि इस प्रश्न के पास कहीं भी सी # नहीं है। – Puppy
चूंकि भाषा अप्रासंगिक है, इसलिए मैं सी # विशेषज्ञों की राय के साथ-साथ –