मुझे लगता है कि आप पहले से ही मिन-मैक्स, पेड़ों और छंटाई, हेयुरिस्टिक और अन्य मूल बातें की अवधारणा के बारे में जानते हैं और जो मैं यहां लिख रहा हूं वह केवल कुछ विवरण हैं जिन्हें कम करके आंका जा सकता है।
मैंने कंपनी के साथ एक मित्र ने कभी-कभी हमारे अपने शतरंज इंजन को लिखा था। मैं कुछ मुद्दों और विचारों को साझा करता हूं और मुझे आशा है कि आप उन्हें उपयोगी पाएंगे।
चूँकि हम दोनों जावा प्रोग्रामर थे इसलिए हमारी भाषा ने हमें जावा बना दिया और हमने एक वस्तु उन्मुख दृष्टिकोण के साथ शुरुआत की। टुकड़े वस्तु थे, बोर्ड ऑब्जेक्ट था, फाइलें और रैंक (शतरंज साहित्य में पंक्तियां और कॉलम) ऑब्जेक्ट थे। और यह गलत था। ओवरहेड बड़े पैमाने पर था और कार्यक्रम खोज पेड़ में 2 से अधिक चाल (4 प्लाई) से आगे जाने के लिए संघर्ष कर रहा था।
तो कुछ खोज के साथ हम एक शानदार विचार (हालांकि हमारा नहीं!) के साथ समाप्त हुए: लंबे पूर्णांक (64 बिट) के रूप में टुकड़ों और बोर्ड का प्रतिनिधित्व करना। यह समझ में आता है क्योंकि एक शतरंज बोर्ड में 64 वर्ग होते हैं। बाकी बिट वार ऑपरेशन (बहुत तेजी से सीपीयू के पास चल रहा था)। उदाहरण के लिए, एक बाइनरी 64 बिट पूर्णांक पर विचार करें जिसमें लोग बोर्ड पर वर्गों को प्रस्तुत कर रहे हैं जो आपके टुकड़े पर हमला कर सकते हैं। अब यदि आप इस तरह दो संख्याओं के बीच एक तार्किक "और" निष्पादित करते हैं, तो एक गैर-शून्य परिणाम बताता है कि आपके पास हमलावरों के साथ एक वर्ग है। शतरंज बोर्ड और टुकड़ों को प्रस्तुत करने के कई तरीके हैं, इसलिए:
1 - अपनी बोर्ड प्रस्तुति के बारे में निर्णय लें
फिर आपको डेटाबेस की जरूरत है और खोलना है। शतरंज के उद्घाटन को किसी तरह से हल किया जाता है, यह पुस्तक की शुरुआत और खोलने के लिए अत्यधिक अनुशंसित है। इस मामले में, आपके पास ब्लिट्ज गेम्स में बहुत अतिरिक्त समय है।
2 - अपने आप को एक शुरुआती किताब खोजें।
हमने ये किया, लेकिन फिर भी हम अच्छे होने से बहुत दूर थे:
3 - एक अच्छा शतरंज इंजन को 6 चाल (12 प्लाई) से आगे देखने में सक्षम होना चाहिए।
तो हमने जो किया, वह था मृत समय का उपयोग करना (यदि यह एक मानव बनाम कंप्यूटर इंजन है)।
4 - उस समय का उपयोग करें जब प्रतिद्वंद्वी आपके पेड़ के कुछ स्तरों को बनाने के लिए सोच रहा है।
और अभी भी हम 12 मैदानों से बहुत दूर थे। अधिक अध्ययन से, हम कुछ तरकीबें खोजते हैं! उदाहरण के लिए यह सुझाव दिया गया कि पेड़ के एक प्लाई को छोड़ें और अगले प्लाई से शुरू करें (जैसे कोई प्रतिद्वंद्वी नहीं है)। विचार यह है कि यदि कोई चाल बेहद मुहावरेदार है, तो समय क्यों बर्बाद करें और देखें कि उस कदम पर विरोधियों की प्रतिक्रियाएं क्या हैं। हालांकि, एक अच्छे इंजन में और मूढ़ और जीनियस क्वीन बलिदान के बीच अंतर करने में सक्षम होना चाहिए।
5 - इस विशिष्ट समस्या (शतरंज) के लिए प्रोग्रामिंग चालें जानें ।
मैं और मेरा दोस्त, इस अवस्था में, अभी भी बुरे थे: / हम जो कर सकते थे -और हम आंशिक रूप से करते थे- परिकलित पदों को बचाने के लिए था। यदि आप एक स्थिति की गणना करते हैं, तो इसे भविष्य के लिए बचाएं! वही खोज वृक्ष में छोरों के लिए जाता है। बिंदु को कुशलतापूर्वक सहेजना / पुनः प्राप्त करना था:
6 - आपके द्वारा उत्पन्न डेटा को बचाओ ... कुशलता से!
और अंत में:
7 - अधिकतम अनुकूलन वाला कोड।
यह समस्या CPU समय और मेमोरी दोनों में बेहद महंगी है। अपने कोड को बहुत कुशलता से लिखना बहुत महत्वपूर्ण है। याद रखें कि हम 35 के शाखा कारक के बारे में बात कर रहे हैं। इसका मतलब बेकार है "अगर" कहीं आपके अनुमान में, 3.3792205e+18
बेकार में बदल सकता है "अगर आपके खोज पेड़ में कहीं गहरा है।
शतरंज प्रोग्रामिंग एक बहुत ही दिलचस्प चुनौती है और यह समय है कि आप अपनी प्रोग्रामिंग क्षमताओं को एक गंभीर परीक्षा में डाल सकते हैं। कुछ और बिंदु हैं जो मैं सुझा सकता हूं लेकिन मुझे यकीन है कि आप उन्हें खुद से खोज लेंगे। और भी कई बाते जो मुझे नहीं पता लेकिन आप उन्हें इंटरनेट पर पा सकते हैं!
गुड लक और मजा करें!
ps मुझे जावास्क्रिप्ट अच्छी तरह से पता नहीं है, लेकिन कुछ मुझे समस्या की कठिनाई के आधार पर बता रहा है, हो सकता है कि C ++ की पेशकश करने वाले सभी को देखते हुए, जावास्क्रिप्ट को छोड़ना और C ++ में करना बेहतर होगा।