প্রকল্প সম্পর্কে

# chess_z chess_z হল সি ভাষায় লেখা একটি চীনা দাবা সফটওয়্যার ফ্রেমওয়ার্ক, যার বর্তমান গুরুত্ব নিয়ম কোর এবং AI সংযোগ সীমানার উপর। ## প্রধান বৈশিষ্ট্য - **বিটবোর্ড উপস্থাপনা**: ৯০ ঘরের বোর্ড দ্বৈত `uint64_t` বিটবোর্ড দিয়ে উপস্থাপন করা হয়, প্রতিটি পক্ষের প্রতিটি ধরনের গুটির জন্য আলাদা bitboard থাকে। - **মেইলবক্স অ্যারে**: একই সাথে `board[90]` মেইলবক্স অ্যারে রক্ষণাবেক্ষণ করা হয়, যা নিয়ম উৎপাদন ও ডিবাগিং সহজ করে। - **সম্পূর্ণ নিয়ম সমর্থন**: প্রাথমিক অবস্থান, FEN পড়া/লেখা, চাল দেওয়া, বৈধ চাল উৎপাদন, কিস্তি শনাক্তকরণ এবং perft সমর্থন করে। - **AI অ্যাডাপ্টার ইন্টারফেস**: `XqEngineAdapter` প্রদান করে, পরে বাহ্যিক দাবা AI অনুসন্ধান/মূল্যায়ন ফাংশন সংযুক্ত করা যাবে। - **অন্তর্নির্মিত সাধারণ ইঞ্জিন**: একটি খুব ছোট উপাদান ও বৈধ চাল গতিশীলতা মূল্যায়ন + negamax অনুসন্ধান অন্তর্ভুক্ত, যা মূলত ফ্রেমওয়ার্ক স্মোক টেস্টের জন্য ব্যবহৃত হয়। ## ডিরেক্টরি কাঠামো ```text include/xiangqi/bitboard.h বিটবোর্ড মৌলিক অপারেশন include/xiangqi/types.h মৌলিক ধরন, গুটি, চাল include/xiangqi/position.h অবস্থান উপস্থাপনা, FEN, চাল দেওয়া include/xiangqi/movegen.h ছদ্ম-বৈধ/বৈধ চাল, কিস্তি শনাক্তকরণ, perft include/xiangqi/engine.h AI ইঞ্জিন অ্যাডাপ্টার ইন্টারফেস src/ কোর বাস্তবায়ন examples/cli.c উদাহরণ কমান্ড লাইন এন্ট্রি stats/generate_positions.c এলোমেলো বৈধ অবস্থান উৎপাদন এন্ট্রি stats/search_positions.c ব্যাচ অবস্থান অনুসন্ধান এন্ট্রি stats/random_fen/ এলোমেলো অবস্থান FEN ডেটা stats/data/ কর্মক্ষমতা বিশ্লেষণ ফলাফল tests/test_core.c মৌলিক নিয়ম পরীক্ষা ``` ## বিল্ড CMake ব্যবহার করার পরামর্শ দেওয়া হয়: ```sh cmake -S . -B build cmake --build build ctest --test-dir build ``` যদি স্থানীয় মেশিনে শুধুমাত্র GCC থাকে, তাহলে সরাসরি পরীক্ষা কম্পাইল করা যায়: ```sh gcc -std=c99 -Wall -Wextra -Wpedantic -I include src/position.c src/movegen.c src/engine.c tests/test_core.c -o build/xiangqi_core_tests ./build/xiangqi_core_tests ``` ইন্টারঅ্যাকটিভ মানুষ-মেশিন উদাহরণ কম্পাইল করা: ```sh gcc -std=c99 -Wall -Wextra -Wpedantic -I include src/position.c src/movegen.c src/engine.c examples/cli.c -o build/xiangqi_cli ./build/xiangqi_cli ``` উদাহরণ এন্ট্রি ডিফল্টভাবে "আপনি লাল পক্ষ, অন্তর্নির্মিত সাধারণ ইঞ্জিন কালো পক্ষ"। ইনপুট ফরম্যাট হল `শুরুর ঘর+গন্তব্য ঘর`, ফাইল `a..i` ব্যবহার করে, সারি নম্বর `0..9` ব্যবহার করে, যেমন: ```text b2b9 ``` উপলব্ধ কমান্ড: ```text moves বর্তমান সকল বৈধ চাল প্রিন্ট করে fen বর্তমান FEN প্রিন্ট করে help সাহায্য প্রিন্ট করে quit প্রস্থান করে ``` ## এলোমেলো অবস্থান উৎপাদন ও ব্যাচ অনুসন্ধান বিল্ডের পরে প্রথমে পুনরুৎপাদনযোগ্য এলোমেলো বৈধ অবস্থানের একটি সেট তৈরি করা যায়, তারপর অন্তর্নির্মিত ইঞ্জিন দিয়ে একে একে অনুসন্ধান করা যায়: ```sh ./build/xiangqi_generate_positions ./build/xiangqi_search_positions ``` দুটি প্রোগ্রাম ডিফল্টভাবে `stats/random_fen/random_positions.fen` ব্যবহার করে, উভয়ের জন্য একই ফাইল পাথ নির্দিষ্ট করাও যায়: ```sh ./build/xiangqi_generate_positions build/profile_positions.fen ./build/xiangqi_search_positions build/profile_positions.fen ``` জেনারেটর একটি নির্দিষ্ট র‍্যান্ডম সিড ব্যবহার করে, প্রাথমিক অবস্থান থেকে এলোমেলোভাবে `0..100` ধাপ চাল দেয়, মোট ১০০টি অবস্থান আউটপুট করে, প্রতি লাইনে একটি FEN। অনুসন্ধান প্রোগ্রাম ফাইলটি একবার ক্রমানুসারে পড়ে, সর্বোচ্চ গভীরতা ৬, সময়সীমাহীন কনফিগারেশনে প্রতিটি অবস্থানের জন্য এক ধাপ অনুসন্ধান করে, যা কর্মক্ষমতা বিশ্লেষণের জন্য একটি নন-ইন্টারঅ্যাকটিভ এন্ট্রি হিসেবে উপযুক্ত। ## AI সংযোগ বাহ্যিক AI সরাসরি নিয়ম স্তর পুনর্ব্যবহার করতে পারে: ```c XqMoveList legal; xq_generate_legal(&pos, &legal); for (int i = 0; i < legal.count; ++i) { XqPosition next = pos; xq_position_make_move(&next, legal.moves[i]); /* next-এ অনুসন্ধান বা মূল্যায়ন করুন */ } ``` `XqEngineAdapter` এর মাধ্যমেও কাস্টম অনুসন্ধান সংযুক্ত করা যায়: ```c static bool my_search(const XqPosition *pos, unsigned depth, XqMove *best, void *user) { (void)user; /* xq_generate_legal / xq_position_make_move ব্যবহার করে নিজের অনুসন্ধান বাস্তবায়ন করুন */ return false; } XqEngineAdapter engine = { .evaluate = NULL, .search = my_search, .user = NULL, }; XqMove best; XqSearchLimits limits = xq_search_limits_default(); xq_engine_find_best_move(&engine, &pos, &limits, &best); ``` ## স্থানাঙ্ক নিয়ম - `file` পরিসীমা `0..8`, `rank` পরিসীমা `0..9`। - লাল পক্ষের বেস লাইন `rank = 0`, কালো পক্ষের বেস লাইন `rank = 9`। - `xq_square_make(file, rank)` স্থানাঙ্ককে `rank * 9 + file`-এ ম্যাপ করে। - FEN কালো পক্ষ থেকে লাল পক্ষ পর্যন্ত ১০টি সারিতে লেখা হয়, বড় হাতের অক্ষর লাল পক্ষ এবং ছোট হাতের অক্ষর কালো পক্ষ নির্দেশ করে।