আমি কীভাবে মাইনক্রাফ্টের কারুকাজ গ্রিডের মতো কিছু বাস্তবায়ন করতে পারি?


55

Minecraft মধ্যে ক্রাফ্টিং সিস্টেম একটি 2x2 বা 3x3 গ্রিড ব্যবহার করে। আপনি গ্রিডে উপাদানগুলি রাখুন এবং আপনি যদি সঠিক উপাদানগুলিকে সঠিক প্যাটার্নে রাখেন তবে এটি রেসিপিটি সক্রিয় করবে।

নকশা সম্পর্কে কিছু আকর্ষণীয় বিষয়:

  • কিছু রেসিপি অন্যের জন্য নির্দিষ্ট উপাদানের বিনিময় করতে পারে। উদাহরণস্বরূপ, একটি বাছাইটি হাফটির জন্য লাঠি ব্যবহার করে এবং কাঠের কাঠি, কোচলি, লোহা সিঁদুর, সোনার ইনগটস বা মাথার জন্য হীরা রত্ন ব্যবহার করতে পারে।
  • প্যাটার্নের মধ্যে আপেক্ষিক অবস্থান হ'ল গ্রিডে পরম অবস্থান নয় matters এটি, আপনি 3x3 গ্রিডে ছয় অবস্থার যে কোনওটিতে সঠিক কাঠামোয় কাঠি এবং কয়লা (বা কাঠকয়লা) রেখে একটি টর্চ তৈরি করতে পারেন ।
  • প্যাটার্নগুলি অনুভূমিকভাবে উল্টানো যেতে পারে।

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


6
অসাধারণ প্রশ্ন! আমি খুবই আগ্রহী! আমার ইতিমধ্যে কিছু ধারণা আছে তবে আমি ঘরে পৌঁছানোর সাথে সাথে এগুলি ভাগ করে নেব।
jcora

আমি প্রকৃতপক্ষে একটি "যতটা সম্ভব সম্ভব" মাইনক্রাফ্ট অনুলিপিটি লেখার চেষ্টা করছি। আমি ইতিমধ্যে সমস্ত জায় এবং রেসিপি ম্যানেজার স্টাফ লিখেছি এবং আমাকে বলতে হবে এটি খুব ঝরঝরে কাজ করছে। আমি পরিষ্কার কোড সম্পর্কে সন্তুষ্ট। তবে এটি লেখা সহজ ছিল না। আমি রেসিপি, গ্রিড, ইনভেন্টরি ইত্যাদি সুন্দরভাবে কাজ করার জন্য প্রায় 10 টি ক্লাস লিখেছিলাম যখন আমি কিছুটা সময় পাই, আমি একটি উত্তর লিখব।
মার্তিজন আদালত

আপনি কীভাবে মাইনক্রাফ্টকে তাদের কারুকাজের রেসিপিগুলি কোড করেন তা দেখতে হবে।
Bradman175

উত্তর:


14

আরেকটি সমাধান হ'ল কিছু জটিল গাছ ব্যবহার করা। আপনার গাছের শাখা নোডগুলি পুনরায় রেসিপিটির মাধ্যমে পুনরায় (আবার ব্যবহার করে for (y) { for (x) }) তৈরি করা হবে; এটি আপনার স্টক-স্ট্যান্ডার্ড বাই বইয়ের গাছ কাঠামো। আপনার চূড়ান্ত নোডে একটি অতিরিক্ত কাঠামো থাকবে ( Dictionary/ HashMap) যা রেসিপিগুলিতে মাত্রা ম্যাপ করে।

মূলত আপনি যা যাচ্ছেন তা হ'ল:

রেসিপি গাছ

কালো নোডগুলি আপনার শাখা যা আইটেমের ধরণকে নির্দেশ করে - লালগুলি হ'ল আপনার পাতাগুলি (টার্মিনেটর) যা আপনাকে আকার / ওরিয়েন্টেশনকে আলাদা করতে দেয়।

এই গাছটি অনুসন্ধান করার জন্য আপনি প্রথমে বাউন্ডিং বাক্সটি খুঁজে পাবেন (আমার প্রথম উত্তরে বর্ণিত হিসাবে ) এবং তারপরে নোডের উপর একই ক্রমে পুনরায় ঘুরে দেখবেন গাছটি যখন যাচ্ছেন ততক্ষণে tra অবশেষে আপনি কেবল আপনার মাত্রা আপ দেখাবে Dictionaryবা HashMapএবং আপনার রেসিপি ফল পাবে।

