একটি সাধারণ অ্যাডভেঞ্চার গেমের আচরণ বাস্তবায়ন করা


11

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

একটি সংক্ষিপ্ত বিবরণ দিতে: গেমটি Roomবস্তুগুলিতে বিভক্ত হয়ে গেছে । প্রত্যেকের সেই ঘরে Roomথাকা Entityবস্তুর একটি তালিকা রয়েছে । প্রত্যেকের Entityএকটি ইভেন্টের স্টেট থাকে যা একটি সাধারণ স্ট্রিং-> বুলিয়ান মানচিত্র এবং একটি ক্রিয়া তালিকা যা স্ট্রিং-> ফাংশন মানচিত্র।

ব্যবহারকারীর ইনপুট ফর্ম গ্রহণ করে [action] [entity]Roomউপযুক্ত ফিরে যাওয়ার সত্তা নাম ব্যবহার করে Entityবস্তু, যা পরে কর্ম নাম ব্যবহার করে সঠিক ফাংশন এটি, এবং এটি সঞ্চালন করে।

ঘরের বিবরণ উত্পন্ন করতে প্রতিটি Roomবস্তু তার নিজস্ব বর্ণনার স্ট্রিং প্রদর্শন করে এবং তারপরে প্রত্যেকটির বর্ণনামূলক স্ট্রিং সংযোজন করে EntityEntityবর্ণনা তার রাষ্ট্র উপর ভিত্তি করে পরিবর্তন হতে পারে ( "দরজা খোলা হয়", "দরজা লক করা", ইত্যাদি "দরজা বন্ধ হয়")।

এখানে সমস্যাটি রয়েছে: এই পদ্ধতিটি ব্যবহার করে, আমার যে পরিমাণ বর্ণনা এবং ক্রিয়া কার্যকারিতা প্রয়োগ করতে হবে তা দ্রুত হাতছাড়া হয়ে যায়। আমার একা শুরু ঘরে 5 টি সত্তার মধ্যে প্রায় 20 টি ফাংশন রয়েছে।

আমি সমস্ত ক্রিয়া একটি একক ফাংশনে এবং যদি-অন্যথায় / সেগুলির মাধ্যমে স্যুইচ করতে পারি তবে এটি সত্তা হিসাবে এখনও দুটি ফাংশন। আমি Entityসাধারণ / জেনেরিক জিনিসের জন্য দরজা এবং কীগুলির জন্য নির্দিষ্ট সাব-ক্লাসও তৈরি করতে পারি , তবে এটি আমাকে এখনও পর্যন্ত পেয়ে যায়।

সম্পাদনা 1: অনুরোধ হিসাবে, এই কর্ম ফাংশনগুলির সিউডো-কোড উদাহরণগুলি।

string outsideDungeonBushesSearch(currentRoom, thisEntity, player)
    if thisEntity["is_searched"] then
        return "There was nothing more in the bushes."
    else
        thisEntity["is_searched"] := true
        currentRoom.setEntity("dungeonDoorKey")
        return "You found a key in the bushes."
    end if

string dungeonDoorKeyUse(currentRoom, thisEntity, player)
    if getEntity("outsideDungeonDoor")["is_locked"] then
        getEntity("outsideDungeonDoor")["is_locked"] := false
        return "You unlocked the door."
    else
        return "The door is already unlocked."
    end if

বর্ণনা ফাংশনগুলি একইভাবে একইভাবে কাজ করে, রাষ্ট্রটি পরীক্ষা করে এবং উপযুক্ত স্ট্রিংটি ফিরিয়ে দেয়।

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


1
আমি মনে করি আপনাকে এই "অ্যাকশন ফাংশনগুলি" কী করবে এবং সম্ভবত কিছু কোড পোস্ট করার দরকার আছে তা ব্যাখ্যা করার দরকার রয়েছে কারণ আপনি সেখানে কী বিষয়ে কথা বলছেন তা আমি নিশ্চিত নই।
31:51

কোড যুক্ত করা হয়েছে।
এরিক

উত্তর:


5

বিশেষ্য এবং ক্রিয়াগুলির প্রতিটি সংমিশ্রণের জন্য পৃথক ফাংশন করার পরিবর্তে, আপনার এমন একটি আর্কিটেকচার সেটআপ করা উচিত যেখানে একটি সাধারণ ইন্টারফেস থাকে যা গেমের সমস্ত বস্তু প্রয়োগ করে।

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

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

এদিকে, সর্বজনীন পদ্ধতিগুলির মধ্যে একটি হ'ল এনটিটি.অ্যাকটঅন (স্ট্রিং অ্যাকশন) এর মতো কিছু এবং তারপরে সেই পদ্ধতিতে পাশ করা ক্রিয়াকে সেই বস্তুর ক্রিয়াগুলির সারণির সাথে তুলনা করুন; যদি সেই ক্রিয়াটি টেবিলে থাকে তবে ফলাফলটি ফিরিয়ে দিন।

এখন প্রতিটি বস্তুর জন্য প্রয়োজনীয় সমস্ত পৃথক কার্যাদি বস্তুর মধ্যে অন্তর্ভুক্ত থাকবে, যাতে অন্য কক্ষগুলিতে সেই বস্তুর পুনরাবৃত্তি করা সহজ হয় (যেমন, দরজা রয়েছে এমন প্রতিটি ঘরে ডোর অবজেক্টটি ইনস্ট্যান্ট করুন)

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

