2010-10-25 9 views
6

मान लें कि मैं स्क्रैबल के अपने संस्करण को कार्यान्वित कर रहा हूं। वर्तमान में मेरे पास Board कक्षा है जिसमें Squares बहुत सारे हैं। Square बदले में IBonus और Piece से बना है। बोनस कार्यान्वयन वास्तव में स्क्रैबल के लिए सामान्य बोनस है, लेकिन यह संभव है कि मैं खेल को मसाला देने के लिए कुछ नया और मुड़ बोनस जोड़ने का प्रयास कर सकता हूं - यहां लचीलापन सर्वोपरि है!स्क्रैबल के खेल कार्यान्वयन के लिए एक लचीला और एक्स्टेंसिबल बोनस सिस्टम डिज़ाइन करना

alt text

थोड़ी देर के लिए सोच के बाद मैंने निष्कर्ष पर पहुंचे कि IBonus कार्यान्वयन काम करने के लिए, वे पूरे Board और भी इसकी वर्तमान स्थिति (Board पर पता करने के लिए की आवश्यकता होगी, तो यह यह जहां जानता है है और यह उस टुकड़े की जांच कर सकता है जो बोनस के समान वर्ग में है)। यह मुझे मूल रूप से खराब करता है क्योंकि इसे पूरी तरह से जानकारी की आवश्यकता होती है।

तो, मेरा निष्पक्ष कार्यान्वयन Board को IBonus.calculate() विधि, IBonus.calculate(Board board, Point position) पर तर्क के रूप में पास करना होगा।

इसके अलावा, ऐसा लगता है कि यह एक परिपत्र संदर्भ बनाता है। या मैं गलत हूँ? alt text

मैं इस दृष्टिकोण की तरह कण नहीं करता, इसलिए मैं अन्य संभावित दृष्टिकोण ढूंढ रहा हूं। मुझे पता है कि मैं calculate को कंक्रीट क्लास के बजाय इंटरफ़ेस स्वीकार कर सकता हूं, यानी calculate(IBoard board) लेकिन मैं आईएमओ जो पहले मामले की तुलना में बेहतर नहीं है।

मुझे डर है कि मेरे वर्तमान कार्यान्वयन पर बहुत ध्यान केंद्रित किया जा रहा है ताकि कम से कम इस समस्या के समाधान के साथ-साथ पूरे अलग-अलग डिज़ाइनों के बारे में सोच सकें। शायद मैं पूरे गेम को फिर से आर्किटेक्ट कर सकता हूं और अन्य जगहों पर बोनस कर सकता हूं, इसलिए यह इस गणना को सुविधाजनक बनाएगा? शायद मैं उन्हें Board पर रखने पर बहुत ध्यान केंद्रित कर रहा हूं? मुझे उम्मीद है कि इस समस्या के लिए अन्य दृष्टिकोण हैं!

धन्यवाद

+1

अच्छा चित्र –

+0

क्या उपकरण आपको आरेख बनाने के लिए उपयोग किया था के लिए +1? –

+0

yUML, यह आपको उन्हें बनाने और उन्हें ऑनलाइन होस्ट करने की अनुमति देता है। –

उत्तर

4

मुझे लगता है बोर्ड खेल के दृश्य राज्य है, और इस तरह के रैक (प्लेयर प्रति एक,) और एक DrawPile के रूप में अन्य वस्तुओं होगी।

"डबल स्कोर यदि शब्द में वास्तविक (गैर-खाली) ज़ेड है" - आपको शब्द, या बोर्ड और शब्द की स्थिति में पास करने की आवश्यकता होगी।

"डबल स्कोर यदि बोर्ड बोर्ड पर सबसे लंबा है" को पूरे बोर्ड की आवश्यकता है।

"डबल स्कोर यदि शब्द का पहला अक्षर ड्रॉपाइल से यादृच्छिक रूप से चयनित पत्र से मेल खाता है" के लिए ड्रायफाइल कोर्स की आवश्यकता होती है।

तो मेरे लिए यह आपके द्वारा लागू नियमों पर निर्भर करता है। मैं बोर्ड को आईबोनस स्कोर() कार्यान्वयन में पास करने में सहज महसूस करूंगा।

संपादित करें - अधिक विचार।

तो बोर्ड में 17x17 वर्ग, या जो कुछ भी है। मैं बोर्ड के प्रत्येक वर्ग में एक आईबोनस कार्यान्वयन आवंटित करता हूं (एक कार्यान्वयन होगा जिसे PlainEmptySquare कहा जाता था।) आपको केवल एक बार आईबोनस के प्रत्येक कार्यान्वयन को तुरंत चालू करने की आवश्यकता होगी - इसे कई बार संदर्भित किया जा सकता है। मैं शायद कम सड़क ले जाऊंगा और आवश्यक तर्कों में गुजरने के लिए प्रत्येक को स्पष्ट रूप से तत्काल कर दूंगा। अगर एक प्रकार को बोर्ड की आवश्यकता होती है, तो उसे पास करें। अगर किसी को ड्राप्ले की ज़रूरत है, तो उसे पास करें।आपके कार्यान्वयन में, आपके पास शायद कुरूपता की 12 लाइनें होंगी।/निम्न काम कर सकते हैं की तरह कंधे उचकाने की क्रिया

+0

मैं सहमत हूं; यदि आप पागल बोनस डिजाइन करने के लिए सबसे लचीलापन चाहते हैं तो आपको सबसे अधिक जानकारी उपलब्ध है। –

1

कुछ:

