2048 গেম (JAVA কোড) PlatoBlockchain ডেটা ইন্টেলিজেন্স সমাধান করতে কৃত্রিম বুদ্ধিমত্তা ব্যবহার করে। উল্লম্ব অনুসন্ধান. আ.

2048 গেম (JAVA কোড) সমাধান করতে কৃত্রিম বুদ্ধিমত্তা ব্যবহার করে

এখন পর্যন্ত আপনারা বেশিরভাগ শুনেছেন/খেয়েছেন 2048 খেলা গ্যাব্রিয়েল সিরুলি দ্বারা। এটি একটি সাধারণ কিন্তু অত্যন্ত আসক্তিপূর্ণ বোর্ড গেম যার জন্য আপনাকে 2048 নম্বরে পৌঁছানোর জন্য ঘরের সংখ্যা একত্রিত করতে হবে। যেমনটি প্রত্যাশা করা হয়েছিল গেমটির অসুবিধা বাড়বে যত বেশি সেল উচ্চ মান দিয়ে পূর্ণ হবে। ব্যক্তিগতভাবে যদিও আমি গেমটি খেলে মোটামুটি সময় ব্যয় করেছি, আমি কখনই 2048 এ পৌঁছাতে পারিনি। তাই স্বাভাবিক জিনিসটি হল 2048 গেমটিকে পরাজিত করার জন্য JAVA-তে একটি AI সমাধান করার চেষ্টা করা। 🙂

এই নিবন্ধে আমি সংক্ষিপ্তভাবে গেম 2048-এর কৃত্রিম বুদ্ধিমত্তা সমাধানের জন্য আমার পদ্ধতির বিষয়ে আলোচনা করব, আমি যে হিউরিস্টিকগুলি ব্যবহার করেছি তা বর্ণনা করব এবং আমি সম্পূর্ণ কোড প্রদান করব যা JAVA-তে লেখা আছে। কোডটি GPL v3 লাইসেন্সের অধীনে ওপেন সোর্স করা হয়েছে এবং আপনি এটি থেকে ডাউনলোড করতে পারেন গিটহাব.

JAVA-তে 2048 গেম ডেভেলপ করা হচ্ছে

আসল গেমটি জাভাস্ক্রিপ্টে লেখা আছে, তাই আমাকে স্ক্র্যাচ থেকে জাভাতে এটি পুনরায় লিখতে হয়েছিল। গেমটির মূল ধারণা হল আপনার কাছে পূর্ণসংখ্যার মান সহ একটি 4×4 গ্রিড রয়েছে, যার সবকটিই 2 এর ক্ষমতা। শূন্য মূল্যবান কোষগুলি খালি বলে বিবেচিত হয়। গেম চলাকালীন প্রতিটি পয়েন্টে আপনি মানগুলিকে উপরে, নীচে, ডান বা বামে 4 টি দিকের দিকে নিয়ে যেতে পারবেন। আপনি যখন একটি চাল সঞ্চালন করেন তখন গ্রিডের সমস্ত মান সেই দিকে চলে যায় এবং তারা হয় গ্রিডের সীমানায় পৌঁছালে বা যখন তারা শূন্য মানহীন অন্য কক্ষে পৌঁছায় তখন তারা থামে। যদি সেই আগের কক্ষের মান একই থাকে, তাহলে দুটি কক্ষকে দ্বিগুণ মান সহ একটি কক্ষে একত্রিত করা হয়। প্রতিটি পদক্ষেপের শেষে একটি খালি কক্ষের একটিতে বোর্ডে একটি এলোমেলো মান যোগ করা হয় এবং এর মান হয় 2 সম্ভাব্যতার সাথে 0.9 বা 4 সম্ভাবনা সহ 0.1। গেমটি শেষ হয় যখন প্লেয়ার 2048 (জয়) মান সহ একটি সেল তৈরি করতে পরিচালনা করে বা যখন অন্য কোন চাল তৈরি না হয় (হারানো)।

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

সমস্ত ক্লাস Javadoc মন্তব্য সহ নথিভুক্ত করা হয়. নীচে আমরা বাস্তবায়নের আর্কিটেকচারের একটি উচ্চ স্তরের বিবরণ প্রদান করি:

1. বোর্ড ক্লাস

