2011-08-20 13 views
7

मैं चारों ओर एक छोटा सा खेल परियोजना के साथ खेल रहा हूँ और जैसा कि मैंने बहुत TDD में अनुभवी नहीं कर रहा हूँ मैं चीजों के एक जोड़े पर कुछ विशेषज्ञ राय प्राप्त करने के लिए अच्छा लगेगा।TDD और खेल भौतिकी

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

चीजें अच्छी तरह से शुरू हुईं। लक्ष्य 2 डी स्पेस फ्लाइट गेम (देखभाल करने वालों के लिए क्षुद्रग्रह) बनाना था। मैंने जहाज वर्ग के लिए यूनिट परीक्षणों की एक श्रृंखला बनाई। प्रारंभिकरण, रोटेशन जैसी चीजों को आसानी से एक श्रृंखला में परीक्षण किया जा सकता है जैसे: GetRotation(), TurnRotateRightOn(), अद्यतन (1), GetRotation(), Expect_NE (रोटेशन 1, रोटेशन 2)। तब मैंने पहली समस्या को मारा।

TDD के मेरे समझ है कि आप परीक्षण लिखना चाहिए आप कैसे लगता है कि तुम वर्ग का उपयोग करना चाहिए है। मैं जहाज को स्थानांतरित करने में सक्षम होना चाहता हूं इसलिए मैंने एक वर्ग लिखा जो मूल रूप से कहा गया था। GetCoordinates(), ThrustOn(), अद्यतन (1), GetCoordinates()। यह सुनिश्चित करने के लिए ठीक था कि जहाज कहीं स्थानांतरित हो गया। हालांकि, मुझे जल्दी से एहसास हुआ कि मुझे यह सुनिश्चित करना था कि जहाज सही दिशा में और सही गति से आगे बढ़ रहा था। इसके बाद 75 लाइन यूनिट टेस्ट था जहां मुझे मूल रूप से रोटेशन शुरू करना था, निर्देशांक की जांच करना, जोर देना शुरू करना, जहाज को अपडेट करना, नए निर्देशांक प्राप्त करना, नया घूर्णन जांचना था। और भी, मैं खेल में जहाज की गति को कभी भी प्राप्त करने की आवश्यकता नहीं देख सकता (केवल निर्देशांक, जहाज खुद को अपडेट करना चाहिए)। इस वजह से मुझे वेग प्राप्त करने का कोई सीधा तरीका नहीं था। इसलिए परीक्षण को मूल रूप से यह कहना था कि वेग क्या होना चाहिए था, इसलिए मैं यह सुनिश्चित कर सकता था कि यह अपडेट के बाद मुझे कौन से निर्देशांक प्राप्त हो रहा था। यह सब बहुत गन्दा था, और बहुत समय लेने वाला था, लेकिन काम किया। परीक्षण, विफल परीक्षण पास, आदि

जब तक बाद में जब मुझे एहसास हुआ कि मैं एक सार "अभिनेता" वर्ग में जहाज के अद्यतन कोड refactor करना चाहता था यह ठीक था। मुझे एहसास हुआ कि अभिनेता के प्रत्येक उप-वर्ग को एक नई स्थिति की सही गणना करने में सक्षम होने की आवश्यकता होगी, न कि प्रत्येक सबक्लास अपने वेग को उसी तरह अद्यतन करेगा (कुछ टकराव, कुछ नहीं, कुछ स्थिर वेग हैं)। अब, मुझे मूल रूप से उस विशाल और बड़े पैमाने पर परीक्षण कोड को डुप्लिकेट करने और बदलने की संभावना का सामना करना पड़ रहा है और मैं मदद नहीं कर सकता लेकिन सोचता हूं कि एक बेहतर तरीका होना चाहिए।

किसी इकाई परीक्षण के साथ कामकाज की जटिल ब्लैक बॉक्स प्रकार की इस तरह निपटने में किसी भी अनुभव है? ऐसा लगता है कि मुझे मूल रूप से परीक्षण में सटीक वही भौतिकी कोड लिखना है, इसलिए मुझे पता है कि परिणाम क्या होना चाहिए। ऐसा लगता है कि वास्तव में खुद को पराजित कर रहा है, और मुझे यकीन है कि मैं इस तरह से कहीं भी इस बिंदु को याद कर रहा हूं। मैं किसी भी मदद या सलाह की सराहना करता हूं कि कोई भी पेशकश कर सकता है।

+0

क्या यह सवाल gamedev एसई से संबंधित नहीं है? वे शायद इसे बेहतर जवाब दे सकते हैं। – Spoike

+0

मुझे gamedev एसई के बारे में पता नहीं था! मैं भविष्य में इसी तरह के प्रश्न पूछूंगा। धन्यवाद! – Landon

उत्तर

5

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

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

इस मामले में, मैं सीधे गति के समीकरणों से परीक्षण डेटा उत्पन्न करूंगा। मैं इस उद्देश्य के लिए गणित का उपयोग करता हूं क्योंकि मैं समीकरणों को सीधे दर्ज कर सकता हूं, उन्हें हल कर सकता हूं और फिर परिणामों के ग्राफ और तालिकाओं को उत्पन्न कर सकता हूं। ग्राफ मुझे परिणामों को देखने देते हैं और इस तरह विश्वास करते हैं कि वे विश्वसनीय रूप से सही हैं। Excel/OpenOffice/Google Apps का उपयोग उसी उद्देश्य के लिए किया जा सकता है, साथ ही साथ ऋषि जैसे गणित के लिए खुले स्रोत विकल्प भी उपयोग किए जा सकते हैं। जो कुछ भी चुनता है, मुख्य चिंता गैर-तुच्छ कोड लिखने के बिना गति के समीकरणों को हल करने में सक्षम होना है।

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

