इस प्रोजेक्ट के बारे में

# chess_z chess_z C भाषा में लागू किया गया एक चीनी शतरंज सॉफ़्टवेयर ढांचा है, जिसका वर्तमान ध्यान नियम कोर और AI एकीकरण सीमा पर है। ## मुख्य विशेषताएँ - **बिटबोर्ड प्रतिनिधित्व**: 90 खानों वाले बोर्ड को दोहरे `uint64_t` बिटबोर्ड से दर्शाया जाता है, प्रत्येक पक्ष और प्रत्येक मोहरे के लिए अलग बिटबोर्ड होता है। - **मेलबॉक्स सरणी**: नियम निर्माण और डिबगिंग को आसान बनाने के लिए `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` चालें चलता है, कुल 100 स्थितियाँ आउटपुट करता है, प्रत्येक पंक्ति में एक FEN होता है। खोज प्रोग्राम फ़ाइल को क्रम से एक बार पढ़ता है, अधिकतम गहराई 6, समय सीमा रहित कॉन्फ़िगरेशन के साथ प्रत्येक स्थिति के लिए एक चाल खोजता है, जो प्रदर्शन विश्लेषण के लिए गैर-इंटरैक्टिव प्रवेश बिंदु के रूप में उपयुक्त है। ## 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 काले पक्ष से लाल पक्ष तक 10 पंक्तियों में लिखा जाता है, बड़े अक्षर लाल पक्ष को दर्शाते हैं, छोटे अक्षर काले पक्ष को दर्शाते हैं।