2009-12-07 12 views
15

आप जावा में एक टेट्रिस प्रोग्राम लिख रहे हैं। निम्नलिखित पहलुओं के संबंध में आप अपनी कक्षा के डिजाइन को कैसे स्थापित करेंगे?ओओपी-टेट्रिस के लिए दार्शनिक डिजाइन प्रश्न

  • टुकड़ा वर्ग: एक आंतरिक सरणी जो टुकड़ा के आकार को निर्धारित करता है, सात Piece कक्षाएं, टुकड़ों में से प्रत्येक के लिए एक होने बनाम साथ, एक Piece वर्ग है। वे एक सामान्य टुकड़ा वर्ग के सभी उप-वर्ग हैं।
  • टुकड़ा वर्ग प्रतिनिधित्व:Block के 4 उदाहरणों, एक टुकड़ा में से एक वर्ग का प्रतिनिधित्व करने की एक सरणी है, और प्रत्येक Block एक 4x4 सरणी होने बनाम बोर्ड पर अपने स्थान (चित्रमय निर्देशांक में) शामिल हैं जहां null का मतलब है वहां कोई ब्लॉक नहीं है, और स्थान सरणी के आकार से निर्धारित होता है।
  • स्थान:Piece सरणी में या Board सरणी पर प्रत्येक Block बनाम Piece इसके स्थान संग्रहीत करता है और BoardBlocks है कि उन्हें शामिल के स्थानों को पता है।
  • एक टुकड़ा जा रही हैं: टुकड़ा वर्ग getRandomPiece की एक स्थिर विधि है, या एक PieceFactory जो आपको लगता है कि का एक उदाहरण उदाहरण पर genRandomPiece विधि है बनाते हैं।
  • वर्तमान टुकड़ा जोड़ तोड़:Board वर्ग पर इतना है कि सब कुछ है कि यह करने के लिए उपयोग की जरूरत है सिर्फ प्रॉक्सी का उपयोग करता, Proxy पैटर्न का उपयोग करें, या एक getCurrentPiece विधि और फोन है कि किसी भी समय आप वर्तमान के साथ कुछ करना चाहता हूँ टुकड़ा।

यह होमवर्क नहीं है। मैं सिर्फ कॉलेज में परिचय सीएस कोर्स सिखाता हूं और मैं देखना चाहता हूं कि आम तौर पर लोग क्या मानते हैं। "अच्छा" ओओपी डिजाइन के रूप में क्या सोचा जाएगा? इस तथ्य को अनदेखा करें कि यह एक परिचय पाठ्यक्रम के लिए है - आप कैसे करेंगे?

+2

समुदाय विकी – Malfist

+1

