কার্যকরী ভাষাগুলিতে দ্বি-মাত্রিক বোর্ড গেমের জন্য ডেটা স্ট্রাকচার


9

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

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

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

বেশিরভাগ কার্যকরী ভাষাগুলি লিংকযুক্ত তালিকাগুলি এবং টুপলগুলি বহু-উপাদান ডেটা স্ট্রাকচারের বেসিক বিল্ডিং ব্লক হিসাবে ব্যবহার করে। তবে এগুলি কাজের জন্য খুব খারাপভাবে তৈরি বলে মনে হচ্ছে:

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

এলিক্সির একটি অন্তর্নির্মিত মানচিত্রের ডেটা কাঠামো রয়েছে (এবং হাস্কেলের রয়েছে Data.Map) যা ও (লগ এন) (লগারিদমিক) উপাদানগুলিতে অ্যাক্সেসের অনুমতি দেয়। এখনই আমি x, yটিপলস সহ একটি মানচিত্র ব্যবহার করি যা কী হিসাবে অবস্থানটি উপস্থাপন করে।

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


1
আমি অনুশীলনের সম্পর্কে কথা বলতে পারেন না, কিন্তু দুটি জিনিস Haskell, আমার মনে আসে: জিপার্সের , ডাটা স্ট্রাকচার, এবং comonads, যা কিছু তত্ত্ব যা আমি তন্ন তন্ন স্মরণ কিংবা সঠিকভাবে বুঝতে দ্বারা জিপার্সের সাথে সম্পর্কিত হয় ওভার ধ্রুবক-টাইম "পদক্ষেপ" যার ফলে; )
ফিপসাগেবলার

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

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

1
দাবাতে আপনার 8x8 বোর্ড রয়েছে। সি এর মতো মেমরি-ম্যাপ করা ভাষায়, আপনি কোনও ঘরের সঠিক ঠিকানা পেতে গাণিতিক গণনা করতে পারেন, তবে মেমরি-পরিচালিত ভাষাগুলিতে এটি সত্য নয় (যেখানে অর্ডিনাল সম্বোধন একটি বাস্তবায়ন বিশদ)। 14 টি নোড জুড়ে ঝাঁপিয়ে পড়া যদি কোনও স্মৃতি-পরিচালিত ভাষায় অ্যারে উপাদানকে সম্বোধন করার জন্য প্রায় একই পরিমাণ সময় নেয় তবে আমার অবাক হওয়ার কিছু নেই।
রবার্ট হার্ভে

এছাড়াও দেখুন স্ট্যাকওভারফ্লো.com
coredump

উত্তর:


6

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

filterWithKey (\k _ -> (snd k) == column) -- All pieces in given column
filterWithKey (\k _ -> (fst k) == row)    -- All pieces in given row
mapKeys (\(x, y) -> (-x, y))              -- Mirror

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

এর অর্থ আপনি Mapশীর্ষ স্তরে একটি ব্যবহার করতে পারেন , তারপরে সারি বিশ্লেষণে Listsবা স্যুইচ করুন Arrays, তারপরে Arraysকলাম বিশ্লেষণের জন্য অন্যভাবে সূচিকৃত করুন, প্যাটার্ন বিশ্লেষণের জন্য বিটমাস্ক, তারপরে Stringsপ্রদর্শনের জন্য। সু-নকশাকৃত কার্যকরী প্রোগ্রামগুলি প্রায় কোনও একক ডেটা কাঠামোকে পাস করে না। এগুলি এমন একধাপের পদক্ষেপ যা একটি ডেটা কাঠামো গ্রহণ করে এবং পরবর্তী পদক্ষেপের জন্য উপযুক্ত এমন একটি নতুন নির্গত করে।

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


4

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

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

let pos r f = {Rank = r; File = f} // immutable record type
// or
let pos r f = OnBoard (r, f) // algebraic type
...
let testBoard =
    Board.createEmpty ()
    |> Board.setPiece p (pos 1 2)
    |> ...

এই কোডটিতে (বা কোনও কলিং কোড), বোর্ড কীভাবে উপস্থাপন করা হয়েছিল তা বিবেচ্য নয়। বোর্ডটি এর অন্তর্নিহিত কাঠামোর চেয়ে বেশি তার উপর অপারেশন দ্বারা প্রতিনিধিত্ব করে।


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

না, এটি কোথাও প্রকাশিত হয়নি।
ক্যাসি স্পিকম্যান

সুতরাং আপনি কি আমার বর্তমান বাস্তবায়নটি একবার দেখে বিবেচনা করবেন এবং আমি কীভাবে এটির উন্নতি করতে পারব পরামর্শ দেব?
অসিবিহী

ধরণের ধরণের দিকে তাকিয়ে আমি পজিশনের ধরণ না পাওয়া পর্যন্ত আমি খুব অনুরূপ বাস্তবায়নে স্থির হয়েছি। আমি পরে কোড পর্যালোচনা সম্পর্কে আরও বিশদ বিশ্লেষণ করব।
ক্যাসি স্পিকম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.