কেবল কিকের জন্য গিয়েছিলাম এবং এটি প্রয়োগ করেছি - যা সম্ভবত আমার উত্তরটি পরিষ্কার করে দেবে। এছাড়াও : আমি বুঝতে পারি এটি একটি আলাদা উত্তর - এবং যথাযথভাবে তাই: এটি একটি ভিন্ন সমাধান।


খুব সোজা। আমি এটা পছন্দ করি.
ডেভিড আইক

আমি এটি গ্রহণ করব, কারণ আমি গাছ, হ্যাশ এবং ডায়াগ্রাম পছন্দ করি যা বিষয়টির হৃদয় কেটে যায়। চিত্রটি একবার দেখুন এবং আমি আপনার অ্যালগরিদমটি প্রায় সঙ্গে সঙ্গে বুঝতে পারি।
ডেভিড আইক

23

আপনাকে মনে রাখতে হবে যে মিনক্রাফ্ট কেবলমাত্র সম্ভাব্য রেসিপিগুলির একটি খুব সামান্য সেট ব্যবহার করে, সুতরাং সেই স্মার্ট কোনও কিছুর প্রয়োজন নেই।

এটি বলেছিল যে আমি যা করব তা হল সবচেয়ে ক্ষুদ্রতম গ্রিড যা ফিট হয় (যেমন খালি সারি এবং কলামগুলি এটি উপেক্ষা করুন এটি একটি 2x2 বা 3x3, বা 2x3 (দরজা)) সন্ধান করুন। তারপরে সেই আকারের সাথে রেসিপিগুলির তালিকাটি লুপ করুন, আইটেমের ধরণটি একই রকম কিনা তা খতিয়ে দেখুন (যেমন, মাইনক্রাফ্টের মধ্যে 9 টি পূর্ণসংখ্যার তুলনায় এটি আইটেম এবং ব্লকগুলির জন্য একটি পূর্ণসংখ্যার টাইপ আইডি ব্যবহার করে) এবং আপনি কোনও মিল খুঁজে পেলে থামুন।

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

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

এছাড়াও একটি শেষ জিনিস, রেসিপি অনুভূমিকভাবে সহজভাবে উল্টানো অনুমতিটি কেবল তালিকায় মিরর করা সংস্করণ যুক্ত করা।

আপনি যদি দ্বিতীয় রেসিপিটি যোগ না করে এটি করতে চান তবে ইনপুট রেসিপিতে [0,2] এর চেয়ে বেশি আইডি [0,0] এ কোনও আইটেম রয়েছে কিনা তা পরীক্ষা করতে পারবেন [0,2] (বা [0,1] 2x2 এর জন্য, কোনও চেকের দরকার নেই) 1x2 এর জন্য এবং যদি এটি মিরর হয় তবে আপনি যদি শেষ না হওয়া পর্যন্ত পরবর্তী সারিটি পরীক্ষা করে না চালাচ্ছেন তবে এটি ব্যবহার করে আপনাকেও নিশ্চিত করতে হবে যে রেসিপিগুলি সঠিক রোটেশনে যুক্ত হয়েছে কিনা।


1
আমি ভাবলাম যে মিনক্রাফ্টের সংখ্যক রেসিপিগুলি নিজেকে লিনিয়ার অনুসন্ধানে leণ দিতে পারে না।
ডেভিড আইক

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

15

যদি আপনি 3x3 গ্রিডটিকে স্ট্রিং হিসাবে এনকোড করে এবং নিয়মিত এক্সপ্রেশন ম্যাচ ব্যবহার করেন তবে কোনও নির্দিষ্ট গ্রিড কনফিগারেশন একটি নির্দিষ্ট রেসিপিটির সাথে মেলে কিনা তা সহজ । চেহারাটির গতি বাড়ানো একটি আলাদা বিষয়, যা আমি শেষ পর্যন্ত আলোচনা করব। আরও তথ্যের জন্য পড়ুন।

পদক্ষেপ 1) স্ট্রিং হিসাবে এনকোড গ্রিড

প্রতিটি ধরণের ঘরে সহজেই একটি চর আইডি দিন এবং এই ক্রমের সাথে পাশাপাশি প্রতিটি জিনিসকে সম্মিলিত করুন:

123
456 => 123456789
789

এবং আরও দৃ example় উদাহরণ হিসাবে, স্টিকের রেসিপিটি বিবেচনা করুন, যেখানে ডাব্লু কাঠের জন্য দাঁড়িয়ে আছে এবং ই একটি খালি ঘর (আপনি কেবল খালি চর ব্যবহার করতে পারেন):

EEE
WEE => EEEWEEWEE
WEE

পদক্ষেপ 2) নিয়মিত এক্সপ্রেশন (বা স্ট্রিং.ডাটাতে কিছুটা প্রসেসিংয়ের সাথে যুক্ত) ব্যবহার করে রেসিপি ম্যাচ করুন

উপরের উদাহরণ থেকে অবিরত, এমনকি আমরা চারপাশে গঠনটি সরিয়ে নিলেও, স্ট্রিংটিতে এখনও একটি প্যাটার্ন রয়েছে (উভয় পক্ষের E দ্বারা প্যাড করা WEW):

EEW
EEW => EEWEEWEEE
EEE

সুতরাং আপনি লাঠিটি যেখানেই সরিয়ে নিয়ে যান না কেন এটি নিচের নিয়মিত অভিব্যক্তির সাথে মিলবে: /^E*WEEWE*$/

নিয়মিত প্রকাশগুলি আপনাকে উল্লেখ করা শর্তাধীন আচরণ করতে দেয়। উদাহরণস্বরূপ (তৈরি রেসিপি), যদি আপনি একই ফল দেওয়ার জন্য লোহা বা পাথরের তৈরি একটি পিক্সেস চান, তবে :

III    SSS
EWE or EWE
EWE    EWE

আপনি উভয়কে নিয়মিত প্রকাশের সাথে একত্রিত করতে পারেন: /^(III)|(SSS)EWEEWE$/

অনুভূমিক ফ্লিপগুলিও ঠিক সহজেই যুক্ত করা যায় (অপারেটরটিও ব্যবহার করে)।

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

পদক্ষেপ 3) গতি বাড়িয়ে দেখুন

অনুসন্ধান হ্রাস করার ক্ষেত্রে, আপনাকে একসাথে গ্রুপের রেসিপিগুলিতে কিছু ডেটা স্ট্রাকচার তৈরি করতে হবে এবং অনুসন্ধানে সহায়তা করতে হবে। গ্রিডটিকে স্ট্রিং হিসাবে চিকিত্সা করার কিছু সুবিধা এখানে রয়েছে :

  1. আপনি প্রথম কোনও শূন্য অক্ষর এবং সর্বশেষ খালি অক্ষরের মধ্যবর্তী দূরত্ব হিসাবে কোনও রেসিপিটির "দৈর্ঘ্য" সংজ্ঞায়িত করতে পারেন। একটি সাধারণ Trim().Length()আপনাকে এই তথ্য দেবে। রেসিপিগুলি দৈর্ঘ্য অনুসারে ভাগ করা যায় এবং অভিধানে সংরক্ষণ করা যেতে পারে।

    অথবা

    "দৈর্ঘ্যের" একটি বিকল্প সংজ্ঞা খালি খালি অক্ষরের সংখ্যা হতে পারে। আর কিছুই বদলায় না। আপনি এই মানদণ্ড অনুসারে রেসিপিগুলিও গ্রুপ করতে পারেন।

  2. যদি পয়েন্ট নম্বর 1 পর্যাপ্ত না হয় তবে রেসিপিগুলিতে প্রথমে যে উপাদানটি প্রদর্শিত হবে প্রথম ধরণের ধরণের দ্বারাও আরও গ্রুপ করা যেতে পারে। এটি করা যেমন সহজ হবে Trim().CharAt(0)(এবং খালি স্ট্রিংয়ের ফলে ট্রিমের বিরুদ্ধে রক্ষা করা)।

সুতরাং উদাহরণস্বরূপ আপনি একটি রেসিপি সংরক্ষণ করতে হবে:

Dictionary<int, Dictionary<char, List<string>>> _recipes;

এবং লুকিংয়ের মতো কিছু সম্পাদন করুন:

// A string encode of your current grid configuration 
string grid;

// Get length and first char in our grid
string trim = grid.Trim();
int length = trim.Length();
char firstChar = length==0 ? ' ' : trim[0];