होना चाहिए ये सभी वर्ग और सामान ... यह वास्तव में समस्या के लिए समस्या को बहुत सार बना सकता है। टेट्रिस टुकड़ों का प्रतिनिधित्व करने के कई अलग-अलग तरीके (http://stackoverflow.com/questions/233850/tetris-piece-rotation- एल्गोरिदम) और उन्हें कुशल बनाने के कई अलग-अलग तरीके। यदि यह * परिचय * कोर्स के लिए है तो मैं ओओपी के बारे में चिंता नहीं करता। बस मेरी राय, आपके प्रश्न का असली जवाब नहीं। –

+0

@roygbiv: इस टिप्पणी को एक उत्तर के रूप में पोस्ट करें! मुझे लगता है कि आपके पास ओओ डिज़ाइन पर जोर देने के बजाय डब्ल्यू/गैर-ओओ समाधान की तुलना और विपरीतता के विचार के लिए कम से कम एक या दो कक्षाएं – Claudiu

उत्तर

10

सबसे पहले, मैं Piece कक्षा को उपclass नहीं करता क्योंकि यह अनावश्यक है। Piece कक्षा विरासत का उपयोग किए बिना किसी भी आकार का वर्णन करने में सक्षम होना चाहिए। आईएमएचओ, यह नहीं है कि विरासत के लिए क्या बनाया गया था और यह सिर्फ चीजों को जटिल बनाता है।

दूसरा, मैं Block ऑब्जेक्ट्स में x/y निर्देशांक संग्रहीत नहीं करता क्योंकि यह एक ही स्थान पर दो ब्लॉक मौजूद होने की अनुमति देता है। Piece कक्षाएं ब्लॉक ऑब्जेक्ट्स को पकड़ने वाली ग्रिड (यानी 2 डी सरणी) रखती हैं। एक्स/वाई निर्देशांक 2 डी सरणी के सूचकांक होंगे।

एक यादृच्छिक टुकड़ा प्राप्त करने के लिए स्थिर विधि बनाम फैक्ट्री ऑब्जेक्ट के लिए, मैं फैक्ट्री ऑब्जेक्ट के साथ साधारण तथ्य के लिए जाऊंगा कि फैक्ट्री ऑब्जेक्ट को परीक्षण के लिए मजाक किया जा सकता है।

मैं बोर्ड को एक बड़े Piece ऑब्जेक्ट के रूप में मानता हूं। Board वर्ग बड़े पैमाने पर Piece ऑब्जेक्ट को सदस्य चर के रूप में रखेगा, और अन्य Piece ऑब्जेक्ट्स जैसे वर्तमान टुकड़े खेला जा रहा है, और अगला टुकड़ा खेला जा सकता है। यह विरासत से बचने के लिए संरचना का उपयोग कर किया जाता है।

+3

+1 विरासत अनावश्यक, यहां तक ​​कि हानिकारक है, क्योंकि हम सभी टुकड़ों को एक ही व्यवहार करना चाहते हैं। टुकड़े केवल उनके आकार और रंग में भिन्न होते हैं। एकमात्र उदाहरण मैं सोच सकता हूं कि आप कहां विशेष व्यवहार चाहते हैं, टेट्रिस डीएस में "टी-स्पिन" बोनस स्कोरिंग जैसा कुछ है, लेकिन इसे स्कोरिंग कोड में विशेष मामले के रूप में बेहतर तरीके से संभाला जा सकता है। If() {} कथन के विकल्प के रूप में कक्षा पदानुक्रम का उपयोग न करें। – Theran

+0

क्या आप अंतिम वाक्य समझा सकते हैं? जब आपने कहा कि बोर्ड एक बड़ी टुकड़ा होगा जिसमें एक और टुकड़ा होगा, तो मैं स्वचालित रूप से विरासत – Claudiu

+1

मानता हूं कि आप सही हैं, यह थोड़ा अस्पष्ट है। बोर्ड सदस्य चर के रूप में "एक बड़ा टुकड़ा" रखेगा। –

3
  • एक Piece इंटरफेस, सात वर्गों के साथ कि अलग-अलग हिस्सों के लिए कि इंटरफ़ेस (जो भी इंटरफेस पर चर्चा के लिए OOP पाठ्यक्रम के लिए सक्षम होगा) (संपादित करें।: एक Piece कक्षा टिप्पणियां देखें) को लागू
  • मेरे पास BlockGrid कक्षा होगी जिसका उपयोग ब्लॉक के किसी भी मानचित्र - बोर्ड, और व्यक्तिगत टुकड़ों के लिए किया जा सकता है। उदाहरण के लिए, boolean intersects(Block block2, Point location) के लिए - - BlockGrid चौराहों का पता लगाने के तरीकों होना चाहिए और साथ ही एक ग्रिड को घुमाने के लिए (दिलचस्प चर्चा पाठ्यक्रम के लिए बिंदु:? Board एक rotate() विधि BlockGrid में होना चाहिए, बारी बारी से करने की जरूरत नहीं है तो)। एक टुकड़ा के लिए, BlockGrid एक 4x4 ग्रिड का प्रतिनिधित्व करेगा।
  • मैं एक विधि getRandomShape() के साथ एक PieceFactory बन जाएगा टुकड़ा जोड़ तोड़ के लिए सात आकार में से एक
  • का एक उदाहरण प्राप्त करने के लिए, मैं एक मॉडल-व्यू-नियंत्रक वास्तुकला में मिल चाहते हैं। मॉडल टुकड़ा है। नियंत्रक शायद PieceController है, और कानूनी/अवैध चालों को अनुमति या अनुमति भी देगा।बात यह है कि स्क्रीन पर टुकड़ा दिखाते थे एक PieceView(मानव संसाधन विकास मंत्री, या यह एक कि Piece.getBlockGrid()? एक और चर्चा बिंदु दिखा सकते है!) है

वहाँ वास्तुकार इस करने के लिए कई वैध तरीके हैं। इससे समस्या पर लागू विभिन्न ओओपी सिद्धांतों के प्रो और कॉन के बारे में चर्चा करने के लिए पाठ्यक्रम का लाभ होगा। वास्तव में, यह गैर-ओओपी कार्यान्वयन के साथ इसकी तुलना करना और इसके विपरीत करना दिलचस्प हो सकता है जो बोर्ड और टुकड़ों का प्रतिनिधित्व करने के लिए केवल सरणी का उपयोग करता है।

संपादित करें:Claudiu मदद की मुझे पता है कि BlockGrid पर्याप्त टुकड़े को अलग होता है, इसलिए कई उपवर्गों के साथ एक Piece इंटरफेस के लिए कोई जरूरत नहीं है; बल्कि, Pieceवर्ग का उदाहरण BlockGrid के आधार पर अन्य उदाहरणों से भिन्न हो सकता है।

+2

+1 होगी, जिसमें ट्रेडऑफ शामिल हैं। – dsimcha

+0

आपको एहसास है कि चूंकि ब्लोकक्रिड केवल एक इंटरफ़ेस है, इसलिए आप यहां दिए गए डिज़ाइन के साथ 7 अलग टकराव पहचान कार्यों को लिखेंगे? साथ ही 7 अलग रोटेशन फ़ंक्शन? क्या आप वास्तव में ऐसा करते हैं? – Claudiu

+0

शायद मैं ब्लॉकग्रिड को परिभाषित करने में स्पष्ट नहीं था। ब्लॉकग्रिड अनिवार्य रूप से बिट्स की एक एन * एन सरणी है। टकराव का पता लगाने का कार्य कहने के समान होगा, "अगर ((array1 (x, y) == TRUE) && (array2 (x, y) == TRUE)) {टक्कर = TRUE;}" (ऑफसेटिंग के लिए उचित गणित के साथ) एक ब्लॉकग्रिड का स्थान दूसरे पर) –

