2012-02-06 13 views
5

डिज़ाइन पैटर्न लागू करने वाले निम्नलिखित वर्गों को डिज़ाइन करते समय सबसे अच्छा तरीका क्या होगा?कार्ड गेम क्लासेस के लिए ओओपी डिज़ाइन

  • डेक - addCard, सौदा, फेरबदल, getTopCard, removeTopCard, removeAllCards
  • हाथ - addCard, removeCard, getCard, removeAllCards
  • DiscardPile - addCard, getTopCard , हटाएं टोपकार्ड, हटाएंअल्कार्ड
  • MeldPile - addCard, removeAllCards

(MeldPile तालिका में सभी melds आयोजित करता है।)

मेरे लिए, मुझे लगता है कि getTopCard और removeTopCard सिर्फ getCard और removeCard का एक आवरण के रूप में, यह सिर्फ कार्ड की शीर्ष स्थिति प्राप्त करता है और इसे getCard या removeCard पर पास कर देता है।

क्या मुझे रचना का उपयोग करना चाहिए? रणनीति पैटर्न? या बस कार्डपाइल नामक एक और कक्षा बनाएं और इसे उपरोक्त वर्ग की मूल श्रेणी के रूप में उपयोग करें? अगर आप इस पर नमूना कोड प्रदान कर सकते हैं तो वास्तव में सराहना करें।

+3

सबसे अच्छा तरीका निपटने के तर्क को लागू करता है के लिए होता है सिर्फ लेखन शुरू करने के लिए है गेम नियम और अपने डिजाइन को स्वाभाविक रूप से विकसित करने दें। यदि आपके पास कोई विशिष्ट प्रश्न है उदा। 'मैं एक नियम लागू करने की कोशिश कर रहा हूं, जहां कोई खिलाड़ी कार्ड बजाता है तो दूसरे नाटक को त्यागना चाहिए, मुझे किस पैटर्न का उपयोग करना चाहिए?' यह उत्तरदायी हो सकता है। –

+1

+1 "अपने डिजाइन को स्वाभाविक रूप से विकसित करने दें" – radarbob

+0

उप-परमाणु कण आधार वर्गों में "स्वाभाविक रूप से होने वाली" कक्षाओं को भंग करने से सावधान रहें। कक्षा पदानुक्रमों को अनावश्यक रूप से सामान्य और अनावश्यक प्रसंस्करण के साथ बहुत गहराई मिल सकती है। यदि आप * प्राकृतिक डिजाइन विकास * को अधिक सामान्य आधार के लिए कॉल करते हैं, तो आप हमेशा नई प्रतिक्रिया प्राप्त कर सकते हैं। – radarbob

उत्तर

6

मुझे लगता है कि आप नीचे एक डेक कक्षा के साथ जो चाहते हैं उसे प्राप्त कर सकते हैं जो अनिवार्य रूप से Stack के आसपास एक रैपर है, मुझे नहीं लगता कि कोई विशेष डेक/ढेर/हाथ क्यों नहीं चाहेगा तरीकों।

class Deck { 
    private Stack<Card> cards = new Stack<Card>(); 

    public Deck() { } 

    public Deck(int numberOfCards) { 
     for (int i=0; i<numberOfCards; i++) { 
      cards.push(CardFactory.createCard(i)); 
     } 
    } 

    private void shuffle() { 
     Collections.shuffle(this.cards); 
    } 

    public void sort() { 
     Collections.sort(this.cards); 
    } 

    public void removeAllCards() { 
     this.cards.removeAllElements(); 
    } 

    public void removeCard(Card c) { 
     int i = this.cards.search(c); 
     this.cards.remove(i);    
    } 

    public Card getCard(Card c) { 
     int i = this.cards.search(c); 
     return this.cards.get(i); 
    } 

    public Card getTopCard() { 
     return this.cards.pop(); 
    } 

    public Card getNthCard(int i) { 
     return this.cards.get(i); 
    } 

    public Card addCard(Card c) { 
     this.cards.push(c); 
    } 

} 

केवल वास्तविक समस्या मैं देख deal() विधि के साथ और है कि क्या यह एक डेक की जिम्मेदारी होनी चाहिए? निजी तौर पर मुझे ऐसा लगता है नहीं होगा, यह मेरे लिए सुराग को लगता है कि शायद आप एक खिलाड़ी वर्ग और एक व्यापारी वर्ग प्लेयर प्रदान करता है और एक डेक

class Player() { 
    protected String name; 
    protected Deck hand = new Deck(); 

    public void addCard(Card c) { 
     this.hand.addCard(c); 
    } 

    // ..... 
} 

class Dealer() extends Player { 
    private Deck deck; 

    public Dealer(int deckSize) { 
     this.deck = new Deck(deckSize); 
    } 

    public void deal(Player[] players, int numberOfCards) { 
     for (player in players) { 
      for (int i=0; i<numberOfCards; i++) { 
       player.addCard(this.deck.getTopCard()); 
      } 
     } 
    } 

    // ..... 
} 
+0

मुझे वास्तव में समझ में नहीं आया कि एक हल्का ढेर क्या था या थोड़ा सा एमटीजी लगता है क्या यह किसी खिलाड़ी से संबंधित है? उदाहरण के लिए एक एमटीजी स्टाइल गेम (मेरे संक्षिप्त अनुभव से यह खेल रहा है) खिलाड़ी के पास एक डेक होगा, एक हाथ, तत्व शक्ति कार्ड कार्ड को बजाएगी, और राक्षस के खेले जाने वाले हिस्से में मुझे लगता है कि मैं 'डेक' हो सकता हूं, हालांकि आप चाहें 'डेक' का आधार वर्ग बनाएं जो 'shuffle() 'जैसी विधियों को लागू नहीं करता है और' कार्ड के कम ढेर ' –

+0

के रूप में उपयोग करता है, मैं सौदा विधि के संबंध में आपसे सहमत हूं, यह लेनदेन के रूप में एक डेक का हिस्सा नहीं होना चाहिए डीलर का व्यवहार है। एक मिश्रित ढेर कार्ड का एक सेट है (तीन तरह का, चार प्रकार का और सीधे) तालिका पर पोस्ट किए गए एक खिलाड़ी से संबंधित है।मैं बस यह तय नहीं कर सकता कि क्या कार्यान्वित करना है क्योंकि अधिकांश ओपन सोर्स कार्ड गेम डेक, हैंड और डिस्कार्ड ढेर के लिए अलग-अलग वर्ग का उपयोग करते हैं और दूसरे ने सिर्फ कार्डपाइल बनाया है और इसे बेस क्लास के रूप में उपयोग किया है। – Zack

+0

मैं एक सिंगल कार्डपाइल बेस क्लास का उपयोग करके शुरू करना चाहता हूं जो वहां से कार्ड जोड़ने और निकालने में सक्षम होगा, जहां आप एक 'डेक' हो सकते हैं जिसे शफ़ल किया जा सकता है और 'जादुई रूप से बनाया गया', 'MeldPile' इसमें कार्ड के लिए अपने नियम हैं, एक 'हैंड' जो अधिकतम कार्ड की अनुमति दे सकता है और त्यागने के नियमों को निर्धारित कर सकता है। सबसे महत्वपूर्ण बात यह है कि मुझे लगता है कि कुछ शुरू करने के लिए बेहतर होगा, 'पैटर्निटिस' से बचें और यदि आवश्यक हो तो अपने कोड को रीफैक्टर/ऑप्टिमाइज़ करें। –