<rooms>
  <room id="room1">
    <description>Outside the dungeon you see some bushes and a heavy door over the entrance.</description>
    <entities>
      <bush>
        <description>The bushes are thick and leafy.</description>
        <contains>
          <key />
        </contains>
      </bush>
      <door connection="room2" isLocked="true">
        <description>It's an oak door with stout iron clasps.</description>
      </door>
    </entities>
  </room>

  <room id="room2">
    etc.

যোগ করুন: আহা, আমি কেবল FxIII এর উত্তর পড়েছি এবং শেষের কাছে এই বিটটি আমার দিকে ঝাঁপিয়ে পড়েছিল:

(no things like <item triggerFlamesOnPicking="true"> that you will use just once)

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

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

<entity name="door">
  <description>It's an oak door with stout iron clasps.</description>
  <components>
    <lock isLocked="true" />
    <portal connection="room2" />
  </components>
</entity>

তবে ফায়ারবলের ফাঁদ সহ একটি দরজা থাকবে

<entity name="door">
  <description>There are strange runes etched into the wood.</description>
  <components>
    <lock isLocked="true" />
    <portal connection="room7" />
    <fireballTrap />
  </components>
</entity>

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

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

Door extends Entity {
  public Door() {
    addComponent(new LockComponent());
    addComponent(new PortalComponent());
  }
}

TrappedDoor extends Entity {
  public TrappedDoor() {
    addComponent(new LockComponent());
    addComponent(new PortalComponent());
    addComponent(new FireballTrap());
  }
}

1
এটি সাধারণ, পুনরাবৃত্তিযোগ্য আইটেমগুলির জন্য কাজ করে। কিন্তু ব্যবহারকারী ইনপুটটিতে স্বতন্ত্রভাবে প্রতিক্রিয়া জানায় এমন সংস্থাগুলি সম্পর্কে কী? Entityকেবলমাত্র একটি একক অবজেক্টের জন্য একটি সাবক্লাস তৈরি করে কোড একসাথে গোষ্ঠীভুক্ত হয় তবে আমার যে কোডটি লিখতে হবে তার পরিমাণ হ্রাস করে না। নাকি এ ব্যাপারে কোনও অনিবার্য সমস্যা?
এরিক

1
আপনার দেওয়া উদাহরণগুলিকে আমি সম্বোধন করেছি। আমি তোমার মন পড়তে পারি না; আপনি কি জিনিস এবং ইনপুট পেতে চান?
31:22

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

হ্যাঁ, এই ধারণা।
31:12

আমার অনুমান করা উচিত ছিল যে উপাদানগুলি সমাধানের অংশ হত। সাহায্যের জন্য ধন্যবাদ.
এরিক

1

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

একটি "ধারক" (ঝাঁকুনির উত্তরের গুল্ম) একটি কাকতালীয় উপায় তবে আপনি দেখতে পাচ্ছেন যে এটি যথেষ্ট নমনীয় নয় ।

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

আমার পরামর্শটি কোড আচরণের জন্য একটি ব্যাখ্যাযুক্ত ভাষা ব্যবহার করা।

গুল্ম উদাহরণ সম্পর্কে চিন্তা করুন: এটি একটি ধারক তবে আমাদের গুল্মের মধ্যে নির্দিষ্ট আইটেম থাকা দরকার; ধারক বস্তুতে থাকতে পারে:

  • গল্পকারের আইটেম যুক্ত করার একটি পদ্ধতি,
  • ইঞ্জিনটি এতে থাকা আইটেমটি দেখানোর জন্য একটি পদ্ধতি,
  • খেলোয়াড়ের জন্য একটি আইটেম বাছাইয়ের একটি পদ্ধতি।

থাইসের আইটেমগুলির মধ্যে একটিতে একটি দড়ি রয়েছে যা একটি বৈপরীত্যকে ট্রিগার করে যা ফলস্বরূপ ঝোপ জ্বলন্ত আগুনে জ্বলিয়ে দেয় ... (আপনি দেখুন, আমি আপনার মন পড়তে পারি তাই আপনার পছন্দসই জিনিসগুলি আমি জানি)।

আপনি প্রতিটি বার কোনও ধারক থেকে কোনও আইটেম তুলবেন এমন সময় আপনার মূল প্রোগ্রাম থেকে চালানো কোনও হুকের মধ্যে প্রাসঙ্গিক অতিরিক্ত কোড যুক্ত কনফিগার ফাইলের পরিবর্তে এই গুল্মটি বর্ণনা করতে আপনি কোনও স্ক্রিপ্ট ব্যবহার করতে পারেন ।

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

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

স্ক্রিপ্টিং কৌশলগুলি ব্যবহার করে আপনাকে আপনার কনফিগারেশনটিকে সহজ রাখতে দেয় ( <item triggerFlamesOnPicking="true">আপনি কেবল একবার ব্যবহার করবেন এমন কোনও জিনিস নয়) আপনাকে কিছু অদ্ভুত বিভিউয়ারগুলি প্রকাশ করার অনুমতি দেয় (মজাদাররা) কোডের কিছু লাইন যুক্ত করে

কয়েকটি কথায়: কনফিগার ফাইল হিসাবে স্ক্রিপ্ট যা কোড চালাতে পারে।

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