গেম রিসোর্সের জন্য একটি উদাহরণ বা ক্লাস ব্যবহার করুন (কাঠ, লোহা, সোনার)


31

সুতরাং আমি এমন একটি গেম তৈরি করছি যেখানে আপনি কাঠ, লোহা, সোনার ইত্যাদির মতো সংস্থান কিনতে বা কেনার জন্য লোকেশনগুলিতে জাহাজ পাঠাতে পারেন

এখন আমি ভাবছিলাম কীভাবে ডি গেমটিতে সংস্থানগুলি তৈরি করা উচিত। আমি 2 টি বিকল্প নিয়ে এসেছি

  1. প্রতিটি সংস্থান জন্য একটি বর্গ তৈরি করুন:

    public class ResourceBase {
        private int value;
        // other base properties
    }
    
    public class Gold : ResourceBase {
         public Gold {
             this.value = 40 // or whatever
         }
    }
    
  2. একটি উত্স শ্রেণীর উদাহরণ তৈরি করুন

    public class Resource {
        string name;
        int value;
    
        public Resource(string name, int value) {
            this.name = name;
            this.value = value;
         }
     }
    
    // later on...
    
    Resource gold = new Resource("Gold",40);
    

দ্বিতীয় বিকল্পের সাহায্যে একটি রিসোর্স.জেএসন ফাইল থেকে গেমের সংস্থান পূরণ করা সম্ভব, আমি সেই কাঠামোটি পছন্দ করি।

নতুন ধারণা / নকশা নিদর্শন / কাঠামো সর্বদা স্বাগত!

সম্পাদনা: এটি Assassins ক্রেড ব্ল্যাক ফ্ল্যাগের সহযোগী অ্যাপ্লিকেশনটির মতো কিছুটা। নীচের চিত্রের রিসোর্স বারটি দেখুন

সম্পাদনা 2: আমি "JSON ফাইল থেকে লোড আইটেম / সংস্থানগুলি" সম্পর্কে আরও কিছু গবেষণা করেছি এবং এই ব্লগটি পেয়েছি: গেম ডেভলপমেন্টে জেএসএনের পাওয়ার - আইটেম । এটি বিকল্প 1 এবং বিকল্প 2 এর সর্বোত্তম দেখায় আপনি এখনও প্রতিটি সংস্থায় কার্যকারিতা যুক্ত করতে সক্ষম হন :)

এখানে চিত্র বর্ণনা লিখুন


1
মাইনক্রাফ্টের প্রতিটি সংস্থার জন্য পৃথক ক্লাস রয়েছে (আপনার উচিত নয়)
এমসিমেস্ট্রি

@ এমসিমিস্ট্রি ওহ মাইনক্রাফ্ট ওপেন সোর্স? আমি সেই কাঠামোটি একবার দেখতে চাই। এবং thx উল্লেখ করার জন্য
MDijkstra

1
এটি নয়, এটি সর্বদা সার্ভারগুলির জন্য অবহেলিত
এমসিমিস্ট্রি

12
এর মতো স্ট্রিং ব্যবহার করবেন না। "গ্লোড" বা অনুরূপ দিয়ে "সোনার" ভুল টাইপ করা খুব সহজ এবং এটি ডিবাগ করার জন্য একটি বিশাল ব্যথা। enumপরিবর্তে ব্যবহার করুন ।
নোলোনার

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

উত্তর:


51

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


সম্পাদনা:

এটি সাধারণ ভাল অভ্যাসে কেন আরও কিছুটা বিশদভাবে জানাতে, আপনি যদি 100% নিশ্চিত হন যে কিছু মান কখনই বদলাবে না।

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

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