CurrentGame एक Board, जो Squares का संग्रह है है। एक Square एक IBonus हो सकता था, लेकिन वहाँ एक Square पर कोई Calculate() तरीका है। Square में Piece हो सकता है, और Piece में Square हो सकता है (यानी एक वर्ग खाली हो सकता है या नहीं हो सकता है, और एक टुकड़ा बोर्ड पर रखा जा सकता है या नहीं)।

Board में calculateScoreForTurn() विधि भी है जो Pieces का संग्रह स्वीकार करेगी जो उस बारी के लिए बोर्ड पर रखे गए टुकड़ों का प्रतिनिधित्व करती है। Board टुकड़े और वर्गों है कि बस में रखा गया है, साथ ही आसपास या काटते हुए टुकड़े और वर्गों के बारे में सभी जानकारी जानता है (यदि लागू हो) और इस प्रकार सभी स्कोर की गणना करने के लिए आवश्यक जानकारी नहीं है।

+0

लेकिन फिर आप विभिन्न प्रकार के बोनस को कैसे संभालेंगे? क्या किसी भी अलग-अलग बोनस के तर्क को एक अलग वर्ग में encapsulated नहीं होना चाहिए? –

+1

यह शायद ओओ डिज़ाइन बिंदु से आदर्श नहीं है, लेकिन मेरे लिए यह एक ही स्थान पर मौजूद सभी "नियम तर्क" के लिए बेहतर लगता है, जो एक आईबोनस ऑब्जेक्ट (जो एक टाइल से संबंधित है) की तुलना में पूरे काम से संबंधित है मंडल। आपके पास शायद एक अलग स्कोरर ऑब्जेक्ट हो सकता है, इसलिए आप इसे बोर्ड और टुकड़े के संग्रह को पास करते हैं, और यह उस मोड़ के लिए स्कोर देता है। ऐसा लगता है कि एक स्कोरर सभी नियमों को जानता है। – jwaddell

+1

मुझे लगता है कि एक विशेष आईबोनस केवल उस विशेष टुकड़े से अधिक प्रभावित कर सकता है (जिसमें पिछले मोड़ों पर रखे टुकड़े शामिल हैं) का अर्थ है कि आपको अपने स्क्वायर में अपनी स्कोरिंग विधि को समाहित नहीं करना चाहिए। – jwaddell

1

यह जानकारी

मुझे लगता है कि यह आवश्यक है की एक पूरी बहुत कुछ पता करने की जरूरत है मुझे के रूप में बुरा हमलों मूल रूप से के रूप में। आप बस बोर्ड के संदर्भ में गुजर रहे हैं, वास्तव में बड़ी संख्या में डेटा को स्थानांतरित नहीं किया जा रहा है।

1

बोर्ड को शायद किसी दिए गए दौर के लिए स्कोरिंग करना होगा। चूंकि प्रत्येक टाइल रखा जाता है, बोर्ड इसके बारे में ध्यान देता है। जब पिछले टाइल (एक मोड़ के लिए) रखा गया है, बोर्ड ने पहले रखा टाइलें वर्तमान बारी है कि वर्गों नए जोड़े गए टाइल (इन वर्गों की गणना की जाएगी के लिए बोनस) है के सभी और सभी मिल चाहिए " reusing "।

उदाहरण के लिए, कैट

सी ए टी

सी पर डबल पत्र स्कोर गिर जाता है खेलते हैं। तो, मोड़ के लिए स्कोर सी वैल्यू * 2 + ए वैल्यू + टी। वैल्यू है।

अगला खिलाड़ी CATS बनाने के लिए एक एस देता है। एस ट्रिपल वर्ड स्कोर पर पड़ता है। तो, मोड़ के लिए स्कोर है (सीवेल्यू + ए वैल्यू + टी। वैल्यू + एस वैल्यू) * 3। जब एक टाइल का बोनस लागू किया गया है, तो इसे "निष्क्रिय" होना चाहिए ताकि उस टाइल के भविष्य "पुन: उपयोग" को बोनस भी न मिले।

निहितार्थ यह है कि कुछ बोनस स्क्वायर में रखे टाइल को लागू करते हैं जबकि अन्य टाइल्स के संग्रह पर लागू होते हैं जो व्यक्तिगत अक्षरों के लिए बोनस के बाद नया शब्द बनाते हैं।

को देखते हुए एक या अधिक वर्गों है कि एक मोड़ के दौरान टाइल (रों) के साथ भर दिया गया है, बोर्ड या वर्ड (रों) कि बोर्ड के किनारे तक छोड़ दिया traversing द्वारा बनाया गया है का प्रारंभ पा सकते हैं (जब तक एक खाली स्क्वायर) और एक ही स्थिति तक चल रहा है। बोर्ड शब्द (ओं) का अंत ढूंढ सकता है जो समान रूप से नीचे और नीचे ट्रैवरिंग द्वारा बनाए गए हैं। आप प्रारंभ और शब्द का अंत करने के लिए हर बार एक नए रखा टाइल एक मौजूदा टाइल (यदि आप एक मोड़ के दौरान कई शब्दों बना सकते हैं) के निकट है पार करने के लिए है।

को देखते हुए शब्द, बोर्ड (या प्रत्येक पद ही) BaseValue गणना करता है (प्रत्येक एक संभव LetterBonus और एक मूल्य के साथ एक टाइल युक्त एक वर्ग से बना) का एक संग्रह (टाइलें के मानों का योग - किसी भी LetterBonuses लागू करने) और फिर Word का अंतिम मूल्य प्राप्त करने के लिए वर्डबोनस (यदि कोई हो) लागू होता है।

संबंधित मुद्दे