foreach(string recipe in _recipes[length][firstChar])
{
    // Check for a match with the recipe
    if(Regex.Match(grid, recipe))
    {
        // We found a matching recipe, do something with it
    }
}

3
এটি ... খুব স্মার্ট।
রাভলাইন

18
আপনার একটি সমস্যা আছে এবং আপনি নিয়মিত এক্সপ্রেশন ব্যবহার করে এটি সমাধান করতে চান? এখন আপনার 2 টি সমস্যা আছে :)
ক্রোমস্টার বলেছেন মনিকা 24

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

2
@ ডেভিডগুভিয়া, এটি কেবলমাত্র এমন লোকদের জন্য একটি বাক্য যা রেজেক্সের সাথে খুব বেশি স্বাচ্ছন্দ্য বোধ করে না। যদি তারা রেজেক্সের সাথে কোনও সমস্যার সমাধান করার সিদ্ধান্ত নেয়, তাদের এখন দুটি সমস্যা রয়েছে: (1) তারা যে সমস্যাটি সমাধান করতে চান (2) সেই সমস্যাটি সমাধান করার জন্য রেজেক্স প্যাটার্ন লিখেছেন
iamserious

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

3

আমি আপনাকে মিনক্রাফ্ট কীভাবে কাজ করে তা বলতে পারি না - যদিও আমি নিশ্চিত যে আপনি এমসিপির দিকে নজর রেখেছিলেন (যদি আপনার মাইনক্রাফ্টের আইনী অনুলিপি থাকে) তবে আপনি খুঁজে পেতে পারেন।

আমি নিম্নলিখিত হিসাবে এটি বাস্তবায়ন করবে:

  1. কিছু ডিস্ক-ভিত্তিক অভিধান / হ্যাশম্যাপ ( বি + ট্রি / এসকিউএল-লাইট ) রয়েছে - মানটি রেসিপি ফলাফলের আইটেম আইডি হবে।
  2. যখন কোনও ব্যবহারকারী নৈপুণ্য বানাচ্ছেন তখন কোনও আইটেম সহ প্রথম সারি / কলামটি সন্ধান করুন INDEPendENTLY ; এটি একটি অফসেটে একত্রিত করুন।
  3. আবার কোনও আইটেম সহ সর্বশেষ সারি / কলামটি স্বতন্ত্রভাবে সন্ধান করুন।
  4. আইটেমগুলি থেকে প্রস্থ এবং উচ্চতা গণনা করুন এবং এটি কীতে যুক্ত করুন।
  5. আপনি কেবল গণনা করেছেন এবং প্রতিটি আইটেমের আইডি যুক্ত করুন (আপনার স্বাভাবিক ব্যবহার করে for (y) { for (x) }) সীমাবদ্ধ বাক্সের সীমার উপরে লুপ করুন ।
  6. ডাটাবেসে কী সন্ধান করুন।

সুতরাং উদাহরণস্বরূপ বলা যাক যে আমাদের দুটি উপাদান রয়েছে; এক্স এবং ওয়াই এবং ফাঁকা স্থান *। নিম্নলিখিত রেসিপি গ্রহণ করুন:

**X
**Y
**Y

প্রথমে আমরা বাউন্ডিং বক্সটি বের করি, ফলন করি (2,0)-(2,2)। সুতরাং আমাদের কী এর মতো দেখতে হবে [1][3](1 প্রস্থ, 3 উচ্চতা)। এরপরে আমরা বাউন্ডিং বাক্সের মধ্যে প্রতিটি আইটেমটি লুপ করব এবং আইডি সংযোজন করি, সুতরাং কীটি হয়ে যায় [1][3][X][Y][Y]- আপনি এটি আপনার অভিধান / ডিবিতে দেখুন এবং আপনি সেই রেসিপিটির ফলাফল পাবেন।

২ য় ধাপে স্বাধীনতার আরও ব্যাখ্যা করতে, নীচের রেসিপিটি বিবেচনা করুন:

*XX
XXX
XX*

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


বুককিট রিপোজিটরিতে কোনও মাইনক্রাফ্ট কোড নেই, আপনার এমসিপি লাগবে (এবং মাইনক্রাফ্টের একটি অনুলিপি)
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

এটি কি আপনার অন্যান্য উত্তরের বিপরীত নয়?
ডেভিড আইক

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.