1. वंशानुक्रम

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

तो विरासत क्या है? सरल शब्दों में, वंशानुक्रम दो वर्गों के बीच का संबंध है। उनमें से एक मूल वर्ग के रूप में कार्य करता है, और दूसरा बच्चा (वंशज) वर्ग बन जाता है। क्या अधिक है, एक मूल वर्ग को यह भी पता नहीं हो सकता है कि उसके वंश वर्ग हैं। दूसरे शब्दों में, वंशज वर्ग होने से माता-पिता को ज्यादा लाभ नहीं मिलता है।

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

वंशानुक्रम को बेहतर ढंग से समझने में आपकी मदद करने के लिए यहां कुछ उदाहरण दिए गए हैं।

उदाहरण 1 — यहाँ सबसे सरल उदाहरण है

public class Parent
{
}
क्लास कीवर्ड की मदद से क्लास को Childइनहेरिट करती है ।Parentextends
public class Child extends Parent
{
}

उदाहरण 2 - मूल वर्ग के चर का उपयोग करना

public class Parent
{
  public int age;
  public String name;
}
वर्ग वर्ग के और क्षेत्रों का Childउपयोग कर सकता है जैसे कि उन्हें कक्षा में ही घोषित किया गया हो।agenameParentChild
public class Child extends Parent
{
  public void printInfo()
  {
    System.out.println(name + " " + age);
  }
}

उदाहरण 3 - मूल वर्ग के तरीकों का उपयोग करना

public class Parent
{
   public int age;
   public String name;
   public getName() {
      return name;
   }
}
वर्ग Childअभिभावक वर्ग के चर और विधियों का उपयोग कर सकता है जैसे कि उन्हें Childकक्षा में घोषित किया गया हो। इस उदाहरण में, हम getName()विधि का उपयोग करते हैं।
public class Child extends Parent
{
   public void printInfo()
   {
      System.out.println(getName() + " " + age);
   }
}

कुछ विवरणों को छोड़कर, हम कह सकते हैं कि जावा कंपाइलर के दृष्टिकोण से, हमने मूल वर्ग के कोड को बाल वर्ग के कोड में कॉपी किया है:

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 - ओवरराइडिंग विधि

public class Parent
{
   public String name;
   public void setName(String nameNew) {
      name = nameNew;
   }

   public getName() {
      return name;
   }
}
विधि printInfo()निम्नलिखित वाक्यांश प्रदर्शित करेगी:
Luke, No!!!
public class Child extends Parent
{
   public void setName(String nameNew) {
      name = nameNew + ", No!!!";
   }

   public void printInfo()
   {
      setName("Luke");
      System.out.println(getName());
   }
}

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

यहां बताया गया है कि संकलक के दृष्टिकोण से बाल वर्ग कैसा दिखता है:
public class Child extends Parent
{
   public String name;    // An inherited variable

   public void setName(String nameNew)  // The overridden method replaces the inherited one
   {
      name = nameNew + ", No!!!";
   }

   public getName()    // An inherited method
   {
      return name;
   }

   public void printInfo()
   {
      setName("Luke");
      System.out.println(getName());
   }
}

उदाहरण 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()की विधि को बुलाती है।ChildprintInfo()Child

उदाहरण:

Parent parent = new Parent();
parent.printnInfo();
यह कोड स्क्रीन पर निम्न पाठ प्रदर्शित करता है:
Luke
Child child = new Child();
child.printnInfo();
यह कोड स्क्रीन पर निम्न पाठ प्रदर्शित करता है:
Luke, I am your father

और सभी संकलक के दृष्टिकोण से (इसका एक बहुत ही सरलीकृत संस्करण), 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

कोण कोष्ठक में दर्शाया गया मान वह डेटा प्रकार है जिसे सूची संग्रहीत कर सकती है।

सूची के साथ काम करने के कुछ तरीके यहां दिए गए हैं:

कोड संक्षिप्त विवरण
ArrayList<String> list = new ArrayList<String>();
तार की एक नई सूची बनाना
list.add("name");
सूची के अंत में एक तत्व जोड़ें
list.add(0, "name");
सूची के प्रारंभ में एक तत्व जोड़ें
String name = list.get(5);
इसके सूचकांक द्वारा एक तत्व प्राप्त करें
list.set(5, "new name");
किसी तत्व को उसके सूचकांक से बदलें
int count = list.size();
सूची में तत्वों की संख्या प्राप्त करें
list.remove(4);
सूची से एक तत्व निकालें

सूचियों के बारे में अधिक जानकारी के लिए आप निम्नलिखित लेख पढ़ सकते हैं:



4. यादृच्छिक संख्याएँ

CodeGym गेम इंजन में दो विधियाँ हैं जिनका उपयोग यादृच्छिक संख्या उत्पन्न करने के लिए किया जा सकता है। ये तरीके हैं:

int getRandomNumber(int max)
int getRandomNumber(int min, int max)

पहली विधि — — , , , ... getRandomNumber(int max)श्रेणी में एक यादृच्छिक संख्या देता है । हुड के तहत, यह पैकेज से कक्षा का उपयोग करता है , लेकिन यह नहीं बदलता है कि आप यादृच्छिक संख्या का उपयोग कैसे करते हैं।012max-1Randomjava.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

खेलों में यादृच्छिक संख्याओं का उपयोग करने के कई तरीके हैं। आप केवल अपनी कल्पना से ही सीमित हैं। अपने स्वयं के खेल लिखें, उन्हें परिष्कृत करें और प्रक्रिया का आनंद लें।

गेम हर कोई खेल सकता है, लेकिन केवल प्रोग्रामर ही उन्हें बना सकते हैं।