এমন কোন প্রযুক্তি যা কোনও গেমের ভিতরে প্রোগ্রামিং করতে দেয়?


27

কিছু গেম রয়েছে যা খেলোয়াড়কে ইন-গেমটি স্ক্রিপ্টগুলি লিখতে / তৈরি করতে দেয়, উদাহরণস্বরূপ: স্পেস ইঞ্জিনিয়ার বা পিএসআই

আমি যে কোনও একটির মতোই কিছু ব্যবহার করতে চাই, তবে তথ্য খুঁজে পেতে আমার খুব কষ্ট হয়েছিল তাই আমার প্রশ্নটি হ'ল:

প্রোগ্রামিংয়ের এমন কোন শাখা রয়েছে যা ব্যবহারকারীর দ্বারা নির্মিত নতুন কোড চালনার জন্য একবার সফটওয়্যারটির দক্ষতা কভার করে?

প্রোগ্রামিংয়ের শাখায় আমি পিটিজি (প্রসিডেরাল টেরিন জেনারেশন) এর মতো কিছু বোঝায়।

কোনও প্রশ্ন বা মতামত ভিত্তিক অত্যধিক বিস্তৃত এড়াতে , আমাকে পরিষ্কার করে জানিয়ে দিতে পারি যে আমি শিখার জন্য গাইড বা জায়গা খুঁজছি না, আমি জড়িত প্রযুক্তির নাম বা সংজ্ঞা (যদি উপস্থিত থাকে) চাই want


22
আচ্ছা, সম্ভবত "দোভাষী লেখক"?
ম্যাথিউরক

2
আমি সম্প্রতি অনুরূপ প্রশ্নের উত্তর দিয়েছি , " ভার্চুয়াল মেশিন " ব্যবহারকারী সিস্টেমটি চালিত করে এমন সিস্টেম হিসাবে শব্দটি হিসাবে আলোচনা করেছি এবং প্রচলিত দোভাষীর চেয়ে দ্রুত এটি প্রয়োগের উপায় হিসাবে বাইটকোড প্যাটার্নে গেম প্রোগ্রামিং প্যাটার্নস নিবন্ধটিও উল্লেখ করেছি ।
ডিএমগ্রিগরি

3
একে সাধারণত "স্ক্রিপ্টিং" বলা হয়। কোনও গেমটিতে স্ক্রিপ্টিং কীভাবে কার্যকর করা যায় সেই সাথে আপনি প্রচুর পরিমাণে (বিভিন্নভাবে) মুক্ত উত্সের নমুনা এবং আসল কোড পাবেন। বিস্তৃত সুযোগে, সংকলক প্রোগ্রামিংয়ের পুরো ক্ষেত্র রয়েছে (যার মধ্যে রয়েছে লেক্সিং, পার্সিং, সংকলন, লিঙ্কিং, ব্যাখ্যা করা ...)। বিস্তৃত সুযোগে (প্রয়োজনীয়ভাবে দরকারী নয়), এটি আপনার অ্যাপ্লিকেশনটির যে কোনও ব্যবহারকারীর ইন্টারঅ্যাকশনকে অন্তর্ভুক্ত করে - একটি স্ক্রিপ্টিং ইঞ্জিনটি মেনু থেকে নির্বাচন করার জন্য কেবল আরও জটিল উপায়।
লুয়ান

2
পাইথন প্রোগ্রামটি পাইথন স্ক্রিপ্টগুলি হোস্ট করতে পারে। এটাকে মেটাপোগ্রামিং বলে। বেশিরভাগ ব্যাখ্যামূলক ভাষায় তা রয়েছে।
ব্যবহারকারী 6245072

1
স্পেস ইঞ্জিনিয়ার্স-এ এএফআইকে , কোডটি একটি স্যান্ডবক্সযুক্ত পরিবেশে সি # কোড সংকলিত হয় (গেমটি উন্মুক্ত উত্সে গিয়েছিল, যাতে আপনি কীভাবে অনলাইনে কাজ করে তা পরীক্ষা করতে পারেন: github.com/KeenSoftwareHouse/SpaceEngineers )। মূলত একটি সি # সংকলক সহ গেমের জাহাজ এবং কোডটি কেবল গেমের এপিআই ফাংশনগুলিতে অ্যাক্সেসের অনুমতি দেয়, যাতে প্রোগ্রামের পরিধিটি কেবল আপনার মধ্যে সীমাবদ্ধ থাকে। এবং যদি আপনি মাল্টিপ্লেয়ার খেলছেন, তবে কোডটি কেবলমাত্র আপনার মেশিনে চলে (অন্য খেলোয়াড় / সার্ভারটি কেবল ফলাফলগুলি দেখতে পাবে)
ফ্লোরিয়ান ক্যাসটেলেন

