আমি জাভাস্ক্রিপ্টে শাখা প্রশাখার কথোপকথন কীভাবে প্রয়োগ করব?


11

আমি জাভাস্ক্রিপ্টে খুব বেসিক ভিজ্যুয়াল নভেল ধরণের গেমটি তৈরি করছি । আমি একজন শিক্ষানবিস, সুতরাং আমি মজা এবং শেখার জন্য এটি করছি এবং খারাপ পরিকল্পনার কারণে যখন আপনি কথোপকথনে কোনও শাখায় পৌঁছবেন তখন আমি কিছুটা সমস্যার মধ্যে পড়েছি।

বর্তমানে আমি গেমটির স্ক্রিপ্টটি স্ট্রিং ভেরিয়েবলে রেখেছি এবং আমি প্রতিটি দৃশ্যের সাথে একটি ট্যাগ যেমন "# ~" ছোট ছোট অ্যারেতে বিভক্ত করি যাতে গেমের স্ক্রিপ্টটি দেখতে এই রকম হয়:

var script = "Hello World!#~How are you today?"
var gameText = script.split("#~");
//gameText[0]= Hello World!

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

আমি কীভাবে এটি সহজ উপায়ে করতে পারি? আমি গেমটি ওয়েব রান টাইমের সাথে কাজ করতে চাই বলে ভ্যানিলা জাভাস্ক্রিপ্টের সাথে লেগে থাকার চেষ্টা করছি।


এই ভিডিওটি আপনাকে কিছু ধারণা দিতে পারে: youtube.com/watch?v=XM2t5H7kY6Y
JCM

আমাকে সম্প্রতি নোড ব্যবহার করে এর জন্য কিছু বিকাশ করতে হয়েছিল এবং খুব বেসিক পাঠ্য ফাইলের কাঠামোর জন্য বেছে নিয়েছি। আপনি ফলাফল কোড এবং পাঠ্য বিন্যাসটি এখানে দেখতে পাবেন: github.com/scottbw/dialoguejs কোডটি জিপিএল, এটি ব্যবহার করতে নির্দ্বিধায়। আমি নিশ্চিত যে নন-নোড জেএস গেমের সাথে খাপ খাইয়ে নেওয়া কঠিন হবে না - "fs.load ()" অংশটি এজাক্সের সাথে প্রতিস্থাপন করুন।
স্কট উইলসন

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

উত্তর:


8

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

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

var story = [
  { m: "Hi!" },
  { m: "This is my new game." },
  { question: "Do you like it?", answers: [
    { m: "yes", next: "like_yes" },
    { m: "no", next: "like_no" },
  ] },
  { label: "like_yes", m: "I am happy you like my game!", next: "like_end" },
  { label: "like_no", m: "You made me sad!", next: "like_end" },
  { label: "like_end" },
  { m: "OK, let's change the topic" }
];

এই নকশার জন্য কিছু ব্যাখ্যা:

পুরো কাহিনীটি একটি অ্যারেতে রচিত। আপনাকে সংখ্যা সরবরাহ করতে হবে না, সেগুলি অ্যারে সিনট্যাক্স দ্বারা স্বয়ংক্রিয়ভাবে সরবরাহ করা হয়: প্রথম আইটেমের সূচক 0 থাকে, পরেরটির সূচক 1 থাকে ইত্যাদি etc.

বেশিরভাগ ক্ষেত্রে নিম্নলিখিত পদক্ষেপের সংখ্যা লিখতে হবে না। আমি ধরে নিই যে বেশিরভাগ পাঠ্যের লাইনগুলি শাখা নয় । আসুন "পরবর্তী পদক্ষেপটি হ'ল নিম্নলিখিত আইটেমটি" একটি পূর্বনির্ধারিত অনুমান করা যাক, এবং অন্যথায় হলে কেবল নোটগুলি তৈরি করুন।

জাম্পের জন্য, সংখ্যা নয়, লেবেল ব্যবহার করুন । তারপরে, আপনি যদি পরে কয়েকটি লাইন যুক্ত করেন বা সরিয়ে থাকেন তবে গল্পটির যুক্তি সংরক্ষণ করা হবে এবং আপনাকে সংখ্যাগুলি সামঞ্জস্য করতে হবে না।

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

গেমটির জন্য অ্যালগরিদম এমন কিছু হওয়া উচিত:

function execute_game() {
  var current_line = 0;
  while (current_line < story.length) {
    var current_step = story[current_line];
    if (undefined !== current_step.m) {

      display_message(current_step.m);
      if (undefined !== current_step.next) {
        current_line = find_label(current_step.next);
      } else {
        current_line = current_line + 1;
      }

    } else if (undefined !== current_step.question) {

      // display the question: current_step.question
      // display the answers: current_step.answers
      // choose an answer
      // and change current_line accordingly

    }
  }
}

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


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

1
আমি আপনার সমাধানটি বাস্তবায়নের চেষ্টা করেছি এবং এটি মোটামুটিভাবে ভালভাবে কাজ করে, যদিও আমি মনে করি যে কোনও কোনও স্থানে ({ label: "like_yes"; m: "I am happy you like my game!"; next: "like_end" },)',' একটি নয় ';' হওয়া উচিত। এছাড়াও কোঁকড়ানো ধনুর্বন্ধনী মধ্যে জিনিস বলা হয় কি? অ্যারের মধ্যে কি এটি একটি বস্তু? যদি আমি কীভাবে এটি ব্যবহার করতে পারি তবে আমি কী অনুসন্ধান করব?
সাইলেন্ট কার্টোগ্রাফার 21

