আমার আর্কিটেকচারের (এক রিয়েলটাইম স্ট্র্যাটেজি গেমের এনপিসি) একাধিক উত্তরাধিকারের বিকল্প?


11

কোডিং আসলে তেমন শক্ত নয় । হার্ড অংশটি কোডটি বোঝা যা বোঝায়, পঠনযোগ্য এবং বোধগম্য। সুতরাং আমি আরও উন্নত বিকাশকারী এবং কিছু শক্ত আর্কিটেকচার তৈরি করতে চাই।

তাই আমি একটি ভিডিও-গেমে এনপিসিগুলির জন্য একটি আর্কিটেকচার তৈরি করতে চাই । এটি স্টারক্রাফ্ট, এম্পায়ার্সের বয়স, কমান্ড ও কনকয়েরস ইত্যাদি ইত্যাদির মতো একটি রিয়েলটাইম কৌশল কৌশল game তাই আমার কাছে বিভিন্ন ধরণের এনপিসি থাকবে। একজন এনপিসি অনেক ক্ষমতা এগুলোর (পদ্ধতি) এর এক হতে পারে: Build(), Farm()এবং Attack()

উদাহরণ:
ওয়ার্কার করতে পারেন Build()এবং Farm()
ওয়ারিয়র পারেন Attack()
সিটিজেন করতে পারেন Build(), Farm()এবং Attack()
জালিয়া করতে পারেন Farm()এবংAttack()

আমি আশা করি এতদূর সবকিছু পরিষ্কার হয়ে গেছে।

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

ঠিক আছে আমি একটি বেস ক্লাস করতে পারে। আসলে আমি মনে করি এটি DRY নীতিটি ধরে রাখার একটি ভাল উপায় । সুতরাং WalkTo(x,y)আমার বেস ক্লাসের মতো পদ্ধতিগুলি থাকতে পারে যেহেতু প্রতিটি এনপিসি স্থানান্তর করতে সক্ষম হবে। তবে এখন আসুন আসুন সমস্যার দিকে। আমি কোথায় আমার ক্ষমতা প্রয়োগ করব? (মনে রাখবেন: Build(), Farm()এবং Attack())

যেহেতু ক্ষমতাগুলি একই যুক্তি নিয়ে গঠিত হবে প্রতিটি এনপিসি (কর্মী, যোদ্ধা, ..) এর জন্য সেগুলি বাস্তবায়িত করা বিরক্তিকর / ডিআরওয়াই নীতিমালা হবে।

ঠিক আছে আমি বেস ক্লাসের মধ্যে ক্ষমতা প্রয়োগ করতে পারে । এই লজিক কিছু করতে হবে যাচাই একটি এনপিসি ক্ষমতা এক্স ব্যবহার করতে পারেন IsBuilder, CanBuild, .. আমি মনে করি এটা স্পষ্ট কি আমি প্রকাশ করতে চান।
তবে আমি এই ধারণাটি দিয়ে খুব ভাল অনুভব করি না। এটি খুব কার্যকারিতা সহ একটি ফুলে যাওয়া বেস শ্রেণীর মতো শোনাচ্ছে ।

আমি প্রোগ্রামিং ভাষা হিসাবে সি # ব্যবহার করি না। সুতরাং একাধিক উত্তরাধিকার এখানে বিকল্প নয়। মানে: অতিরিক্ত বেস ক্লাস থাকা যেমন Fisherman : Farmer, Attackerকাজ করে না।


3
আমি এই উদাহরণটি দেখছিলাম
শান ম্লেয়ান

4
এই প্রশ্নটি gamedev.stackexchange.com
ফিলিপ

উত্তর:


14

রচনা এবং ইন্টারফেস উত্তরাধিকার হ'ল ধ্রুপদী একাধিক উত্তরাধিকারের স্বাভাবিক বিকল্প।

আপনি উপরে বর্ণিত সমস্ত কিছু যা "ক্যান" শব্দের সাথে শুরু হয় এটি একটি সক্ষমতা যা ইন্টারফেসের সাথে প্রতিনিধিত্ব করা যায়, যেমন ICanBuildবা হিসাবে ICanFarm। আপনার মনে হয় আপনার প্রয়োজনীয় যতগুলি ইন্টারফেস রয়েছে ততটুকু আপনি উত্তরাধিকারী হতে পারেন।

public class Worker: ICanBuild, ICanFarm
{
    #region ICanBuild Implementation
    // Build
    #endregion

    #region ICanFarm Implementation
    // Farm
    #endregion
}

আপনি আপনার শ্রেণীর নির্মাতার মাধ্যমে "জেনেরিক" বিল্ডিং এবং কৃষিকাজের বিষয়গুলিতে পাস করতে পারেন। সেখানেই রচনা আসে।


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

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

1
কর্মী এখনও একজন নির্মাতা, কারণ আপনি উত্তরাধিকার সূত্রে পেয়েছিলেন ICanBuild। আপনার কাছে বিল্ডিংয়ের জন্য সরঞ্জামগুলিও হ'ল বস্তুক্রমক্রমের ক্ষেত্রে গৌণ বিষয়।
রবার্ট হার্ভে