উত্তর:


42

স্ক্রিপ্টিং / এম্বেড / বর্ণিত ভাষায় লিখিত স্ক্রিপ্টগুলি যেমন "লুয়া", "লিস্প" বা "অ্যাঞ্জেলস্ক্রিপ্ট" ( আরও এখানে ) গেমের সময় আপডেট করা যেতে পারে [*] এবং তারপরে ফ্লাইয়ে ব্যাখ্যা করা হয় (= কার্যকর করা হয়)।

আপনি সেই স্ক্রিপ্টগুলি থেকে আপনার স্থানীয় সংকলিত কোডিং (সি ++ ইত্যাদি) এ আবদ্ধ করতে পারেন যাতে স্ক্রিপ্টগুলি তখন আপনার অ্যাপ্লিকেশন থেকে লজিক কার্যকর করতে পারে। E. g। ব্যবহারকারী একটি নির্দিষ্ট কমান্ড যা স্ক্রিপ্টে রাখতে পারে, ফলস্বরূপ গেম বিশ্বে একটি নির্দিষ্ট দূরত্ব দ্বারা গেমের চরিত্রটিকে সরিয়ে দেয়।

কিছু সম্পর্কিত সম্পর্কিত প্রশ্ন:


[*] হয় গেম খেলার অংশ হিসাবে ব্যবহারকারী দ্বারা বা অ্যাপ্লিকেশনটি পুনরায় আরম্ভ না করে দ্রুত পুনরাবৃত্তি / পরীক্ষার জন্য ডেভস দ্বারা


14
কিছু "বর্ণিত ভাষা" বলার সময় আমি সতর্কতা অবলম্বন করব। সর্বোপরি এটি অত্যন্ত বিতর্কিত শব্দ।
আশ্চর্য

1
কম্পিউটারক্রাফ্ট (মাইনক্রাফ্ট মোড) গেমের মধ্যে কর্মসূচির জন্য লুয়াএকে স্ক্রিপ্টিং ভাষা হিসাবে ব্যবহার করে।
টিকেব

20
আমি আসলেই কোলাহল বুঝতে পারি না। লিস্প উভয়ই ব্যাখ্যা এবং সংকলিত হতে পারে। ভাষাগুলি কীভাবে শ্রেণিবদ্ধ করা যায় এবং interpretedএকটি ভাল সংঘর্ষ কিনা তা আমরা এখানে ছাড়ার জন্য নেই; আমরা ওপি কে বলছি যারা এই সত্য সম্পর্কে অবগত নন যে ভাষার সংকলন করার দরকার নেই, তবে তা ব্যাখ্যা করা যেতে পারে - এবং আমরা উদাহরণস্বরূপ কিছু ভাষা দিই give লিস্প ব্যাখ্যা করা হয়? হ্যাঁ। এটি সংকলিত হয়? হ্যাঁ! তবে তা সুযোগের বাইরে। উত্তরটি শব্দের সাথে ভুল হতে পারে তবে এটি ঠিক আছে; এটি ওপিকে সঠিক দিকে ঠেলে দেয় এবং এটিই গণনা করে। এখানে, আমার +1 নিন।
ম্যাথিউরক

1
ভাল, যদি কোনও ভাষা কেবল সংকলনযোগ্য হয় তবে আইডিই, সংকলক এবং রানটাইমকে আপনার গেমটিতে এম্বেড করা থেকে বিরত কী? বাজেট বাদে, তা।
29