मैथमैटिका या एक्सेल दस्तावेज़ों के परीक्षणों की प्रारंभिक रचना से परे एक उपयोगी जीवन है। जब नई कार्यक्षमता को जोड़ा जाता है या बाद में (स्वर्ग मना कर दिया जाता है) तब उन्हें फिर से उपयोग किया जा सकता है जब बग को बाद में पाया जाना चाहिए। मैं स्रोत कोड जैसे दस्तावेज़ों का इलाज करने का समर्थन करता हूं।

इस अभ्यास के अंत में, परिणाम एक "बम-सबूत" घटक है जिसे हमने आश्वस्त किया है कि किसी भी नियंत्रण नियंत्रण इनपुट के तहत किसी ऑब्जेक्ट के लिए सही स्थिति और अभिविन्यास की गणना करेगा। इस नींव से, हम आगे के घटकों का निर्माण कर सकते हैं जो उस कार्यक्षमता का उपयोग करते हैं, जैसे जहाज, क्षुद्रग्रह, सॉकर और शॉट्स। प्रत्येक घटक के लिए परीक्षण मामलों के संयोजक विस्फोट से बचने के लिए, मैं एक सख्त ब्लैक-बॉक्स परीक्षण दृष्टिकोण से प्रस्थान करूंगा। इसलिए, उदाहरण के लिए, यदि हम "जहाज" घटक का परीक्षण कर रहे थे, तो हम यह जानकर परीक्षण लिखेंगे कि यह स्थिति/अभिविन्यास घटक का उपयोग करता है। इस श्वेत-बॉक्स ज्ञान का उपयोग करके, हम गति से संबंधित सभी कोने मामलों को पुनः से बचने से बच सकते हैं।जहाज इकाई परीक्षण "धूम्रपान परीक्षण" कर सकते हैं जो सत्यापित करते हैं कि जहाज वास्तव में नियंत्रण इनपुट का जवाब देते हैं लेकिन मुख्य फोकस जहाज घटक के लिए अद्वितीय किसी भी कार्यक्षमता का परीक्षण करने पर होगा।

तो, संक्षेप में प्रस्तुत करने के लिए:

  • कर स्थिति/उन्मुखीकरण गणना एक एकल घटक
  • की जिम्मेदारी एक बाहरी उपकरण है जो डेटा है कि उच्च आत्मविश्वास देता है का उपयोग कर परीक्षण मामलों के एक व्यापक सेट के लिए डाटा उत्पन्न सही
  • से बचने के परीक्षण के लिए खुद को
  • व्हाइट बॉक्स ज्ञान
  • का उपयोग करके एक घटक पदानुक्रम में परीक्षण मामलों के मिश्रित विस्फोट चकमा में जटिल गणना के तर्क हैं
+0

यह वही है जो मैं ढूंढ रहा था! अच्छी सलाह। धन्यवाद! – Landon

1

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

1

मुझे लगता है कि यदि आप अधिक "एपिसोडिक" दृष्टिकोण लेते हैं तो यह मदद कर सकता है। एक निरंतरता में निर्देशांक और घूर्णन को ट्रैक करने के बजाय, जो आप कर रहे हैं, आप बस निर्दिष्ट कर सकते हैं कि आपका अंतरिक्ष जहाज कहां होना चाहिए, और 30 गेम-चरणों के बाद, किस घूर्णन पर। यदि यह सही साबित होता है, तो आपके जहाज ने शायद सभी सही चीजों को भी बीच में किया है। आप इस तरह से बहुत कम टेस्ट कोड लिखेंगे।

एक ही विचार एक टक्कर के "प्रकरण" को लक्षित करके काम करता है। यदि बिलियर्ड बॉल का मतलब दो दीवारों को उछालने और दूसरी गेंद को मारने के लिए है, तो अंतिम टकराव होने पर आप केवल एक घटना बढ़ा सकते हैं, और टक्कर के "कोणों के कोण" की जांच कर सकते हैं।एक बार फिर आप बीच में सभी चरणों की जांच नहीं कर रहे हैं। यदि घटनाओं का कोण सही है, तो गेंद ने अंतिम गेंद को मारने से पहले दो दीवारों को सही ढंग से बंद कर दिया।

बेशक आपको उस मामले के लिए तैयार रहना चाहिए जहां कोई टक्कर नहीं होती है। अंतिम टकराव तक पहुंचने के लिए आपका परीक्षण गेम-क्लिक प्रति इकाई समय के लिए खाता हो सकता है। टकराव प्राप्त करने के लिए आप गेम क्लिक की आवश्यक संख्या के लिए परीक्षण चलाते हैं। यदि टक्कर निर्धारित संख्या के भीतर टक्कर नहीं हुई है, तो परीक्षण ठीक से विफल हो सकता है।

यह सब वास्तविक समय के बजाए गेम-क्लिक में किया जाता है, ताकि परीक्षण अपेक्षित परिणाम की प्रतीक्षा करने के बजाय तत्काल निकट हो सके (जैसा कि आप वास्तव में खेलेंगे यदि आप वास्तव में खेल खेल रहे थे)।

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