ডায়াব্লো / ওও-স্টাইল প্রতিভা গাছের জন্য আমি কোন ডেটা কাঠামো ব্যবহার করব?


23

আমি ওয়ার্ল্ড ওয়ার্কফ্রটে যেমনটি দেখেছি তেমন একটি অনলাইন আরপিজির জন্য একটি প্রতিভা-বৃক্ষ ব্যবস্থা বাস্তবায়নের বিষয়ে বিবেচনা করছি, যেখানে দক্ষতা অর্জন করা গাছের নীচে পরবর্তী "স্তর" আনলক করে।

ডাটাবেস / কোডে এই কাঠামোগতভাবে প্রয়োগের সর্বোত্তম উপায় সম্পর্কে কেউ কি জানেন?

উত্তর:


13

একটি ডাটাবেসে গাছ প্রতিনিধিত্ব করতে এই জাতীয় কাঠামো ব্যবহার করুন:

#Talent
id  parent  description
1   0       Tackle
2   1       Kick
3   1       Punch
4   3       Fire Punch

এবং ব্যবহারকারীর অধীনে প্রাপ্ত প্রতিভা উপস্থাপনের জন্য অন্য একটি সারণী

#UserTalent
id  user  talent
1   4     1
2   4     3
3   4     4

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

যদি একাধিক নির্ভরতা থাকে, যেমন উদাহরণস্বরূপ Fire Punchনির্ভর করে Punchএবং Immolationনির্ভরতা গ্রাফ উপস্থাপন করতে দুটি টেবিল ব্যবহার করুন:

#Talent
id  description
1   Tackle
2   Kick
3   Punch
4   Fire Punch
5   Immolation

#Depedency
id  parent  child
1   0       1
2   0       5
3   1       2
4   1       3
5   3       4
6   5       4

আপনার UserTalentটেবিলটিতে অটোকি কলামের প্রয়োজন নেই। userএবং talentশুধুমাত্র দুটি কলাম এবং একটি সংমিশ্রিত কী হতে পারে: সেগুলি কখনই সদৃশ হবে না এবং আপনি যেভাবে idকোনওভাবেই জিজ্ঞাসা করতে পারবেন না ।
ডপপেলগ্রিনিয়ার

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

3
@ জোনাথান হবস: একটি স্বয়ংসোধমূলক প্রাথমিক আইডি সর্বদা মুছে ফেলার / আপডেট করার জন্য দুর্দান্ত। এটি কখনই ধীর হয় না তবে প্রায়শই দ্রুত হয়। এছাড়াও সারি আকার এখানে উদ্বেগের নয়। অনন্য প্রতিভা নামের ক্ষেত্রেও একই কথা। ভাল পারফরম্যান্সের জন্য আপনি কেবল অনন্য পূর্ণসংখ্যায় আপনার টেবিলগুলিতে যোগদান করতে চান। দেখুন en.wikipedia.org/wiki/Database_normalization ইত্যাদি
জোনাস Bötel

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

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

5

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

class Talent {
    std::vector<Talent*> children;
    bool earned;
};

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


আপনি একটি নেটিভ অ্যারে এবং একটি আকার একটি পয়েন্টার পেয়েছেন? ব্যর্থ - একটি স্ব-মালিকানাযুক্ত স্ব-আকারের পয়েন্টার ব্যবহার করুন।
ডেড এমজি

ওহো ... সি / সি ++ মিক্সআপ এবং একটি ত্রুটি। আমি আমার উত্তর আপডেট করেছি। সতর্ক থাকুন জন্য ধন্যবাদ.
ভূত

@ ডেড এমএমজি: 'স্ব-মালিকানাধীন স্ব-সাইজিং' বলতে আপনার অর্থ কী? আপনি কি উপরের ভেক্টরের মতো কিছু উল্লেখ করছেন, বা আপনি অন্য কিছু নিয়ে ভাবছেন?
কাইলোটন

একটি বুস্ট ptr_vectorআরও ভাল হতে পারে।
জ্যান লিংস

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

1

আমার গেমটিতে আমি এটি এটি করি:

ডেটাবেস:

reference_talent : একটি অনন্য আইডি, নাম, প্রভাব ইত্যাদি ধারণ করে

প্রতিভা : আইডি, প্লেয়ারিড <- এর মধ্যে সমস্ত প্রতিভা প্লেয়ার রয়েছে "শিখেছে"।

খেলার মধ্যে: (সার্ভারে)

আমি সমস্ত 'রেটিক্যাল' স্ট্যান্ডার্ড :: মানচিত্রে সমস্ত রেফারেন্স_সামগ্রীগুলি লোড করেছি যাতে আমি তাদের আইডি দিয়ে এগুলি সহজে অ্যাক্সেস করতে পারি।

যখন কোনও ক্লায়েন্ট কোনও খেলোয়াড় পরীক্ষা করে দেখেন আমি ডেটাবেস থেকে সমস্ত প্রতিভা অর্জন করি এবং একটি স্টাডি :: ভেক্টরে স্টক করে রাখি যাতে যখন যখন আমার বৈশিষ্ট্য ইত্যাদি গণনা করা দরকার তখন আমি তাদের র‍্যামে রাখি। আমি প্রতিভা ক্লায়েন্টকে প্রেরণ করি।

এটি সম্পর্কে (টেবিলের 'প্রতিভা' + ক্লায়েন্টের জন্য একটি বার্তা কেবলমাত্র একটি 'প্রতিভা' সংরক্ষণ করা ব্যতীত)।


0

সম্পর্কিত সম্পর্ক

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

মডেলিং সম্পর্কের বিষয়ে আপনি কতটা জানেন তা আমি জানি না। এই টিউটোরিয়ালটি এর সাথে আপনাকে সহায়তা করবে।

একটি সমাধান

আমি ধরে নিলাম যে বাস্তবে যেমন বাহ্যিকভাবে কাজ হয় (এএইচএম), এটি এটি

  • প্রতিভা বেশ কয়েকটি (অন্যান্য) প্রতিভা আনলক করে
  • প্রতিভা বেশ কয়েকটি (অন্যান্য) প্রতিভা দ্বারা আনলক করা হয়।

এটি এন: এন সম্পর্ক, যা বোঝায় যে আপনার "মধ্যবিত্ত" দরকার দুটি প্রতিভার মধ্যে একটি নতুন সম্পর্ক:

(talent who unlocks id, talent who is unlocked)

এইভাবে আপনি প্রতিভা A আনলকিং বি, সি এবং ডি ((এ, বি), (এ, সি), (এ, ডি)) এবং এক্স, জেড এবং ডাব্লু (এক্স, ওয়াই) দ্বারা তালাবদ্ধ প্রতিভা থাকতে পারে, জেড, ওয়াই), (ডাব্লু, ওয়াই))। অত্যাবশ্যক / প্রক্রিয়াগত / অবজেক্ট-ভিত্তিক ভাষায় আপনি এটির মতো জোড়ার তালিকা / অ্যারে হিসাবে এটি করবেন:

var unlocks_unlocked = [[A, B],[A,C],[A,D],[X,Y],[Z,Y],[W,Y]];

সুতরাং "রিয়েল-ওয়ার্ল্ড" উদাহরণস্বরূপ আপনি থাকতে পারেন:

... ["running fast", "jumping superhigh"], ["antigravity's child", "jumping superhigh"]

এবং এর অর্থ হ'ল আপনার "দ্রুত চলমান" এবং "অ্যান্টিগ্রাভিটির শিশু" প্রতিভা অর্জনের পরে "জাম্পিং সুপারহাই" পাওয়া যায়।

অন্যান্য সমাধান

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

  • প্রতিভা অন্যান্য বেশ কয়েকটি প্রতিভা আনলক করে
  • প্রতিভা কেবল একটি প্রতিভা দ্বারা আনলক করা হয়।

এটি 1: এন সম্পর্ক:

 You put "is unlocked by this talent's id" variable into talent's structure

মত:

 var Talent[8] = { "name": "superpower", "unlocked by": "being Clark Kent"};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.