3
@ ড্যানিয়েলজোর যদিও আমি একমত হই যে তাত্ত্বিকভাবে কোনও ভাষা এর প্রয়োগ থেকে পৃথক হতে পারে (মেশিন কোড বনাম একটি ভিএম এর বাইকোডে সংকলিত), এটি এখনও কার্যকরভাবে সময় সাশ্রয়ী অনুমান যে অন্যথায় নির্দিষ্ট না হওয়া পর্যন্ত সি সংকলিত হয় (এবং আপনি কল্পনা করতে পারেন) আপনি যদি জিজ্ঞাসা করেন, "অপেক্ষা করুন, সংকলিত সি বা সি অনুবাদ করা সি?" ওপি'র উদ্দেশ্যে, তাকে এমন ভাষাগুলির দিকে নজর দেওয়া দরকার যা ব্যাখ্যার সমর্থন করে; সেগুলিও সংকলিত করা যায় কিনা তা একটি নন-ইস্যু, কারণ তিনি এটি ব্যবহার করবেন না।
ব্ল্যাকহক

12

এম্বেড করা ভাষাটি সঠিক প্রযুক্তিগত শব্দ। অনুশীলনে, অন্যান্য অ্যাপ্লিকেশনগুলির (যেমন গেমস) অভ্যন্তরে ব্যবহৃত ভাষাগুলিকে প্রায়শই স্ক্রিপ্টিং বা এমনকি ব্যাখ্যামূলক ভাষা হিসাবে উল্লেখ করা হয় , যদিও এগুলি অগত্যা রুটিন কার্যগুলির জন্য ব্যাখ্যা করা বা ব্যবহার করা উচিত নয়। "গেমগুলির জন্য স্ক্রিপ্টিং ভাষাগুলি" গুগলিং সম্ভবত "এম্বেড থাকা ভাষাগুলি" অনুসন্ধান করার চেয়ে আরও কার্যকর ফলাফল পেতে পারে।


11

আপনি কিছু ক্রিয়ায় কোড পরিবর্তন করার উপায় খুঁজছেন। এটি হ'ল দোভাষীরা যা করছেন।

পাইথন একবার দেখুন। আপনি এটি চালান, এবং বাম! আপনি REPL এ অবতরণ করুন ( R ead E val P rint L oop)।

আপনি "হ্যালো" একটি ফাংশন সংজ্ঞায়িত করেন যা "হ্যালো, ওয়ার্ল্ড" মুদ্রণ করে। এবং সেখানে আপনি এটা আছে!

লক্ষ্য করুন যে আপনি কিছু সংকলন করেন নি; দোভাষী উড়ে ফাংশন তৈরি করতে কিছু রান্না করেছিলেন (রানটাইম চলাকালীন) এবং এখন আপনি এটি কল করতে সক্ষম হন।

একই খেলাতে প্রযোজ্য। একটি REPL থাকার পরিবর্তে, আপনার কাছে REPL মডিউলটি রয়েছে। গেমটি সম্ভবত আরএপিএল শুরু করে এবং তারপরে এই আরপিএলে থাকা সমস্ত কিছু চালায় তাই আপনার ডেটাতে অ্যাক্সেস রয়েছে এবং সক্রিয়ভাবে এটি সংশোধন করতে পারবেন।

আপনি যদি C ++ এর মতো বিশাল ভাষার সাথে কাজ করে থাকেন তবে সেগুলি কম গতিময় এবং সম্ভবত সংকলিত হতে থাকে। আপনি কিছু সহজ চান। আপনি হয় নিজের ভাষা তৈরি করুন, বা বিদ্যমান কিছু ব্যবহার করুন (যেমন কফস্ক্রিপ্ট, কাঠবিড়ালি, লুয়া, স্কিম, ...)

এগুলিকে প্রায়শই স্ক্রিপ্টিং ল্যাঙ্গুয়েজ বলা হয় , যেহেতু আপনি এগুলি স্ক্রিপ্টগুলি লেখার জন্য ব্যবহার করেন যা অন্য কোনও ভাষায় বিকাশিত গেম ইঞ্জিনের উপর নির্মিত (যেমন সি ++)।


2

যদি গেম প্রোগ্রামিংয়ের ভাষাটি কেবল গেমের উদ্দেশ্যে তৈরি করা হয় তবে এটি একটি ডোমেন নির্দিষ্ট ভাষা