এখন কল্পনা করুন যে আপনি 30,000 ডলার প্রদান করে অপেক্ষা করার জন্য আপনার গেমটি মুক্তির জন্য চাপ দিচ্ছেন। এবং হঠাৎ আপনি লক্ষ্য করেছেন যে আপনার কিছু গেমের মান আক্ষরিক অর্থেই নষ্ট হয়ে গেছে। ধরা যাক আপনি 50 স্বর্ণের জন্য লোহার বারগুলি কিনতে পারেন এবং সেগুলি 55 সোনায় বিক্রি করতে পারেন।

আপনি কি করেন? যদি আপনি সেই স্টাফটিকে কঠোরভাবে কোড করেছেন, আপনাকে নতুন আপডেট / প্রকাশের সংস্করণ তৈরি করতে হবে, যা পুনরায় পর্যালোচনার মধ্য দিয়ে যেতে হবে, তাই সবচেয়ে খারাপ ক্ষেত্রে আপনি পুনরায় শংসাপত্রের জন্য আবার একবার অর্থ প্রদান করবেন! আমি বাজি ধরছি উবিসফ্ট কিছু মনে করবে না, তবে আপনার নিজের ইন্ডি গেমস বিকাশকারী পকেটের জন্য… হ্যাঁ!

তবে কল্পনা করুন যে গেমটি মাঝে মাঝে আপডেট হওয়া গেম সংজ্ঞাগুলি (যেমন একটি JSON ফাইলের আকারে) পরীক্ষা করে। আপনার গেমটি নতুন আপডেটের প্রয়োজন ছাড়াই যে কোনও সময় সর্বশেষ সংস্করণটি ডাউনলোড এবং ব্যবহার করতে পারে। পুনরায় শংসাপত্র বা প্রদত্ত অন্য কোনও অর্থের প্রয়োজন ছাড়াই আপনি যে কোনও সময় ভারসাম্যহীনতা / শোষণ / বাগ ঠিক করতে পারেন। কিছু ছোটখাটো ডিজাইনের সিদ্ধান্ত, আপনি এটি মূল্যবান বলে মনে করেননি, কেবল আপনাকে 5 অঙ্কের অর্থের পরিমাণ বাঁচিয়েছে! কি দুর্দান্ত? :)

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


6
ডিডিডির জন্য +1। এটি সম্পদ হিসাবে যেমন জিনিস জন্য খুব মানানসই।
ক্রোমস্টার বলেছেন মনিকা

@ ফ্যানিডচম্যান যদি কারও উত্তর আপনাকে সহায়তা করে তবে স্ট্যাক এক্সচেঞ্জের প্রথাগতভাবে তাদের বাম দিকে সংখ্যার উপরে তীরটি ক্লিক করে তাদের উত্তরকে উজ্জীবিত করতে হবে। যদি কোনও উত্তর আপনাকে সবচেয়ে বেশি সহায়তা করে, আপনার উত্তরটি স্বীকার করতে নীচের তীরের নীচে চেকমার্কটি ক্লিক করুন click উভয় পদক্ষেপ উত্তরদাতাকে খ্যাতি হিসাবে একটি বোনাস দেয় এবং ব্যবহারযোগ্য উত্তরগুলি সম্প্রদায়ের কাছে আরও দৃশ্যমান করে make
Nzall

2
আমি দেখতে পাচ্ছি না যে আপনাকে কীভাবে প্রথম উপায়ে কোডটি পুনরায় লিখতে হবে; আপনি যা করণীয় তা হল একটি ক্লাস যুক্ত করা (যদি আমি কিছু অনুপস্থিত না করি)।
স্যার পাইথন

4
এবং এখানে অবজেক্ট ওরিয়েন্টেড কোড এবং অবজেক্ট অবসেসড কোডের মধ্যে পার্থক্য। আপনি যেহেতু একটি অবজেক্ট ক্রমবিন্যাস তৈরি করতে পারবেন তার অর্থ এটি হওয়া উচিত নয় যে আপনার উচিত।
কর্সিকা

