ওহ আমি এই গেমগুলি ভালবাসি!
কম্পিউটারটি গেম খেলার জন্য প্রথমে প্রথমে জিনিসগুলির প্রয়োজন:
- কাজ করার জন্য একটি কাঠামো
- নিয়ম দ্বারা খেলা
- দিকে কাজ করার জন্য একটি জয়ের শর্ত
একসাথে এই এক টুকরা মোকাবেলা করা যাক।
গঠন
যেহেতু বোর্ডটি একটি 8x8 গ্রিড (তবে সহজেই স্কেল করতে পারে), এবং প্রতিটি গ্রিডের স্থান পাঁচটি রাজ্যের মধ্যে একটিতে উপস্থিত থাকতে পারে, আসুন সেই রাজ্যগুলি সংজ্ঞায়িত করুন:
[EMPTY, WHITE_PIECE, BLACK_PIECE, WHITE_PIECE_PROMOTED, BLACK_PIECE_PROMOTED]
সম্মানিতভাবে ENUM'd করতে:
[0, 1, 2, 3, 4]
এখন যেহেতু আমরা জানি যে প্রতিটি স্থান কী হতে পারে আমাদের সমস্ত জায়গার প্রতিনিধিত্ব করার কিছু উপায় প্রয়োজন, বা বোর্ড আপনি চাইলে। প্রায় প্রতিটি শক্তিশালী ভাষা একটি বহুমাত্রিক অ্যারে সমর্থন করবে (এমন একটি অ্যারে যেখানে প্রতিটি উপাদান একটি অ্যারে হোল্ডিং ডেটা থাকে)। সুতরাং আমাদের অ্যারে সংজ্ঞায়িত করার জন্য নিম্নলিখিত স্ল্যাক কোডটি নিন:
BOARD_ARRAY = array(8, 8)
এটি আমাদের একটি 8 x 8 অ্যারে দেবে যেখানে আমরা পূর্ণসংখ্যা (আমাদের এনামগুলি আগে থেকে) সংরক্ষণ করতে পারি:
(
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
)
এখন আপনি ইতিমধ্যে দেখতে পাচ্ছেন যে এটি কীভাবে বোর্ডের মতো দেখতে শুরু করেছে! আমি ইউটিউব ভিডিওতে উল্লিখিত রূপটি কখনও খেলিনি তবে এটি নীচে থেকে এক সারি সাদা টুকরো 2 সারি এবং উপরে থেকে এক সারি কালো টুকরো 2 সারি দিয়ে শুরু হবে বলে মনে হচ্ছে। যার অর্থ হ'ল আমরা যখন কোন খেলা শুরু করি তখন আমাদের অ্যারেটি দেখতে এমন হওয়া উচিত:
(
[0, 0, 0, 0, 0, 0, 0, 0],
[2, 2, 2, 2, 2, 2, 2, 2],
[2, 2, 2, 2, 2, 2, 2, 2],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0],
)
(মনে রাখবেন 2 'BLACK_PIECE' উপস্থাপন করে এবং 1 'WHITE_PIECE' উপস্থাপন করে)
সুতরাং এখন কম্পিউটারের সাথে কাজ করার একটি কাঠামো রয়েছে। পদক্ষেপ 1 সম্পূর্ণ!
বিধি
আসুন কল্পনা করুন যে আপনি একটি মাস্টার প্লেয়ারের বিরুদ্ধে খেলছেন, আপনার সামনে একটি সত্যিকারের বোর্ড তৈরি হয়েছিল। যদি আপনি তার একটি টুকরো সরানোর চেষ্টা করেন তবে আপনি আপনার হাতকে চড় মারতে পারেন। আপনি যদি টুকরো টুকরোটি এমনভাবে সরানোর চেষ্টা করেন যা আপনি করতে না পারেন, তবে আপনার হাতটি চড় মারবে। যদি আপনি ভাল ঠকানোর চেষ্টা করেন ... আপনি ধারণা পাবেন। তবে সমস্যাটি হচ্ছে, কম্পিউটারগুলি তা করে না। সুতরাং এটির মধ্যে কঠোর নিয়ম সরবরাহ করা আমাদের কাজ ।
আমাদের দেওয়া কোনও পদক্ষেপ 'আইনী' কিনা তা পরীক্ষা করার একটি উপায় তৈরি করতে হবে। যার অর্থ আমাদের প্রথমে একটি 'চাল' উপস্থাপনের জন্য কিছু উপায় প্রয়োজন। একটি উপায় অ্যারে অবস্থান ব্যবহার করা হবে; উদাহরণস্বরূপ [0, 0] থেকে [0, 1] এ কোনও টুকরো স্থানান্তরিত করার জন্য, আমরা এমন একটি ফাংশন তৈরি করতে পারি যা এই পদক্ষেপের পরে বোর্ড আপডেট করবে। তাই পিছনে ফিরে:
MY_MOVE = array( [0, 0], [0, 1] )
উপরেরটি এক টুকরো উপস্থাপন করে বোর্ডের উপরের কোণ থেকে এক স্থানকে নীচে নিয়ে যাচ্ছে (ধরে নিচ্ছেন 0, 0 শীর্ষ বাম কোণে)। আপনি আরও খেয়াল করতে পারেন যে আমি সরানোর জন্য একটি বহুমাত্রিক অ্যারে ব্যবহার করা পছন্দ করেছি। এটি কারণ টুকরা তাত্ত্বিকভাবে এক পালা (প্রচুর 'টুকরো টুকরো টুকরো টুকরো করার' জন্য) সংখ্যক বার স্থানান্তর করতে পারে। সুতরাং আসুন 0, 1 এর ভান করুন একটি প্রতিপক্ষের টুকরা ছিল, যার অর্থ আমরা 0, 2 এ নামব:
MY_MOVE = array( [0, 0], [0, 2] )
খুব সহজ এ। প্রোগ্রামটি বুঝতে হবে যে আমরা যদি কোনও স্থান ছেড়ে চলে যাই তবে আমরা অন্য টুকরোটি ঝাঁপিয়ে যাচ্ছি (অন্যথায় এটি একটি অবৈধ পদক্ষেপ, এবং একটি ত্রুটি নিক্ষেপ করা উচিত)। এখন দুটি টুকরো লাফ দিন:
MY_MOVE = array ( [0, 0], [0, 2], [0, 4] )
এটি আমাদের বোর্ডের যে কোনও পদক্ষেপের বর্ণনা দেওয়ার একটি উপায় দেয়। হ্যাঁ! এখন যেহেতু আমি প্রশ্নে সঠিক গেমের নিয়মগুলি পুরোপুরি বুঝতে পারছি না (যদিও আমি আমার দিনে কানাডিয়ান চেকারদের মধ্যে কিছুটা খেলেছি) সঠিক পদক্ষেপের বৈধতা আপনার দ্বারা সংজ্ঞায়িত করা দরকার। এই বিন্দু পর্যন্ত একটি ভাল প্রবাহ দেখতে হবে:
FUNCTION_FIND_ALL_LEGAL_MOVES( MY_BOARD ) Returns: array ALL_LEGAL_MOVES
FUNCTION_FIND_BEST_MOVE( MY_BOARD, ALL_LEGAL_MOVES ) Returns: array MY_MOVE
FUNCTION_DO_MOVE( MY_BOARD, MY_MOVE ) Throws: error ILLEGAL_MOVE Updates: MY_BOARD
repeat from start for each turn
উপরের দিক থেকে ধরে নেওয়া হয়েছে যে আপনি এটির সমস্ত আইনী পদক্ষেপগুলি অনুসন্ধান করতে প্রতিটি টুকরো দিয়ে চক্রটি ঘুরিয়ে নিতে পারেন, তারপরে সমস্ত আইনী পদক্ষেপের সংগ্রহ দেওয়া হলে কোনওভাবে সেরাটি বেছে নিন (কৌশল এখানে)। সরানোটি বোর্ডে প্রয়োগ করা হয়, বা ত্রুটি নিক্ষেপ করা হয়। তারপরে পরের খেলোয়াড় তাদের পালা নেয়। সুতরাং আমাদের এমন একটি এআই রয়েছে যা কীভাবে খেলতে জানে! আনন্দ! সরানো.
জয়লাভ
সাধারণ গেমগুলি দুর্দান্ত, কারণ বিজয়ী একটি খুব সাধারণ রাষ্ট্র দ্বারা সংজ্ঞায়িত করা হয়। বোর্ডে সাদা টুকরা নেই? ওয়েল আমার ধারণা আপনি জিতেছেন! এটি যখন পদক্ষেপ 2 এ কার্যকর করা হয় যখন আমরা আমাদেরকে বিজয়ী অবস্থার আরও কাছে নিয়ে যাওয়ার সেরা পদক্ষেপটি বেছে নিই।
কিছু খুব বুদ্ধিমান এআই তৈরির জন্য আপনি এমন একটি ডাটাবেস রাখতে পারেন যা প্রতিটি সম্ভাব্য রাজ্য থেকে প্রতিটি সম্ভাব্য পদক্ষেপের সাথে একটি সম্ভাব্য বোর্ডকে একটি রাজ্য হিসাবে সঞ্চিত করে, জয়ের দিকে শৃঙ্খলা সন্ধান করতে।
আপনি কৌশলগুলিও তৈরি করতে পারেন, যেমন: যদি এমন কোনও টুকরোগুলি থাকে যা লাফিয়ে যায় তবে সেই টুকরোটি সংরক্ষণ করুন বা যদি কোনও টুকরা অন্য এক টুকরো টুকরো টুকরো করতে সক্ষম হয় তবে সেই লাফটি করুন।
এটি আপনাকে একটি ভাল জাম্পিং অফ পয়েন্ট দেয়, এটি আক্ষরিক সীমাহীন সম্ভাবনার একমাত্র পদ্ধতি। আপনি তাত্ত্বিকভাবে ক্রাইওনগুলির সাথে অঙ্কন করার জন্য একটি দৈত্য রোবট তৈরি করতে পারেন তবে চালগুলি চয়ন করার জন্য অঙ্কনের উপর বর্ণালী বিশ্লেষণ পরিচালনা করতে পারেন ... তবে এটি খুব ভাল বা দ্রুত কাজ করবে না। এই উপায় অতীতে কাজ করেছে, এবং ভাল কাজ করেছে (: আশা করি যে সাহায্য!
বাস্তবায়নের উপর কয়েকটি শব্দ
চেকাররা হ'ল 'সলভড' গেম হিসাবে উল্লেখ করা হয়, এতে আমরা অজানা সঙ্গে প্রতিটি পদক্ষেপ গণনা করতে পারি। তবে এটাই পুরো পদক্ষেপ! সুতরাং ম্যানুয়ালি এগুলি করার কোনও উপায় নেই ... যদি কেবল কিছু থাকত ... ওহ ঠিক আছে আমরা প্রোগ্রামাররা। মুষ্টি পাম্প
এই সমস্ত আপাতদৃষ্টিতে অন্তহীন পদক্ষেপগুলি সংরক্ষণ করার জন্য এসকিউএল একটি দুর্দান্ত সরঞ্জাম। এসকিউএল নিয়ে অভিজ্ঞতা নেই তাদের জন্য, মাইএসকিউএল হ'ল একটি নিখরচায় (ব্যবহার করা সহজ) এবং ওপেন সোর্স এসকিউএল সার্ভার। এসকিউএল স্টেরয়েডগুলিতে স্প্রেডশিটের মতো বাছাই করা ডেটাবেস পরিচালনার জন্য ব্যবহৃত হয়। এটি গুরুতরভাবে প্রচুর পরিমাণে ডেটা ধরে রাখতে এবং এটির সাথে খুব দ্রুত কাজ করতে সক্ষম।
তাহলে আমরা কীভাবে এটি ব্যবহার করতে পারি? যেহেতু আমরা জানি যে বোর্ডটি যদি যথাযথ অবস্থায় থাকে (প্রতিটি টুকরোটি একটি নির্দিষ্ট অবস্থানে থাকে) আমরা সমস্ত উপলব্ধ পদক্ষেপ গণনা করতে এবং সেগুলি সংরক্ষণ করতে পারি। উদাহরণ স্বরূপ:
+Board State+ +All Possible Moves+ +Best Move+
([0,0,1,2,3],[3..) ([0,1],[0,2]), ([7,6],[7,7],[5..) ([7,6],[7,7])
([0,0,2,2,3],[3..) ([0,1],[0,2]), ([7,6],[7,7],[5..) ([5,5],[5,4])
([0,0,1,3,3],[3..) ([0,1],[0,2]), ([7,6],[7,7],[5..) ([4,4],[4,3])
etc...
সুতরাং যখন কম্পিউটারটি একটি সরানোর প্রয়োজন হয় তখন এটি কেবল ডাটাবেসে বোর্ড স্টেট (প্রাথমিক কী হিসাবে সঞ্চিত) সন্ধান করে এবং হয় সর্বোত্তম পদক্ষেপ (অপরাজেয় হওয়া উচিত) বা অন্য একটি চালকে একটি আরও বন্ধুত্বপূর্ণ করতে বেছে নিতে পারে এআই।
দুর্দান্ত এখন এই ডাটাবেস তৈরি করা যাক। প্রথমে আমাদের প্রতিটি বোর্ডের অবস্থা গণনা করা দরকার। এটি একটি দুর্দান্ত বড় দুষ্টু লুপের সাহায্যে করা যেতে পারে, যদি কেউ কিছু সময় ব্যয় করতে এবং এটির কাজ করতে চায় তবে তা দুর্দান্ত। অ্যারেটিকে একটি বড় সংখ্যা হিসাবে দেখুন, তারপরে বেস 5 (0, 1, 2, 3, 4) ব্যতীত উপরের দিকে গণনা করুন এবং শর্ত করুন যে প্রতিটি খেলোয়াড়ের কেবল 16 টি টুকরা থাকতে পারে।
এই মুহুর্তে আমাদের প্রতিটি বোর্ডের স্টেট থাকা উচিত এবং সমস্ত সম্ভাব্য পদক্ষেপ গণনা করে যেতে পারি।
সমস্ত সম্ভাব্য পদক্ষেপ গণনা করা হলে প্যাথফাইন্ডিংয়ের সর্বোত্তম সম্ভাব্য পদক্ষেপের মজাদার অংশটি আসে। এখান থেকেই আমার জ্ঞান কমতে শুরু করে এবং মিনিম্যাক্স বা এ * এর মতো জিনিসগুলি খেলতে শুরু করে। দুঃখিত আমি এতে আরও সাহায্য করতে পারি না: /