কার্যকরী প্রোগ্রামিং এবং পাঠ্য অ্যাডভেঞ্চার


14

এটি বেশিরভাগই এফপি সম্পর্কে একটি তাত্ত্বিক প্রশ্ন, তবে আমি আমার বক্তব্য চিত্রিত করার জন্য পাঠ্য অ্যাডভেঞ্চারগুলি (পুরাতন-স্কুল জোরকের মতো) নেব। আপনি কীভাবে এফপির সাথে রাষ্ট্রীয় সিমুলেশন মডেল করবেন সে সম্পর্কে আমি আপনার মতামত জানতে চাই।

পাঠ্য অ্যাডভেঞ্চারগুলি সত্যই OOP এর জন্য কল করে। উদাহরণস্বরূপ, সমস্ত "কক্ষগুলি" একটি Roomশ্রেণীর উদাহরণ , আপনার কাছে বুনিয়াদি Itemক্লাস থাকতে পারে এবং ইন্টারফেসগুলি Item<Pickable>আপনি বহন করতে পারেন এমন জিনিসগুলির জন্য পছন্দ করতে পারেন ইত্যাদি।

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

আমি মনে করি যে একটি বিশুদ্ধ পদ্ধতির মূলত এই বড় অবজেক্টটিকে যে কোনও ফাংশনে স্থান দেওয়া এবং এটি তাদের দ্বারা ফিরিয়ে দেওয়া (সম্ভবত সংশোধিত) করা হবে। উদাহরণস্বরূপ, আমার একটি moveToRoomফাংশন রয়েছে যা নতুন ঘরে পরিবর্তিত হয়ে Worldএগুলি পায় এবং ফেরত দেয় ।World.player.locationWorld.rooms[new_room].visited = True

এমনকি এটি যদি আরও "সঠিক" উপায় হয় তবে মনে হয় এটি এর জন্য খাঁটিতা প্রয়োগ করছে। প্রোগ্রামিং ল্যাঙ্গুয়েজের উপর নির্ভর করে এই সম্ভাব্য খুব বড় Worldঅবজেক্টটি পিছনে পিছনে যেতে ব্যয়বহুল হতে পারে। এছাড়াও, প্রতিটি ফাংশনটিতে যে কোনও Worldঅবজেক্টে অ্যাক্সেস থাকা দরকার । উদাহরণস্বরূপ, কোনও রুম অ্যাক্সেসযোগ্য হতে পারে বা অন্য ঘরে ট্রিগার হওয়া লিভারের উপর নির্ভর করে না কারণ এটি প্লাবিত হতে পারে তবে প্লেয়ার যদি লাইফ জ্যাকেট বহন করে তবে এটি যেভাবেই প্রবেশ করতে পারে। কোনও দানব আক্রমণাত্মক হতে পারে বা খেলোয়াড় তার চাচাত ভাইকে অন্য ঘরে হত্যা করেছে কিনা তার উপর নির্ভর করে। এর অর্থ এই যে roomCanBeEnteredফাংশন অ্যাক্সেস করা প্রয়োজন World.player.invetoryএবং World.rooms, describeMonsterঅ্যাক্সেস করা প্রয়োজন World.monstersএবং তাই (মূলত, আপনি অবশ্যইপুরো লোড চারপাশে পাস)। এটি সত্যিই আমার কাছে একটি বিশ্বব্যাপী পরিবর্তনশীল জন্য কল করার জন্য বলে মনে হচ্ছে, এমনকি এটি বিশেষত এফপিতে ভাল প্রোগ্রামিং শৈলী।

আপনি কীভাবে এই সমস্যার সমাধান করবেন?


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

2
আমি মনে করি ক্রিস মার্টেনের গবেষণা আকর্ষণীয় হবে, এটি উদ্দেশ্যমূলক ভাষাগুলিতে ইন্টারেক্টিভ ফিকশন কীভাবে তৈরি করা যায় তা দেখানো। github.com/chrisamaphone/interactive-lp
ড্যানিয়েল

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

3
আমার ভাবতে হবে যে এই প্রশ্নটি @ এরিকলিপার্টের ওকামালে একটি জেড মেশিন বাস্তবায়নের (অংশগুলির) ধারাবাহিক নিবন্ধ লেখার পরবর্তী সিদ্ধান্তকে প্রভাবিত করেছে কিনা ...?
জুলে

1
@ জুলস সেই সিরিজটি শুরুর একটি লিঙ্ক, যারা আগ্রহী তাদের জন্য: ericlippert.com/2016/02/01/est-of-house
কেচালাক্স

উত্তর:


4

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

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

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

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

আমি দেখেছি এমন একটি ভিন্ন বিকল্প হ'ল কেবলমাত্র আপনার পৃথক ফাংশন থেকে বিশ্বের কিছু অংশ পরিবর্তন করার নির্দেশাবলী ফিরে আসবে এবং তারপরে আপনার বিশ্ব আপডেট করে। এটি বর্ণিত ব্লগ পোস্টগুলির একটি সিরিজ http : //prog21 . دادgum.com/23.html এ উপলব্ধ ।

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


0

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

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


আমি বুঝতে পেরেছি যে এই পদ্ধতিটি স্থানীয় ইভেন্টগুলিকে প্যাথফাইন্ডিং বা ট্রিগার করার জন্য খুব বেশি কিছু করে না (যেমন কাছাকাছি ভিড়কারীদের উপর কৃষি), তবে আমি অতীতে ডেটাবেসগুলির অপব্যবহারের জন্য পরিচিত ছিলাম ... আমি সম্ভবত একটি কল পাঠিয়েছি update mobs set agro=1 where distance<5এবং হতে পারি এটি দিয়ে সম্পন্ন। সম্ভবত এটি সর্বোত্তম অনুশীলন নয়, তবে এটি আমার উদ্দেশ্য অনুসারে। ডাটাবেসের মাধ্যমে পাথ
ফাইন্ডিংয়ের ক্ষেত্রে

0

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

BAD:
   f :: (World, Int) -> World

Good:
   f :: (Int,Int,Int,Int) -> World

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

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