হ্যাঁ, {...}একটি বস্তু। জাভাস্ক্রিপ্টে, অবজেক্ট হ'ল পি-পি-পি-তে অ্যারে বা জাভাতে ম্যাপের অনুরূপ, একটি মূল-মান সমন্বয়মূলক অ্যারে (কিছু অতিরিক্ত কার্যকারিতা সহ, এই উদাহরণে ব্যবহৃত হয় না) is আরও তথ্যের জন্য, জাভাস্ক্রিপ্ট এবং ইসিএমএসক্রিপ্টে উইকিপিডিয়া নিবন্ধগুলি এবং সেখান থেকে লিঙ্কযুক্ত ডকুমেন্টেশনগুলি দেখুন, বিশেষত সরকারী ইসমাস্ক্রিপ্ট ডকুমেন্টেশন।
উইলিয়াম বার

1
বিটিডাব্লু নোট করুন যে তিনি এখানে যে ডেটা স্ট্রাকচারের পরামর্শ দেন তা মূলত জেএসএন। ব্যক্তিগতভাবে আমি JSON- এ পুরোপুরি যাওয়ার পরামর্শ দিয়েছি (বেশিরভাগ কোঁকড়ানো বন্ধনী এবং একটি "গাছ": পুরো জিনিসটির চারপাশে; যেমন tree "ট্রি": [ইত্যাদি]}) এবং তারপরে আপনি আপনার কথোপকথন গাছগুলি বাহ্যিক ফাইলগুলিতে সঞ্চয় করতে পারেন। আপনার গেমের বোঝা বহির্মুখী ফাইলগুলিতে আপনার ডেটা স্থাপন করা অনেক বেশি নমনীয় এবং মডুলার (সুতরাং কেন সেই পদ্ধতিটি সর্বোত্তম অনুশীলন।
15:30 এ জোকিং করা

5

আমি আপনাকে সংলাপ ইভেন্টগুলির একটি অ্যারে তৈরি করার জন্য সুপারিশ করব। প্রতিটি ইভেন্ট হ'ল এনপিসি বলছে এমন একটি পাঠ্য এবং সম্ভাব্য প্লেয়ার প্রতিক্রিয়াগুলির একটি অ্যারে, যা পরিবর্তিত প্রতিক্রিয়াযুক্ত পাঠ্য এবং এই প্রতিক্রিয়াটি অনুসরণ করে এমন ইভেন্টের সূচকযুক্ত বস্তু।

var event = []; // create empty array

// create event objects and store them in the array
event[0] = { text: "Hello, how are you?",
             options: [    { response: "Bad", next: 1 },
                           { response: "Good", next: 2 }
                      ]
           };
event[1] = { text: "Why, what's wrong?",
             options: [    { response: "My dog ran away", next: 3},
                           { response: "I broke up with my girlfriend", next: 4}
                      ]
           };
event[2] = { text: "That's nice",

...

2

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

আপনি যদি চান তবে # 1gam এর জন্য কয়েক ঘন্টার মধ্যে আমি তৈরি কিছু প্রোটোটাইপটি দেখতে পারি । উত্সটি জিপিএলভি 3 এর অধীনে ব্যবহারের জন্য নিখরচায় রয়েছে (আপনি যদি জিপিএলকে আঁকড়ে না রাখেন তবে আমি পুরোপুরি ঠিক আছি, যদি আপনি কেবল এটি অনুপ্রেরণার জন্য ব্যবহার করেন But তবে আপনার খেলা শেষ হয়ে গেলে আমাকে জানান)) সন্ত্রস্ত লেখা বা এর মতো কিছু আশা করবেন না। ;)

সিএসএস অ্যানিমেশন জিনিস এবং এর মতো জিনিসগুলি উপেক্ষা করে কোড কীভাবে কাজ করে সে সম্পর্কে একটি সংক্ষিপ্ত ব্যাখ্যা দেওয়ার জন্য:

  • var data মূলত সমস্ত সম্ভাব্য পছন্দগুলি ইত্যাদির সাথে পুরো গল্পটি থাকে contains
  • প্রতিটি "অবস্থান" (বা পৃষ্ঠা / প্রবেশ) আইডি দ্বারা চিহ্নিত করা হয় is তালিকার প্রথম আইডি হ'ল start, দ্বিতীয় cwaitইত্যাদি etc.
  • প্রতিটি লোকেশনে দুটি বাধ্যতামূলক উপাদান থাকে: একটি ক্যাপশন পাশাপাশি আসল পাঠ্য। সিদ্ধান্তের জন্য লিঙ্কগুলি ফর্মটি গ্রহণ করে কিছু সাধারণ মার্কআপে লেখা হয় [target location:display text]
  • পুরো "যাদু" ভিতরে ঘটছে navigate(): এই ফাংশনটি মার্কআপ লিঙ্কগুলিকে ক্লিকযোগ্য করে তুলেছে। এটি কিছুটা দীর্ঘতর, কারণ আমি সেখানে মৃত সমাপ্তদের জন্য কিছু স্থির পাঠ্যও পরিচালনা করছি। গুরুত্বপূর্ণ অংশটি প্রথম দুটি কল replace()
  • Theচ্ছিক শেষ এন্ট্রিগুলি গেমের সামগ্রিক মেজাজকে সমর্থন করে মিশ্রিত করতে নতুন পটভূমির রঙগুলি সংজ্ঞায়িত করে।
  • এই রঙগুলি সংজ্ঞায়িত করার পরিবর্তে আপনি পাশাপাশি অন্য অবস্থানগুলিতে নির্দেশ করে লিঙ্কগুলি যুক্ত করতে পারেন (নোট করুন এটি আমার কোড দ্বারা পরিচালিত হয় না ; এটি প্রদর্শন করার জন্য এটি কেবল কিছু ধারণা):

    'start': ['Waking up', 'You wake...', 'cwait:yell for help', 'cwait: wait a bit', 'clook: look around']

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