2

टुकड़ा वर्ग: मुझे लगता है कि सभी टुकड़ों के लिए एक वर्ग पर्याप्त है। कक्षा कार्य shoudl किसी भी टुकड़े के लिए काम करने के लिए पर्याप्त सामान्य हो, तो subclass करने की कोई जरूरत नहीं है।

टुकड़ा वर्ग प्रतिनिधित्व: मेरा मानना ​​है कि एक 4x4 सरणी शायद एक बेहतर तरीका है क्योंकि आपको टुकड़े को घुमाने के लिए बहुत आसान लगेगा।

स्थान: स्थान निश्चित रूप से बोर्ड द्वारा संग्रहीत किया जाना चाहिए, टुकड़ा नहीं, अन्यथा आपको ब्लॉक के पूरे सेट के माध्यम से जाना होगा ताकि यह सुनिश्चित किया जा सके कि कोई भी दो ब्लॉक एक ही स्थिति में न हों।

एक टुकड़ा उत्पन्न करना: ईमानदारी से इस के लिए मुझे नहीं लगता कि इससे बहुत अंतर आएगा। ऐसा कहकर, मैं एक स्थिर कार्य पसंद करूंगा क्योंकि वास्तव में इस कार्य के लिए इतना कुछ नहीं है कि यह अपनी कक्षा को वारंट करता है।

वर्तमान टुकड़ा जोड़ तोड़: मैं सिर्फ एक getCurrent समारोह को लागू के रूप में मुझे लगता है कि एक अतिरिक्त कक्षा में जोड़ने के लिए एक प्रॉक्सी के रूप में सेवा करने के लिए द्वारा समस्या overcomplicate की कोई जरूरत नहीं है कि होगा।

इस तरह मैं इसे करूँगा, लेकिन कई अलग-अलग तरीके हैं, और दिन के अंत में, ध्यान केंद्रित करने की बात यह है कि कार्यक्रम चल रहा है।

3

इन सभी वर्गों और सामान ... यह वास्तव में समस्या के लिए समस्या को बहुत ही अमूर्त बना सकता है। टेट्रिस टुकड़ों (stackoverflow.com/questions/233850/...) का प्रतिनिधित्व करने के कई अलग-अलग तरीके और उन्हें कुशल बनाने के कई अलग-अलग तरीके। यदि यह एक परिचय पाठ्यक्रम के लिए है तो मैं ओओपी के बारे में चिंता नहीं करता। बस मेरी राय, आपके प्रश्न का असली जवाब नहीं।

कहा करने के बाद कि, एक बस एक बोर्ड और टुकड़ा वर्ग के साथ पर्याप्त सकता है।

बोर्ड वर्ग: आयत के एक साधारण 2 डी सरणी को Encapsulates। Currentpiece, nextpiece जैसे गुण। ड्रॉ(), फुलरो(), ड्रॉप(), आदि जैसे रूटीन .. जो मौजूदा टुकड़े और बोर्ड स्क्वायर में भरे हुए हैं।

टुकड़ा वर्ग: अपने विभिन्न घूर्णन में टुकड़ों को एन्कोड करने के बिना हस्ताक्षरित 16 बिट संख्याओं की एक सरणी को Encapsulates। आप रंग, वर्तमान स्थान, और रोटेशन ट्रैक करेंगे। शायद एक दिनचर्या, बारी बारी से() आवश्यक होगा।

बाकी, होगा पर्यावरण के आधार पर, कीबोर्ड की घटनाओं आदि से निपटने ...

मैं पाया है कि रखने भी डिजाइन पर ज्यादा जोर लोग भूल जाते हैं कि वे वास्तव में क्या करने की जरूरत है बनाने के लिए जाता है कुछ चलाना है। मैं यह नहीं कह रहा हूं कि डिजाइन नहीं किया गया है, मैं कह रहा हूं कि अधिक से अधिक नहीं, कुछ चलने में अधिक मूल्य होता है, जिससे आप आगे बढ़ने के लिए कर्षण और प्रेरणा देते हैं।

मैं कहूंगा, कक्षा में, आपके पास टेट्रिस गेम के लिए डिज़ाइन करने के लिए एक्स घंटे हैं। फिर उन्हें उस डिजाइन को चालू करने की आवश्यकता होगी। तो मैं कहूंगा, आपके पास कुछ डिज़ाइन के आधार पर चलने वाले डिज़ाइन के आधार पर चल रहा है या डिज़ाइन के आधार पर आपके पास X दिन हैं।

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