1. वंशानुक्रम
CodeGym गेम इंजन के साथ काम करने के लिए, आपको इनहेरिटेंस का उपयोग करने की आवश्यकता होगी । लेकिन क्या होगा अगर आप नहीं जानते कि वह क्या है? एक ओर, आपको इस विषय को समझने और अध्ययन करने की आवश्यकता है। दूसरी ओर, इंजन को विशेष रूप से बहुत सरल बनाने के लिए डिज़ाइन किया गया है, ताकि आप वंशानुक्रम के सतही ज्ञान से काम चला सकें।
तो विरासत क्या है? सरल शब्दों में, वंशानुक्रम दो वर्गों के बीच का संबंध है। उनमें से एक मूल वर्ग के रूप में कार्य करता है, और दूसरा बच्चा (वंशज) वर्ग बन जाता है। क्या अधिक है, एक मूल वर्ग को यह भी पता नहीं हो सकता है कि उसके वंश वर्ग हैं। दूसरे शब्दों में, वंशज वर्ग होने से माता-पिता को ज्यादा लाभ नहीं मिलता है।
लेकिन वंशानुक्रम से संतान वर्ग को कई फायदे मिलते हैं। उनमें से सबसे महत्वपूर्ण यह है कि पैरेंट क्लास के सभी वेरिएबल्स और तरीके चाइल्ड क्लास में दिखाई देते हैं, जैसे कि पैरेंट क्लास का कोड सीधे चाइल्ड क्लास में कॉपी किया गया हो। यह पूरी तरह से सही नहीं है, लेकिन विरासत की बुनियादी समझ के लिए यह पर्याप्त होगा।
वंशानुक्रम को बेहतर ढंग से समझने में आपकी मदद करने के लिए यहां कुछ उदाहरण दिए गए हैं।
उदाहरण 1 — यहाँ सबसे सरल उदाहरण है
|
क्लास कीवर्ड की मदद से क्लास को Child इनहेरिट करती है ।Parent extends |
|
उदाहरण 2 - मूल वर्ग के चर का उपयोग करना
|
वर्ग वर्ग के और क्षेत्रों का Child उपयोग कर सकता है जैसे कि उन्हें कक्षा में ही घोषित किया गया हो।age name Parent Child |
|
उदाहरण 3 - मूल वर्ग के तरीकों का उपयोग करना
|
वर्ग Child अभिभावक वर्ग के चर और विधियों का उपयोग कर सकता है जैसे कि उन्हें Child कक्षा में घोषित किया गया हो। इस उदाहरण में, हम getName() विधि का उपयोग करते हैं। |
|
कुछ विवरणों को छोड़कर, हम कह सकते हैं कि जावा कंपाइलर के दृष्टिकोण से, हमने मूल वर्ग के कोड को बाल वर्ग के कोड में कॉपी किया है:
public class Child extends Parent
{
public int age; // An inherited variable
public String name; // An inherited variable
public getName() { // An inherited method
return name;
}
public void printInfo()
{
System.out.println(getName() + " " + age);
}
}
Child
संकलक के दृष्टिकोण से वर्ग कैसा दिखता है
2. ओवरराइडिंग विधि
कभी-कभी ऐसी परिस्थितियाँ होती हैं जहाँ हम अपनी Child
कक्षा को एक बहुत ही उपयोगी Parent
वर्ग का वारिस बनाते हैं, जिसके कारण बच्चे को माता-पिता के सभी चर और विधियाँ विरासत में मिलती हैं। लेकिन उनमें से कुछ तरीके उस तरह से काम नहीं कर सकते हैं जिस तरह से हम उन्हें चाहते हैं या उस तरह से नहीं करते हैं जिस तरह से हम चाहते हैं।
आप इस मामले में क्या करते हैं? हम उस विधि को ओवरराइड कर सकते हैं जिसका कार्यान्वयन हमें पसंद नहीं है । यह करने के लिए एक सरल बात है: हमारी Child
कक्षा में हम केवल उसी हस्ताक्षर के साथ एक विधि की घोषणा करते हैं जो Parent
कक्षा में विधि के रूप में होती है और फिर उसमें अपना कोड लिखते हैं।
उदाहरण 1 - ओवरराइडिंग विधि
|
विधि printInfo() निम्नलिखित वाक्यांश प्रदर्शित करेगी:
|
|
स्थिति को कुछ हद तक सरलीकृत करते हुए, विरासत मूल वर्ग के कोड को बाल वर्ग में कॉपी करने का कारण बनती है। लेकिन यदि वंशज वर्ग पहले से ही एक विधि है जो पूर्वज वर्ग में मौजूद है, तो उस विधि को पूर्वज वर्ग से कॉपी नहीं किया जाता है। यहाँ हम कहते हैं कि चाइल्ड क्लास में मेथड पेरेंट क्लास में मेथड को ओवरराइड करता है। नीचे दिए गए उदाहरण को देखें। शायद यह चीजों को थोड़ा स्पष्ट करने में मदद करेगा:
यहां बताया गया है कि संकलक के दृष्टिकोण से बाल वर्ग कैसा दिखता है: |
---|
|
उदाहरण 2 - थोड़ा वंशानुक्रम जादू (और ओवरराइडिंग विधि)
public class Parent
{
public getName() {
return "Luke";
}
public void printInfo()
{
System.out.println( getName() );
}
}
public class Child extends Parent
{
public getName() {
return "Luke, I am your father";
}
}
यदि printInfo()
विधि को किसी प्रकार पर कॉल किया जाता है Parent
, तो यह बदले में कक्षा getName()
की विधि को कॉल करता है।Parent
यदि printInfo()
विधि को किसी वस्तु पर कहा जाता है Child
, तो वह बदले में कक्षा getName()
की विधि को बुलाती है।Child
दूसरे शब्दों में, printInfo()
विधि केवल Parent
कक्षा में घोषित की जाती है, लेकिन यदि किसी वस्तु पर विधि को कहा जाता है, तो यह कक्षा getName()
की विधि को बुलाती है।Child
printInfo()
Child
उदाहरण:
|
यह कोड स्क्रीन पर निम्न पाठ प्रदर्शित करता है:
|
|
यह कोड स्क्रीन पर निम्न पाठ प्रदर्शित करता है:
|
और सभी संकलक के दृष्टिकोण से (इसका एक बहुत ही सरलीकृत संस्करण), Child
कक्षा का कोड इस तरह दिखता है:
public class Child extends Parent
{
public getName() {
return "Luke, I am your father";
}
public void printInfo()
{
System.out.println(getName());
}
}
Child
संकलक के दृष्टिकोण से वर्ग कैसा दिखता है
3. सूचियाँ
यहां सूचियों के बारे में संक्षिप्त रिमाइंडर दिया गया है ( List
)। सरणियों के साथ सूचियों में बहुत समानता है:
- वे एक विशिष्ट प्रकार के बहुत सारे डेटा को स्टोर कर सकते हैं।
- वे आपको उनके सूचकांक द्वारा तत्व प्राप्त करने देते हैं।
- तत्वों के सूचकांक से शुरू होते हैं
0
।
सूचियों के लाभ:
सरणियों के विपरीत, सूचियाँ गतिशील रूप से आकार बदल सकती हैं। निर्माण के तुरंत बाद, सूची का आकार है 0
। जैसे-जैसे सूची में आइटम जोड़े जाते हैं, इसका आकार बढ़ता जाता है। सूची बनाने का उदाहरण:
ArrayList<String> myList = new ArrayList<String>();
ArrayList
कोण कोष्ठक में दर्शाया गया मान वह डेटा प्रकार है जिसे सूची संग्रहीत कर सकती है।
सूची के साथ काम करने के कुछ तरीके यहां दिए गए हैं:
कोड | संक्षिप्त विवरण |
---|---|
|
तार की एक नई सूची बनाना |
|
सूची के अंत में एक तत्व जोड़ें |
|
सूची के प्रारंभ में एक तत्व जोड़ें |
|
इसके सूचकांक द्वारा एक तत्व प्राप्त करें |
|
किसी तत्व को उसके सूचकांक से बदलें |
|
सूची में तत्वों की संख्या प्राप्त करें |
|
सूची से एक तत्व निकालें |
सूचियों के बारे में अधिक जानकारी के लिए आप निम्नलिखित लेख पढ़ सकते हैं:
4. यादृच्छिक संख्याएँ
CodeGym गेम इंजन में दो विधियाँ हैं जिनका उपयोग यादृच्छिक संख्या उत्पन्न करने के लिए किया जा सकता है। ये तरीके हैं:
int getRandomNumber(int max)
int getRandomNumber(int min, int max)
पहली विधि — — , , , ... getRandomNumber(int max)
श्रेणी में एक यादृच्छिक संख्या देता है । हुड के तहत, यह पैकेज से कक्षा का उपयोग करता है , लेकिन यह नहीं बदलता है कि आप यादृच्छिक संख्या का उपयोग कैसे करते हैं।0
1
2
max-1
Random
java.util
getRandomNumber(int)
एक पूर्णांक को एक तर्क के रूप में स्वीकार करता है। यह संख्या उन संख्याओं की ऊपरी सीमा होगी जो यादृच्छिक संख्या जनरेटर वापस कर सकता है। निचली सीमा 0 है। ध्यान दें! यादृच्छिक संख्या जनरेटर कभी भी ऊपरी सीमा का मान वापस नहीं करेगा। उदाहरण के लिए, यदि आप कॉल करते हैं getRandomNumber(3)
, तो यह बेतरतीब ढंग से 0, 1, या 2 पर वापस आ जाएगा। जैसा कि आप देख सकते हैं, यह 3 वापस नहीं आएगा। इस तरह से एक यादृच्छिक संख्या जनरेटर का उपयोग करना आसान है, लेकिन यह कई मामलों के लिए उपयुक्त है।
दूसरी विधि — getRandomNumber(int min, int max)
— श्रेणी में एक यादृच्छिक पूर्णांक देता है [min, max-1]
। यह कभी भी से कम संख्या नहीं लौटाएगा min
, और यह कभी भी इससे अधिक संख्या नहीं लौटाएगा max-1
।
व्यवहार में इन विधियों का उपयोग कैसे किया जा सकता है?
1. पासा
मान लीजिए आप एक पासे के रोल का अनुकरण करना चाहते हैं और रेंज में एक यादृच्छिक संख्या प्राप्त करना चाहते हैं 1-6
। आपको इसे कैसे करना होगा? यह इस तरह कोड के साथ किया जा सकता है:
int dice = getRandomNumber(1, 7);
यह विधि श्रेणी में एक यादृच्छिक पूर्णांक लौटाएगा 1-6
।
2. लक्ष्य अभ्यास
मान लीजिए कि आप एक लक्ष्य पर शूटिंग का अनुकरण करना चाहते हैं, और एक शॉट की सटीकता में एक यादृच्छिक घटक शामिल होता है जो सीमा से समावेशी तक भिन्न होता -10
है +10
। यह इस तरह कोड के साथ किया जा सकता है:
int dx = getRandomNumber(-10, 11);
यह विधि श्रेणी में एक यादृच्छिक पूर्णांक वापस कर -10
देगी +10
।
खेलों में यादृच्छिक संख्याओं का उपयोग करने के कई तरीके हैं। आप केवल अपनी कल्पना से ही सीमित हैं। अपने स्वयं के खेल लिखें, उन्हें परिष्कृत करें और प्रक्रिया का आनंद लें।
गेम हर कोई खेल सकता है, लेकिन केवल प्रोग्रामर ही उन्हें बना सकते हैं।
GO TO FULL VERSION