ডোমেন নির্দিষ্ট ভাষার সুবিধা (এবং অসুবিধে) হ'ল ব্যবহারকারী নিজে যা করতে পারে তা ভাষা নিজেই সীমাবদ্ধ করতে পারে (অর্থাত আপনি ইন্টারনেটে সংযোগ করতে অস্বীকার করতে পারেন)। আপনি এমন একটি ভাষা ডিজাইন করতে পারেন যা সাধারণ উদ্দেশ্যমূলক ভাষার চেয়ে সাধারণ গেমের কাজগুলিকে আরও সহজ করে তোলে। অসুবিধাটি হ'ল ব্যবহারকারীকে একটি নতুন ভাষা শিখতে হবে।

আপনার গেমের মধ্যে থেকে কেবল কোনও সাধারণ উদ্দেশ্যে ভাষায় (অজগর বা পার্লের মতো) অযৌক্তিক ব্যবহারকারীর কোড চালানো , ব্যবহারকারীর এমন জিনিসগুলির সাথে ঝামেলা করার সুযোগ দিতে পারে যা তার উচিত হয় না। তবে এটি আপনার গেমের উপর নির্ভর করে। আপনি যদি আপনার গেমের মধ্যে থেকে নতুন উইন্ডো খোলার মতো জিনিসগুলি পছন্দ করেন বা যা কিছু পছন্দ করেন তবে আপনি সাধারণ আপত্তিজনক ভাষা ব্যবহার করতে পারেন এবং আপনার গেম জগতের কয়েকটি বৈশিষ্ট্যের সাথে বাইন্ডিংগুলি প্রকাশ করতে পারেন।


1

দু'টি উদাহরণ রয়েছে যা আমি আমার মাথার উপরের অংশটি ভাবতে পারি। উভয়ই আপনার অনুরোধটি ঠিক তাই করছে বলে মনে হচ্ছে।

প্রথমটি হ'ল স্ক্রিপস। https://screeps.com/ এটি http://support.screeps.com/hc/en-us/articles/205960931- সার্ভার-পার্সড-আর্কিটেকচার- ওভারভিউ এ এই লক্ষ্যটি কীভাবে সম্পাদন করে সে সম্পর্কে আপনি প্রচুর পড়তে পারেন

দ্বিতীয়টি হ'ল কম্পিউটারক্রাফ্ট http://www.computerraft.info/ তারা কীভাবে এটি কাজ করে তার ততটা বিশদে যায় না তবে তাদের উইকিতে কিছুটা দেখা যায় http://www.computerraft.info/wiki/Main_Page

সংক্ষেপে, মূল গেমটি একটি পৃথক থ্রেডে একটি দোভাষী চালায়, তারপরে সেই থ্রেডটি এপিআই কলগুলির মাধ্যমে গেমের জগতকে চালিত করার অনুমতি দেয়।

উভয় উদাহরণে, যদিও ভাষাটি প্রায় সীমাহীন (কেবলমাত্র কিছু কল সুরক্ষার কারণে অবরুদ্ধ রয়েছে) ম্যানিপুলেশনগুলি এপিআই কলগুলি দ্বারা সীমাবদ্ধ যা এগুলি করা যেতে পারে।

এই জাতীয় কিছু শুরু করার জন্য খুব খুব কম কাজের প্রয়োজন হয়। তোমার দরকার

  • একটি থ্রেড ম্যানেজার যা আপনার গেমের লুপটিকে সুরক্ষিত করে (কোনও থ্রেড লুপটিকে লক করতে দেয় না বা অনেক সংস্থানগুলিতে গ্রাস করতে দেয় না)। উভয় উদাহরণ একটি সময় ভিত্তিক সীমাবদ্ধ ব্যবহার করে।
  • একটি ভাষা চালানোর জন্য দোভাষী। LUA আজকাল বেশ সাধারণ common
  • এপিআই কলগুলির একটি সেট যা গেমের জগতকে পরিবর্তন করে। প্রোগ্রামিং ল্যাঙ্গুয়েজটি কী মজাদার তা যদি আপনি কিছু না করতে পারেন।
  • একটি রিসোর্স ম্যানেজমেন্ট বাস্তবায়ন। অন্য কথায় কোড ফাইল সঞ্চয় এবং গেমগুলিতে তাদের রেফারেন্স করার একটি উপায়