2
@ আগুস্টনলাদো যদি প্রতিবারের জন্য আমার কাছে একজন ডলার থাকে তবে কোনও ক্লায়েন্ট বলেছিলেন "এটি কখনই পরিবর্তিত হবে না" এবং এটি পরিবর্তিত হয়ে গেছে, আমি আমাদের দুজনকে রাতের খাবারের জন্য একটি রেস্তোঁরাতে নিয়ে যেতে পারতাম (যদিও আমাদের কিছুটা ডুবিয়ে রাখতে হবে, তাই সম্ভবত) কেবলমাত্র একটি মাঝারি রেস্তোঁরা ... যদিও
দু'বারের

29

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

যখন সংস্থানগুলিতে আলাদা গেম মেকানিক থাকে যা তাদের কাছে অনন্য, তখন ক্লাসগুলির সাথে তাদের প্রতিনিধিত্ব করা বুদ্ধিমান হতে পারে। উদাহরণস্বরূপ, যখন আপনি Plutonium যা একটি অর্ধ জীবনের সময় এবং খরগোশ যা অনুযায়ী সন্তান জন্ম হয়েছে Fibonacci ক্রম , তাহলে এটি জানার জন্য হতে পারে একটি বেস ক্লাসের আছে Resourceএকটি পদ্ধতি সঙ্গে Updateকোন সমিতি এবং দুই উদ্ভূত শ্রেণীর হিসাবে প্রয়োগ করা HalfLifeResourceএবং SelfGrowingResourceযা মান হ্রাস / বাড়ানোর জন্য সেই পদ্ধতিটি ওভাররাইড করুন (এবং আপনি উভয় একে অপরের পাশে রাখলে কী ঘটে তা পরিচালনা করতে যুক্তিও অন্তর্ভুক্ত থাকতে পারে)।

তবে যখন আপনার সংস্থানগুলি সত্যিই কেবল বোবা সংখ্যা, তখন সাধারণ ভেরিয়েবলের চেয়ে অভিনব কিছু দিয়ে এগুলি বাস্তবায়িত করার কোনও মানে হয় না।


আপনার উত্তরের জন্য @ ফিলিপকে ধন্যবাদ এই আমি ভাবছিলাম। কিন্তু সম্পদগুলি সম্পত্তি / পদ্ধতিগুলির ক্ষেত্রে সত্যই পরিবর্তিত হবে না, তাই আমি আপাতত বিকল্প 2 নিয়ে যাব
MDijkstra

14

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

interface IHasResources {
  int Gold { get; set; }
  int Wood { get; set; }
  int Cloth { get; set; }
  // ....
}

class Player : IHasResources { }
class City: IHasResources { }

তদ্ব্যতীত, এর উল্টোটি রয়েছে আপনি ঠিক একই কোড দিয়ে কোনও শহর লুট করতে পারেন ঠিক যেমন আপনি শত্রু বহর লুট করতে পারবেন, কোড পুনরায় ব্যবহারের প্রচার করবেন।
ডাউনসাইড, এই জাতীয় ইন্টারফেস বাস্তবায়ন করা ক্লান্তিকর প্রমাণ করতে পারে যদি অনেকগুলি শ্রেণি এটি প্রয়োগ করে, তাই আপনি ইন্টারফেস ব্যবহার করে শেষ করতে পারেন তবে মূল সমস্যার জন্য নয়, বিকল্পটি 1 বা 2 দিয়ে সমাধান করে:

interface IHasResources { 
   IEnumerable<Resource> Resources { get; }
}

উদাহরণ (এনাম সহ): কিছু ক্ষেত্রে, সংস্থার ধরণ নির্ধারণের সময় স্ট্রিংয়ের পরিবর্তে এনাম ব্যবহার করা বাঞ্ছনীয়:

enum Resource {
   Gold, Wood, Cloth, //...
}

class ResourceStorage {
   public Resource ResourceType { get; set; }
   public int Value { get; set; }
}

