منصوبے کے بارے میں

# chess_z chess_z ایک C زبان میں لکھا گیا چینی شطرنج کا سافٹ ویئر فریم ورک ہے، جس کی موجودہ توجہ قواعد کے مرکزے اور AI انٹیگریشن کی حد پر ہے۔ ## اہم خصوصیات - **بٹ بورڈ نمائندگی**: 90 خانے والے بورڈ کے لیے دو `uint64_t` بٹ بورڈ استعمال ہوتے ہیں، ہر فریق کے ہر مہرے کی قسم کے لیے الگ bitboard موجود ہے۔ - **میل باکس اری**: قواعد کی تیاری اور ڈیبگنگ کی سہولت کے لیے `board[90]` میل باکس اری بھی ہم وقت برقرار رکھی جاتی ہے۔ - **مکمل قواعد کی حمایت**: ابتدائی پوزیشن، FEN پڑھنا/لکھنا، چال چلانا، قانونی چالوں کی تیاری، شاہ کی جانچ اور perft کی حمایت۔ - **AI انٹرفیس**: `XqEngineAdapter` فراہم کرتا ہے، جس کے ذریعے بعد میں بیرونی شطرنج AI کی تلاش/تشخیص کے فنکشن منسلک کیے جا سکتے ہیں۔ - **بلٹ اِن سادہ انجن**: ایک بہت چھوٹی مواد اور قانونی چالوں کی حرکت پذیری کی تشخیص + negamax تلاش شامل ہے، جو بنیادی طور پر فریم ورک کے smoke test کے لیے ہے۔ ## ڈائریکٹری ساخت ```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 ``` جنریٹر مقررہ بے ترتیب seed استعمال کرتا ہے، ابتدائی پوزیشن سے بے ترتیب طور پر `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 سطروں میں لکھا جاتا ہے، بڑے حروف سرخ فریق کے لیے، چھوٹے حروف سیاہ فریق کے لیے استعمال ہوتے ہیں۔