প্রোগ্রামিংয়ের কোনও একক শাখা নেই যা এই সমস্ত উদ্বেগ পরিচালনা করে। তবে আপনার বহু-থ্রেডিংয়ের একটি শক্তিশালী ভিত্তি এবং একটি দোভাষী কীভাবে কাজ করে তার একটি সাধারণ জ্ঞানের প্রয়োজন হবে।


0

সংকলিত এক্সিকিউটেবল অবশ্যই একটি পার্সার থাকা আবশ্যক যা বাহ্যিক প্রোগ্রাম কোড পড়তে সক্ষম । প্রোগ্রাম কোডটি সি বা পাইথন বা জাইজেডের মতো দেখতে হবে না - এটি কোনও ধরণের বর্ণনামূলক ডেটা হতে পারে যা প্রশ্নের প্রয়োজনে উপযুক্ত। উদাহরণস্বরূপ সুইডিশ, বা মর্স।

বাহ্যিক প্রোগ্রাম কোডটির একটি বাক্য গঠন থাকা দরকার , যাতে পার্সার চরিত্র অনুযায়ী এটি অক্ষরটি পড়ার সাথে সাথে এটি বুঝতে পারে। সিনট্যাক্স বর্ণনা হতে পারে (এবং কোড থাকতে পারে) সনাক্তকারীগুলি সাংখ্যিক মান, অপারেটর ইত্যাদি

পার্সার ঠিক করা (সংকলিত) তবে এটি নমনীয়, বাহ্যিক কোডে কাজ করে।

সংকলিত নির্বাহযোগ্য এর প্রাসঙ্গিক কার্যকারিতার জন্য একটি অভ্যন্তরীণ API থাকতে হবে। যাতে পার্সার ক্রিয়া সম্পাদন করতে পারে। সম্ভবত সম্ভবত এক্সিকিউটেবলের অভ্যন্তরীণ ডেটাতে (দ্বি-দিকনির্দেশক) অ্যাক্সেস থাকতে হবে, বা পার্সারকে অবশ্যই এক ধরণের ডেটা স্টোরেজ এবং গৃহস্থালি সরবরাহ করতে হবে।

পার্সার এক্সিকিউটেবল এর এ বাহ্যিক প্রোগ্রাম কোড পড়তে পারেন প্রারম্ভে , অথবা এটি (এর অংশের) পড়তে পারেন এটা তদর্থক , অথবা এটি করতে পুনরায় পড়তে প্রতিটি ফ্রেম প্রতি (অদক্ষ হবে), বা কোড এমনকি হতে পারে হাতে টাইপ করা এবং এটি প্রস্তুত হওয়ার সাথে সাথে পার্সারে পোস্ট করেছে (যেমন: "ইউনিট এক্সের পাঁচ ধাপ এগিয়ে যান" [প্রবেশ করুন])।

মূলত, বাহ্যিক কোডটি স্থির নয় - এটি যে কোনও বছর, দিন বা মিনিট পরিবর্তন করতে পারে, তবে এখনও সম্পাদনযোগ্যকে পুনরায় সংকলনের প্রয়োজন হয় না। শুধুমাত্র নির্বাহী দ্বারা হোস্ট হোস্টিং ফলাফল, পরিবর্তন করে।

আপনি এখন যে পাঠ্যটি পড়ছেন তা হ'ল (এক ধরণের এবং আরও বেশি বলা হলেও) এটি ব্যাখ্যা করা হয়েছে কারণ আপনি এটি পড়ার সময় আপনার মস্তিষ্কে এটি "চালনা" করেন, পরবর্তী বাক্যটি কী বলে তা না জেনে (বা এমনকি এটি সম্ভবত, স্নেহকীভাবে ডান পরিবর্তন করে) এখন)। স্ট্যাক ওভারফ্লো (প্রাক) আপনার মস্তিস্কের বাইটোকোডে পুরো কাহিনীটি সংকলনের বিপরীতে, যা এটি সম্পাদন করে - এবং এরপরে এটি আর পরিবর্তন করতে পারে না।

Phenomen চলমান interpretion হয়। স্ক্রিপ্টিং কেবলমাত্র একটি ডিএসক্রিপ্ট তৈরি বা রচনার কাজ । সমস্ত কম্পিউটার কোডিং ইমো স্ক্রিপ্টিং - আমরা কী হতে চাই তা বর্ণনা করি। "স্ক্রিপ্টিং" শব্দের কিছুটা ঝুঁকির অর্থ পেয়েছে তবে ঠিক আছে। আমরা কী বলতে চাই তা আমরা জানি।