এই, "নিরাপত্তা" একটি বিট প্রদান করবে না কেননা আপনার আইডিই যখন ডট লেখার পর তা নির্ধারণের আপনি সকল বৈধ সম্পদের তালিকা দিতে হবে ResourceType = Resource., উপরন্তু আরো আপনি enums সঙ্গে "ঠাট" আছে পারে প্রয়োজন, স্পষ্ট টাইপ করুন অথবা রচনা / মত পতাকা যা আমি কারুকাজ করার সময় দরকারী হতে পারে তা কল্পনা করতে পারি:

[Flags]
enum Metal {
 Copper = 0x01/*01*/, Tin = 0x02/*10*/, Bronze = 0x03/*11*/
}
Metal alloy = Metal.Copper; //lets forget Value(s) for sake of simplicity
alloy |= Metal.Tin; //now add a bit of tin
Console.WriteLine(alloy); //will print "Bronze"


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


2
আপনার উত্তরটির জন্য ধন্যবাদ @ ওন্ড্রা আমি এনাম বিকল্পটি পছন্দ করি এবং আপনি কীভাবে তামা এবং টিনের সাহায্যে সেই ব্রোঞ্জটি তৈরি করেছিলেন; পি
এমডিজকস্ট্রা

2
আমি এই সম্প্রদায়টিতে বিশেষভাবে যোগদান করেছি যাতে আমি এনাম সমাধানটি আপ-ভোট করতে পারি। আপনি এনামের কিছু JSON উপস্থাপনা থেকে এনামের my-great-enumকিছু সি # উপস্থাপনা ( ) এর মানচিত্রের এনাম বর্ণনা বৈশিষ্ট্যটি ব্যবহার করতে পারেন MyGreatEnum
ড্যান ফোর্বস

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

2
@ এম হারজক্যাম্প এটি ক্ষেত্র নয়, এটি একটি সম্পত্তি - এবং জাভা বৈশিষ্ট্যগুলি সমর্থন করে না। প্রশ্নটি ট্যাগ করা হয় সি #, সি # ইন্টারফেসে বৈশিষ্ট্যগুলিকে অনুমতি দিন - বৈশিষ্ট্যগুলি সর্বোপরি হুডের নীচে পদ্ধতি। আমি আশঙ্কা করছি এটি পতাকা বিশিষ্টতার পক্ষে যায়, জাভাতে সমর্থিত নয় যদিও আমি পুরোপুরি নিশ্চিত নই।
আশ্চর্য

যে পরিষ্কার করার জন্য ধন্যবাদ! আমি সি # ট্যাগটি মিস করেছি এবং প্রশ্নের কোডটি দেখতে অত্যন্ত জাঁকজমকপূর্ণ দেখায় জাভা: ডি
এম হারজক্যাম্প

2

আপনার বিকল্প 1 ব্যবহার করা উচিত, এর 3 টি সুবিধা রয়েছে:

  1. রিসোর্স ইনস্ট্যান্ট করা সহজ - প্যারামিটার হিসাবে রিসোর্সের ধরণটি পাস করার পরিবর্তে আপনি কেবল যেমনটি করেন, উদাহরণস্বরূপ, new Gold(50)
  2. আপনার যদি কোনও উত্সকে বিশেষ আচরণ দেওয়ার দরকার হয় তবে আপনি এটির শ্রেণি পরিবর্তন করে করতে পারেন।
  3. কোনও উত্স কোনও নির্দিষ্ট ধরণের কিনা তা পরীক্ষা করা আরও সহজ - resource instanceof Gold

সমস্ত উত্তরগুলির পক্ষে মতামত রয়েছে, কোনটি ভাল তা চয়ন করা শক্ত। আমি প্রশ্নটিতে একটি সম্পাদনা করেছি, আপনি সেই কাঠামোটি সম্পর্কে কী ভাবেন?
MDijkstra

1

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

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

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