বোর্ড ক্লাসে গেমের প্রধান কোড থাকে, যা টুকরোগুলি সরানো, স্কোর গণনা করা, খেলাটি বন্ধ হয়ে গেলে বৈধ করা ইত্যাদির জন্য দায়ী।

2. অ্যাকশন স্ট্যাটাস এবং ডিরেকশন এনাম

অ্যাকশন স্ট্যাটাস এবং দিকনির্দেশ হল 2টি প্রয়োজনীয় এনাম যা একটি পদক্ষেপের ফলাফল এবং সেই অনুযায়ী তার দিকনির্দেশ সংরক্ষণ করে।

3. কনসোল গেম ক্লাস

ConsoleGame হল প্রধান শ্রেণী যা আমাদেরকে গেমটি খেলতে এবং AI Solver এর নির্ভুলতা পরীক্ষা করতে দেয়।

4. AIsolver ক্লাস

AIsolver হল কৃত্রিম বুদ্ধিমত্তা মডিউলের প্রাথমিক শ্রেণী যা একটি নির্দিষ্ট বোর্ডের দেওয়া পরবর্তী সেরা পদক্ষেপের মূল্যায়নের জন্য দায়ী।

কৃত্রিম বুদ্ধিমত্তা প্রযুক্তি: মিনিম্যাক্স বনাম আলফা-বিটা ছাঁটাই

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

মিনিম্যাক্স অ্যালগরিদম

Minimax
সার্জারির Minimax একটি পুনরাবৃত্ত অ্যালগরিদম যা দুই-প্লেয়ার জিরো-সম গেমস সমাধানের জন্য ব্যবহার করা যেতে পারে। খেলার প্রতিটি অবস্থায় আমরা একটি মান সংযুক্ত করি। মিনিম্যাক্স অ্যালগরিদম সম্ভাব্য গেম স্টেটের স্থানের মাধ্যমে অনুসন্ধান করে একটি গাছ তৈরি করে যা একটি নির্দিষ্ট পূর্বনির্ধারিত গভীরতায় না পৌঁছানো পর্যন্ত প্রসারিত হয়। একবার সেই পাতার রাজ্যে পৌঁছে গেলে, তাদের মানগুলি মধ্যবর্তী নোডগুলির অনুমান করতে ব্যবহৃত হয়।

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

[এম্বেড করা সামগ্রী]

নীচে আপনি Minimax অ্যালগরিদমের pseudocode দেখতে পারেন:

ক্রিয়া মিনিম্যাক্স (নোড, গভীরতা, সর্বোচ্চ প্লেয়ার)
    if গভীরতা = 0 or নোড একটি টার্মিনাল নোড
        প্রত্যাবর্তন নোডের হিউরিস্টিক মান
    if maximizing Player bestValue := -∞
        প্রতিটির জন্য চাইল্ড অফ নোড ভ্যাল := মিনিম্যাক্স(চাইল্ড, ডেপথ - 1, মিথ্যা)) bestValue := max(bestValue, val);
        প্রত্যাবর্তন শ্রেষ্ঠ মূল্য
    আর
        bestValue := +∞
        প্রতিটির জন্য চাইল্ড অফ নোড ভ্যাল := মিনিম্যাক্স(চাইল্ড, ডেপথ - 1, সত্য)) bestValue := min(bestValue, val);
        প্রত্যাবর্তন শ্রেষ্ঠ মূল্য
(* প্লেয়ার সর্বোচ্চ করার জন্য প্রাথমিক কল *)
minimax (উৎপত্তি, গভীরতা, সত্য)

আলফা-বিটা ছাঁটাই

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

[এম্বেড করা সামগ্রী]

নীচে আপনি আলফা-বিটা ছাঁটাই অ্যালগরিদমের সিউডোকোড দেখতে পারেন:

ক্রিয়া বর্ণমালা (নোড, গভীরতা, α, β, সর্বোচ্চ প্লেয়ার)
    if গভীরতা = 0 or নোড একটি টার্মিনাল নোড
        প্রত্যাবর্তন নোডের হিউরিস্টিক মান
    if maximizing Player
        প্রতিটির জন্য নোডের শিশু α := সর্বোচ্চ(α, বর্ণমালা(শিশু, গভীরতা - 1, α, β, মিথ্যা))
            if β ≤ α
                বিরতি (* β কাট-অফ *)
        প্রত্যাবর্তন α
    আর
        প্রতিটির জন্য নোডের শিশু β := মিনিট(β, বর্ণমালা(শিশু, গভীরতা - 1, α, β, সত্য))
            if β ≤ α
                বিরতি (* α কাট-অফ *)
        প্রত্যাবর্তন β
