मैं कार्यात्मक प्रोग्रामिंग भाषा एलिक्सिर में एक साधारण मिनीमैक्स कार्यान्वयन बना रहा हूं । क्योंकि कई पूर्ण-ज्ञान वाले गेम हैं (टिक टीएसी पैर की अंगुली, कनेक्ट-चार, चेकर्स, शतरंज आदि), यह कार्यान्वयन इन खेलों में से किसी के लिए गेम एआई बनाने के लिए एक रूपरेखा हो सकता है।
हालाँकि, मैं एक समस्या का सामना कर रहा हूँ, वह यह है कि किसी कार्यात्मक अवस्था में गेम स्टेट को ठीक से कैसे स्टोर किया जाए। ये गेम ज्यादातर दो-आयामी गेम बोर्ड के साथ काम कर रहे हैं, जहां निम्नलिखित ऑपरेशन अक्सर होते हैं:
- एक विशिष्ट बोर्ड स्थान की सामग्री पढ़ें
- किसी विशिष्ट बोर्ड स्थान की सामग्री को अपडेट करें (नई चाल की संभावना वापस करते समय)
- एक या एक से अधिक स्थानों की सामग्री को ध्यान में रखते हुए जो वर्तमान स्थान से जुड़ी हुई हैं (यानी अगले या पिछले क्षैतिज, ऊर्ध्वाधर या विकर्ण भाग)
- किसी भी दिशा में कई जुड़े स्थानों की सामग्री को ध्यान में रखते हुए।
- संपूर्ण फ़ाइलों, रैंकों और विकर्णों की सामग्री को ध्यान में रखते हुए।
- बोर्ड को घुमा या मिरर करना (समरूपता की जांच करने के लिए जो पहले से गणना की गई कुछ के समान परिणाम प्रदान करता है)।
अधिकांश कार्यात्मक भाषाएँ लिंक्ड सूचियों और टुपल्स का उपयोग बहु-तत्व डेटा संरचनाओं के बुनियादी भवन ब्लॉकों के रूप में करती हैं। हालांकि, ये काम के लिए बहुत बुरी तरह से किए गए लगते हैं:
- लिंक की गई सूचियों में O (n) (रैखिक) लुकअप समय है। इसके अलावा, चूंकि हम बोर्ड पर एक ही स्वीप में 'बोर्ड को स्कैन और अपडेट' नहीं कर सकते, लिस्ट का उपयोग करना बहुत ही अव्यवहारिक लगता है।
- Tuples में O (1) (स्थिर) लुकअप समय है। हालांकि, बोर्ड को एक निश्चित आकार के ट्यूल के रूप में प्रस्तुत करना रैंकों, फाइलों, विकर्णों या अन्य प्रकार के लगातार वर्गों पर पुनरावृति करना बहुत कठिन बनाता है। इसके अलावा, दोनों अमृत और हास्केल (जो दो कार्यात्मक भाषाएं मुझे पता हैं) में एक ट्यूपल के एन वें तत्व को पढ़ने के लिए सिंटैक्स की कमी है । इससे एक गतिशील समाधान लिखना असंभव होगा जो एक मनमाने आकार के बोर्डों के लिए काम करेगा।
अमृत में एक अंतर्निहित मानचित्र डेटा संरचना (और हास्केल है Data.Map
) जो ओ (लॉग एन) (लॉगरिदमिक) तत्वों तक पहुंच की अनुमति देता है। अभी मैं एक नक्शे का उपयोग करता हूं, x, y
टुपल्स के साथ जो कुंजियों के रूप में स्थिति का प्रतिनिधित्व करता है।
यह 'काम करता है' लेकिन इस तरह से नक्शों का दुरुपयोग करना गलत लगता है, हालाँकि मुझे ठीक-ठीक पता नहीं है। मैं एक कार्यात्मक प्रोग्रामिंग भाषा में दो-आयामी गेम बोर्ड को स्टोर करने का एक बेहतर तरीका ढूंढ रहा हूं।