বর্ণিত ভাষার সাথে অসাধারণ কিছু নেই এবং এটি কোনওভাবেই একটি বিতর্কিত শব্দ নয় । তাদের মধ্যে অনেকগুলি উপস্থিত রয়েছে এবং খুব প্রাচীনতমদের কয়েকটি সংকলনের বিপরীতে ব্যাখ্যা করা হয়। একটি ব্যাখ্যা করা ভাষায় উদাহরণস্বরূপ হাত দ্বারা টাইপ করুন:

সোক = সকেট.নিউ (অ্যাড্রেসফ্যামিলি.ইন্টারনেটওয়ার্ক, সকেটটাইপ। স্ট্রিম প্রোটোকল টাইপ.টিসিপি) [এন্টার]

... এবং তারপরে 30 ... না, 45 মিনিটের কফি বিরতিতে যান :-)। ফিরে আসার সময়, "মোজা" উপস্থিত থাকে এবং হাত দিয়ে আরও টাইপ করে বা দোভাষীটির অটোমেশনটিকে এটি দিয়ে চালিয়ে দিয়ে আরও ব্যবহারের জন্য প্রস্তুত।


একটি প্রচলিত ভুল ধারণা রয়েছে যে কোনও ভাষার অর্থ ব্যাখ্যা করা অবশ্যই ধীর হতে হবে। এটা সত্য নয়. এই আলোচনার পক্ষে মন্তব্যগুলির পক্ষে এই বিষয়টিকে বহুল প্রচারযোগ্য বিভিন্ন বিষয়ের উপর নির্ভর করে, দোভাষী ভাষা তাত্পর্যপূর্ণ বা কম ধীর হতে পারে, তত দ্রুত বা কিছু অপারেশনের জন্যও দ্রুত ভাষা হিসাবে বিবেচিত হয় (সাধারণত সি) language সকেটের উদাহরণটি সম্ভবত সি এর মতো কম-বেশি কাজ করবে, সুতরাং উদাহরণটি বিভ্রান্তিকর। আপনি কয়েকটি ভাষায় রানটাইমে সংকলিত ক্রিয়াকলাপগুলি পুনরায় সংজ্ঞায়িত করতে পারেন এবং ব্যাখ্যা করার অর্থ কেবল "সেই সময়ে এক নির্দেশে যাওয়া" নয়।
ম্যাথিউরক

নিশ্চিতভাবেই, কোনও অনুবাদিত ভাষা দ্রুতও পারফরম্যান্স করতে পারে - সর্বোপরি এটি কার্যকর হওয়া বাইটোকোডের পরে এবং অনুবাদকটির অটোমেশনের উপর নির্ভর করে কার্যকরকরণটি আরও ভালতর অনুকূলিত হতে পারে। অতিরিক্তভাবে, কিছু দোভাষী অনুবাদক কোড থেকে কোডের কিছু অংশকে বাইটকোডে (এবং চালানো), সংকলন করতে পারেন, এই উদাহরণটি স্বাধীনতার কেবল উদাহরণ, "সময়ে একটি নির্দেশিকা নির্ধারণ করা"? আচ্ছা, এটি একটি অপ্রয়োজনীয়করণ, সম্ভবত "ভবিষ্যতের কোড নমনীয় থাকাকালীন যোগ করুন"।
স্টর্মওয়াইন্ড

সিনেমার স্ক্রিপ্টের মতো "স্ক্রিপ্ট" সম্পর্কে আরও ভাবুন - আপনার এখনও অভিনেতা প্রয়োজন এবং এগুলি সরাসরি জীববিজ্ঞান এবং সমাজবিজ্ঞানের ক্ষেত্রে সংজ্ঞায়িত করা হয়, থিয়েটার বিজ্ঞান নয় (যদিও এগুলি শেষ পর্যন্ত জীববিজ্ঞান এবং সমাজবিজ্ঞানের উপর ভিত্তি করে), কারণ এই ভাষাগুলি আরও বেশি সেই উদ্দেশ্যে উপযুক্ত তবে অন্যটি নয় :)
রেক্যান্ডবোনম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.