(* প্রাথমিক কল *)
বর্ণমালা (উৎপত্তি, গভীরতা, -∞, +∞, সত্য)

কিভাবে AI গেম 2048 সমাধান করতে ব্যবহার করা হয়?

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

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

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

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

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

একটি হিউরিস্টিক স্কোর ফাংশন বিকাশ করা

খেলাকে হারানোর জন্য, আমি বিভিন্ন হিউরিস্টিক ফাংশন চেষ্টা করেছি। আমি যেটি সবচেয়ে দরকারী বলে মনে করেছি তা হল:

private static int heuristicScore(int actualScore, int numberOfEmptyCells, int clusteringScore) {
     int score = (int) (actualScore+Math.log(actualScore)*numberOfEmptyCells -clusteringScore);
     return Math.max(score, Math.min(actualScore, 1));
}

উপরের ফাংশনটি বোর্ডের প্রকৃত স্কোর, খালি ঘর/টাইলসের সংখ্যা এবং ক্লাস্টারিং স্কোর নামে একটি মেট্রিককে একত্রিত করে যা আমরা পরে আলোচনা করব। আসুন আরও বিস্তারিতভাবে প্রতিটি উপাদান দেখুন:

  1. প্রকৃত স্কোর: সুস্পষ্ট কারণে, যখন আমরা একটি বোর্ডের মান গণনা করি তখন আমাদের তার স্কোরটি বিবেচনা করতে হবে। কম স্কোর সহ বোর্ডগুলির তুলনায় উচ্চ স্কোরযুক্ত বোর্ডগুলি সাধারণত পছন্দ করা হয়।
  2. খালি কক্ষের সংখ্যা: যেমনটি আমরা আগে উল্লেখ করেছি, কিছু খালি ঘর রাখা গুরুত্বপূর্ণ যাতে আমরা পরবর্তী পদক্ষেপে খেলাটি হারাতে না পারি। বেশি খালি কক্ষ সহ বোর্ড স্টেটগুলি সাধারণত কম সহ অন্যদের তুলনায় পছন্দ করা হয়। একটি প্রশ্ন উত্থাপিত হয় যে আমরা কীভাবে সেই খালি কোষগুলিকে মূল্য দেব? আমার সমাধানে আমি তাদের প্রকৃত স্কোরের লগারিদম দ্বারা ওজন করি। এটির নিম্নলিখিত প্রভাব রয়েছে: স্কোর যত কম হবে, অনেকগুলি খালি সেল থাকা তত কম গুরুত্বপূর্ণ (এর কারণ হল গেমের শুরুতে কোষগুলিকে একত্রিত করা মোটামুটি সহজ)৷ স্কোর যত বেশি হবে, আমাদের গেমে খালি সেল আছে তা নিশ্চিত করা আরও গুরুত্বপূর্ণ (এর কারণ হল খেলার শেষে খালি ঘরের অভাবের কারণে হারার সম্ভাবনা বেশি।
  3. ক্লাস্টারিং স্কোর: আমরা ক্লাস্টারিং স্কোর ব্যবহার করি যা পরিমাপ করে আমাদের বোর্ডের মানগুলি কতটা বিক্ষিপ্ত। যখন একই মান সহ কক্ষগুলি কাছাকাছি থাকে তখন তাদের একত্রিত করা সহজ হয় যার অর্থ গেমটি হারানো কঠিন। এই ক্ষেত্রে ক্লাস্টারিং স্কোর একটি কম মান আছে. যদি বোর্ডের মানগুলি ছড়িয়ে ছিটিয়ে থাকে তবে এই স্কোরটি খুব বড় মান পায়। এই স্কোরটি আগের দুটি স্কোর থেকে বিয়োগ করা হয় এবং একটি পেনাল্টির মতো কাজ করে যা নিশ্চিত করে যে ক্লাস্টারযুক্ত বোর্ডগুলিকে অগ্রাধিকার দেওয়া হবে।

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

পরিশেষে আমাদের মনে রাখা উচিত যে প্লেয়ার যখন একটি টার্মিনাল গেম স্টেটে পৌঁছে এবং আর কোনো নড়াচড়ার অনুমতি দেওয়া হয় না, তখন আমরা রাজ্যের মান অনুমান করতে উপরের স্কোর ব্যবহার করি না। গেমটি জিতে গেলে আমরা সর্বোচ্চ সম্ভাব্য পূর্ণসংখ্যার মান নির্ধারণ করি, যখন খেলাটি হেরে যায় তবে আমরা সর্বনিম্ন অ-নেতিবাচক মান নির্ধারণ করি (আগের অনুচ্ছেদের মতো অনুরূপ যুক্তি সহ 0 বা 1)।

ক্লাস্টারিং স্কোর সম্পর্কে আরও

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

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

ক্লাস্টারিং স্কোরের নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

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

অ্যালগরিদমের নির্ভুলতা

প্রত্যাশিত অ্যালগরিদমের নির্ভুলতা (ওরফে জয়ী হওয়া গেমগুলির শতাংশ) আমরা যে অনুসন্ধান গভীরতার ব্যবহার করি তার উপর নির্ভর করে। অনুসন্ধানের গভীরতা যত বেশি হবে, নির্ভুলতা তত বেশি হবে এবং চালানোর জন্য তত বেশি সময় লাগবে। আমার পরীক্ষায়, গভীরতা 3 সহ একটি অনুসন্ধান 0.05 সেকেন্ডের কম স্থায়ী হয় তবে জয়ের 20% সুযোগ দেয়, 5 এর গভীরতা প্রায় 1 সেকেন্ড স্থায়ী হয় তবে 40% জয়ের সুযোগ দেয় এবং অবশেষে 7 এর গভীরতা 27-28 সেকেন্ড স্থায়ী হয় এবং জেতার প্রায় 70-80% সম্ভাবনা দেয়।

ভবিষ্যতের সম্প্রসারণ

আপনি যারা কোড উন্নত করতে আগ্রহী তাদের জন্য এখানে কয়েকটি জিনিস রয়েছে যা আপনি দেখতে পারেন:

  1. গতি উন্নত করুন: অ্যালগরিদমের গতির উন্নতি আপনাকে বৃহত্তর গভীরতা ব্যবহার করার অনুমতি দেবে এবং এইভাবে আরও সঠিকতা পাবে।
  2. গ্রাফিক্স তৈরি করুন: গ্যাব্রিয়েল সিরুলির বাস্তবায়ন এত বিখ্যাত হওয়ার একটি ভাল কারণ রয়েছে। এটা দেখতে সুন্দর! আমি একটি GUI বিকাশ করতে বিরক্ত করিনি তবে আমি বরং কনসোলে ফলাফলগুলি মুদ্রণ করি যা গেমটিকে অনুসরণ করা এবং খেলতে কঠিন করে তোলে। একটি সুন্দর GUI তৈরি করা আবশ্যক।
  3. টিউন হিউরিস্টিকস: আমি আগে উল্লেখ করেছি, বেশ কিছু ব্যবহারকারী বিভিন্ন হিউরিস্টিক পরামর্শ দিয়েছেন। স্কোরগুলি যেভাবে গণনা করা হয়, ওজন এবং বোর্ডের বৈশিষ্ট্যগুলি বিবেচনায় নেওয়া হয় তা নিয়ে কেউ পরীক্ষা করতে পারে। ক্লাস্টার স্কোর পরিমাপ করার আমার পদ্ধতিতে একঘেয়েমি এবং মসৃণতার মতো অন্যান্য পরামর্শগুলিকে একত্রিত করার কথা, তবে উন্নতির জন্য এখনও জায়গা রয়েছে।
  4. গভীরতা টিউনিং: কেউ গেমের অবস্থার উপর নির্ভর করে অনুসন্ধানের গভীরতা টিউন/সামঞ্জস্য করার চেষ্টা করতে পারে। এছাড়াও আপনি ব্যবহার করতে পারেন পুনরাবৃত্ত গভীরকরণ গভীরতা-প্রথম অনুসন্ধান অ্যালগরিদম যা আলফা-বিটা ছাঁটাই অ্যালগরিদম উন্নত করতে পরিচিত।

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

সময় স্ট্যাম্প:

থেকে আরো ডেটাবক্স