বোধ হয়। আমি এই প্রিনপাইলকে একবার চেষ্টা করে দেখব। আপনার বন্ধুত্বপূর্ণ এবং বর্ণনামূলক উত্তরের জন্য ধন্যবাদ। আমি আসলেই সেটি প্রশংসা করি. যদিও এই প্রশ্নটি আমি কিছু সময়ের জন্য উন্মুক্ত করবো :)
ব্রেটেটে

4
@ ব্র্যাটিটেটি বিল্ড, ফার্ম, অ্যাটাক, হান্ট ইত্যাদি বাস্তবায়নকে দক্ষতা হিসাবে বিবেচনা করতে সহায়তা করতে পারে যা আপনার চরিত্রগুলির রয়েছে। বিল্ডসকিল, ফার্মস্কিল, অ্যাটাকস্কিল ইত্যাদি Then
এরিক কিং

4

যেহেতু অন্যান্য পোস্টারগুলি উল্লেখ করেছে যে কোনও উপাদান আর্কিটেকচারই এই সমস্যার সমাধান হতে পারে।

class component // Some generic base component structure
{
  void update() {} // With an empty update function
} 

এক্ষেত্রে এনপিসির যে কার্যকারিতা থাকতে হবে তা বাস্তবায়নের জন্য আপডেট ফাংশন বাড়ান।

class build : component
{
  override void update()
  { 
    // Check if the right object is selected, resources, etc
  }
}

একটি উপাদান ধারক আইট্রেটিং এবং প্রতিটি উপাদান আপডেট করা প্রতিটি উপাদানগুলির নির্দিষ্ট কার্যকারিতা প্রয়োগ করার অনুমতি দেয়।

class npc
{
  void update()
  {
    foreach(component c in components)
      c.update();
  }

  list<component> components;
}

যেহেতু প্রতিটি ধরণের অবজেক্টটি চাওয়া হয় আপনি নিজের পছন্দমতো স্বতন্ত্র প্রকারের জন্য কারখানার প্যাটার্নের কিছু ফর্ম ব্যবহার করতে পারেন।

npc worker;
worker.add_component<build>();
worker.add_component<walk>();
worker.add_component<attack>();

উপাদানগুলি আরও জটিল হয়ে উঠায় আমি সবসময় সমস্যার মধ্যে পড়েছি। উপাদান জটিলতা কম রাখার (একটি দায়িত্ব) সমস্যাটি দূর করতে সহায়তা করতে পারে।


3

আপনি যদি ইন্টারফেসগুলি এর মতো সংজ্ঞায়িত করেন ICanBuildতবে আপনার গেম সিস্টেমটিকে প্রতিটি এনপিসি টাইপ অনুসারে পরিদর্শন করতে হবে, যা সাধারণত ওওপিতে প্রত্যাখ্যান করা হয়। উদাহরণস্বরূপ: if (npc is ICanBuild)

আপনি এর সাথে আরও ভাল থাকবেন:

interface INPC
{
    bool CanBuild { get; }
    void Build(...);
    bool CanFarm { get; }
    void Farm(...);
    ... etc.
}

তারপর:

class Worker : INPC
{
    private readonly IBuildStrategy buildStrategy;
    public Worker(IBuildStrategy buildStrategy)
    {
        this.buildStrategy = buildStrategy;
    }

    public bool CanBuild { get { return true; } }
    public void Build(...)
    {
        this.buildStrategy.Build(...);
    }
}

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

var workerType = NPC.Builder
    .Builds(new WorkerBuildBehavior())
    .Farms(new WorkerFarmBehavior())
    .Build();

var workerFactory = new NPCFactory(workerType);

var worker = workerFactory.Build();

এনপিসি নির্মাতা এমন একটি বাস্তবায়ন DefaultWalkBehaviorকরতে পারে যা কোনও এনপিসির ক্ষেত্রে ওভাররাইড করা যেতে পারে যা উড়ে যায় তবে চলতে পারে না ইত্যাদি ইত্যাদি etc.


ঠিক আছে, কেবল আবার জোরে চিন্তা করা: আসলে if(npc is ICanBuild)এবং এর মধ্যে খুব বেশি পার্থক্য নেই if(npc.CanBuild)। এমনকি আমি যখন npc.CanBuildআমার বর্তমান মনোভাব থেকে পথটি পছন্দ করব prefer
ব্রেটেটে

3
@ ব্র্যাটিটেট - আপনি এই প্রশ্নে দেখতে পারেন যে কিছু প্রোগ্রামার প্রকৃতপক্ষে প্রকারটি পরীক্ষা করতে পছন্দ করেন না কেন।
স্কট হুইটলক

0

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

হার্ড কোডিংয়ের পরিবর্তে কনফিগার ফাইল বা একটি ডাটাবেসে সমস্ত ইউনিটের প্রকারগুলি সংজ্ঞায়িত করুন।

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

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