1. উত্তরাধিকার
CodeGym গেম ইঞ্জিনের সাথে কাজ করতে, আপনাকে উত্তরাধিকার ব্যবহার করতে হবে । কিন্তু যদি আপনি না জানেন যে কি? একদিকে, আপনাকে এই বিষয়টি বুঝতে এবং অধ্যয়ন করতে হবে। অন্যদিকে, ইঞ্জিনটি বিশেষভাবে খুব সহজ করার জন্য ডিজাইন করা হয়েছে, তাই আপনি উত্তরাধিকারের উপরিভাগ জ্ঞানের সাথে পেতে পারেন।
তাহলে উত্তরাধিকার কি? সহজ ভাষায়, উত্তরাধিকার হল দুটি শ্রেণীর মধ্যে একটি সম্পর্ক। তাদের মধ্যে একটি অভিভাবক শ্রেণী হিসাবে কাজ করে, এবং অন্যটি শিশু (বংশধর) শ্রেণীতে পরিণত হয়। আরও কি, একটি অভিভাবক শ্রেণী এমনকি জানে না যে এটির বংশধর শ্রেণী রয়েছে। অন্য কথায়, পিতামাতা বংশধরদের ক্লাস করে খুব বেশি সুবিধা পান না।
কিন্তু উত্তরাধিকার শিশু শ্রেণীর অনেক সুবিধা দেয়। তাদের মধ্যে সবচেয়ে গুরুত্বপূর্ণ হল যে প্যারেন্ট ক্লাসের সমস্ত ভেরিয়েবল এবং পদ্ধতি চাইল্ড ক্লাসে উপস্থিত হয়, যেন প্যারেন্ট ক্লাসের কোড সরাসরি চাইল্ড ক্লাসে কপি করা হয়েছে। এটি সম্পূর্ণরূপে সঠিক নয়, তবে উত্তরাধিকার সম্পর্কে প্রাথমিক বোঝার জন্য এটি যথেষ্ট হবে।
উত্তরাধিকার সম্পর্কে আরও ভালভাবে বুঝতে সাহায্য করার জন্য এখানে কিছু উদাহরণ রয়েছে।
উদাহরণ 1 - এখানে সবচেয়ে সহজ উদাহরণ
|
কিওয়ার্ডের সাহায্যে ক্লাসটি ক্লাসের উত্তরাধিকারী Childহয় ।Parentextends |
|
উদাহরণ 2 — প্যারেন্ট ক্লাসের ভেরিয়েবল ব্যবহার করে
|
ক্লাসটি ক্লাসের এবং ক্ষেত্রগুলিকে এমনভাবে Childব্যবহার করতে পারে যেন সেগুলি ক্লাসেই ঘোষণা করা হয়েছিল ।agenameParentChild |
|
উদাহরণ 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. এলোমেলো সংখ্যা
কোডজিম গেম ইঞ্জিনের দুটি পদ্ধতি রয়েছে যা র্যান্ডম সংখ্যা তৈরি করতে ব্যবহার করা যেতে পারে। এই পদ্ধতিগুলি হল:
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।
গেমগুলিতে র্যান্ডম সংখ্যা ব্যবহার করার অনেক উপায় রয়েছে। আপনি শুধুমাত্র আপনার কল্পনা দ্বারা সীমাবদ্ধ. আপনার নিজের গেমগুলি লিখুন, সেগুলিকে পরিমার্জন করুন এবং প্রক্রিয়াটি উপভোগ করুন৷
সবাই গেম খেলতে পারে, কিন্তু শুধুমাত্র প্রোগ্রামাররাই সেগুলি তৈরি করতে পারে।
GO TO FULL VERSION