2008-10-11 19 views
8

के नियमों का वर्णन करने के लिए अनुशंसित डेटा प्रारूप मैं शतरंज के लिए एक शतरंज सर्वर और एक या अधिक ग्राहकों को लिखने जा रहा हूं और मैं शतरंज के नियमों का वर्णन करना चाहता हूं (उदाहरण के लिए खेल राज्य के आधार पर स्वीकार्य चाल, नियम एक प्रोग्राम पूरी तरह से एक प्रोग्रामिंग भाषा में एक खेल पूरा हो गया है। यह कुछ मुश्किल है क्योंकि कुछ शतरंज नियम (जैसे किंग कास्टिंग, एन पासेंट, 3 या अधिक बार-बार चलने वाली चालों के आधार पर ड्रॉ) न केवल बोर्ड लेआउट पर बल्कि चाल के इतिहास पर भी आधारित होते हैं।शतरंज

मैं प्रारूप पसंद करेंगे होने के लिए:

  • शाब्दिक
  • मानव पठनीय
  • एक मानक (जैसे YAML, एक्सएमएल) के आधार पर
  • भाषाओं की एक किस्म में आसानी से parsable

लेकिन मैं इनमें से किसी भी उपयुक्त समाधान के लिए बलिदान देने को तैयार हूं।

मेरा मुख्य प्रश्न यह है कि: मैं इस तरह की जटिलता के एल्गोरिदम कैसे बना सकता हूं जो डेटा प्रारूप से ऐसी जटिल स्थिति पर काम करता है?

एक फॉलोअप क्वेस्टन है: क्या आप एक समान समस्या का एक उदाहरण प्रदान कर सकते हैं जो एक शुरुआती बिंदु के रूप में कार्य कर सकता है?

संपादित करें: स्पष्टता के अनुरोध के जवाब में - मान लें कि मेरे पास पाइथन में लिखा गया एक सर्वर होगा, एक क्लाइंट सी # में लिखा गया है और जावा में लिखा गया कोई अन्य क्लाइंट। मैं नियमों को निर्दिष्ट करने से बचाना चाहता हूं (उदाहरण के लिए स्वीकार्य टुकड़ा आंदोलन, चेक के लिए परिस्थितियों, आदि) प्रत्येक स्थान पर। मैं स्वतंत्र रूप से एक भाषा में इन नियमों को एक बार निर्दिष्ट करना पसंद करूंगा।

+0

हैं आप इस इरादे के लिए विशेष रूप से बनाई गई भाषा/प्रारूप की तलाश में हैं? बोर्डजीएएमएल की तरह? (काल्पनिक) – Oddmund

+0

मैं सर्वर को नियमों को जानने और क्लाइंट द्वारा सुझाए गए अमान्य चाल को अस्वीकार करने देता हूं। – tzot

उत्तर

4

चलो सोचें। हम राज्यों और व्यवहारों के साथ वस्तुओं (स्थानों और टुकड़ों) का वर्णन कर रहे हैं। हमें वर्तमान स्थिति और वर्तमान स्थिति से स्वीकृत राज्य परिवर्तनों का एक सतत बदलते सेट को नोट करने की आवश्यकता है।

यह प्रोग्रामिंग है। आप कुछ "मेटा-भाषा" नहीं चाहते हैं जो आप नियमित प्रोग्रामिंग भाषा में पार्स कर सकते हैं। बस एक प्रोग्रामिंग भाषा का प्रयोग करें।

सामान्य भाषा में सामान्य कक्षा परिभाषाओं के साथ प्रारंभ करें। इसे सब काम करने के लिए प्राप्त करें। फिर, उन वर्ग परिभाषाओं शतरंज की परिभाषा हैं।

केवल miniscule अपवादों के साथ

, सभी प्रोग्रामिंग भाषाओं

  • शाब्दिक हैं
  • मानव पठनीय
  • यथोचित मानकीकृत
  • आसानी से अपने-अपने compilers या दुभाषिए द्वारा पार्स।

बस एक भाषा चुनें, और आप कर चुके हैं। चूंकि इसमें बारीकियों को काम करने में कुछ समय लगेगा, इसलिए आप शायद पाइथन या रुबी जैसे गतिशील भाषा के साथ जावा या सी # जैसी स्थिर भाषा के साथ खुश रहेंगे।

यदि आप पोर्टेबिलिटी चाहते हैं। एक पोर्टेबल भाषा उठाओ। यदि आप "बड़े" एप्लिकेशन में एम्बेड की गई भाषा चाहते हैं, तो, अपने "बड़े" एप्लिकेशन के लिए भाषा चुनें।


के बाद से मूल आवश्यकताओं अधूरे थे, एक माध्यमिक मामूली मुद्दा कैसे कोड है कि कई ग्राहकों के साथ संयोजन के रूप में चलाता है है।

  1. ग्राहकों को कई भाषाओं में नहीं है। एक चुनें। जावा, उदाहरण के लिए, और इसके साथ छड़ी।

  2. यदि आपके पास कई भाषाओं में ग्राहक होना चाहिए, तो आपको एक ऐसी भाषा की आवश्यकता है जिसे आप सभी तीन भाषा रन-टाइम वातावरण में एम्बेड कर सकें। आपके पास दो विकल्प हैं।

    • एक दुभाषिया एम्बेड करें। उदाहरण के लिए पायथन, टीसीएल और जावास्क्रिप्ट हल्के दुभाषिया हैं जिन्हें आप सी या सी # प्रोग्राम से कॉल कर सकते हैं। यह दृष्टिकोण ब्राउज़र के लिए काम करता है, यह आपके लिए काम कर सकता है। जावा, जेएनआई के माध्यम से इसका भी उपयोग कर सकते हैं। बीपीईएल नियम इंजन हैं जिनके साथ आप इसे आजमा सकते हैं।

    • एक दुभाषिया को एक अलग उपप्रोसेसर के रूप में स्पॉन करें। एक नामित पाइप या सॉकेट या अपने ऐप और अपने स्पॉन्डेड दुभाषिया के बीच कुछ खोलें। आपका जावा और सी # क्लाइंट पाइथन उपप्रोसेस से बात कर सकते हैं। आपका पायथन सर्वर बस इस कोड का उपयोग कर सकता है।

+0

उत्तर के लिए चीयर्स। समस्या यह है कि 1 से अधिक प्रतिनिधित्व (सर्वर + एक या अधिक क्लाइंट) होंगे जिसका अर्थ है कि एक से अधिक भाषाओं में एक से अधिक स्थानों में नियमों को एक से अधिक बार लागू करना है। तर्क त्रुटियों को ठीक करने के लिए एक से अधिक स्थान। यह कुछ है जिसे मैं टालना चाहता हूं। –

+0

"एक से अधिक भाषा" बहुत समझ में नहीं आता है। एक से अधिक मंच समझ में आता है। एक से अधिक भाषा विशिष्ट है। यही कारण है कि हमारे पास रैंडम क्लाइंट भाषा और आपके शतरंज नियम इंजन के बीच एक इंटरफ़ेस परत है। –

+0

क्षमा करें - मुझे आपको गलत समझा जाना चाहिए। मेरे पास पाइथन में लिखे गए सर्वर के साथ संचारित सी # में एक क्लाइंट लिखा गया है। ग्राहक और सर्वर दोनों को शतरंज के नियमों को जानने की आवश्यकता है। मैं दोनों जगहों पर शतरंज के नियमों को लिखने से कैसे बच सकता हूं? –

2

संपादित करें: पीढ़ी अधिक शब्दों वाले उत्तर हटा दिया गया।

संक्षिप्त उत्तर है, पायथन में नियम लिखें। सी क्लाइंट के लिए इंटरफ़ेस करने के लिए आयरन पायथन का उपयोग करें, और जावा क्लाइंट के लिए ज्योथन का उपयोग करें।

+0

यह उत्तर मेरे स्वाद के लिए बहुत ही महत्वपूर्ण है, मैंने पिछले संशोधन को प्राथमिकता दी है, शायद पहले दो अनुच्छेदों के बिना –

2

इस फॉलोअप सवाल :-)

मैं बाहर इंगित कर सकते हैं कि दस्तावेजों इसकी प्रोटोकॉल here के आसपास सबसे लोकप्रिय शतरंज सर्वरों में से एक (चेतावनी, एफ़टीपी लिंक, और निष्क्रिय एफ़टीपी समर्थन नहीं करता) उत्तर दे रहा है, लेकिन केवल पर इंटरफेस लिखने के लिए, किसी अन्य उद्देश्य के लिए नहीं। आप एक सीखने के अनुभव के रूप में इस सर्वर के लिए एक ग्राहक लिखना शुरू कर सकते हैं।

एक बात है कि प्रासंगिक है कि अच्छा शतरंज सर्वर सिर्फ एक कदम रिले से बहुत अधिक सुविधाओं की पेशकश है।

कहा कि, वहाँ एक और अधिक बुनियादी शतरंज इंजन के लिए इंटरफेस करने के लिए इस्तेमाल किया प्रोटोकॉल है, here प्रलेखित।

ओह, और जिस तरह से: Board Representation at Wikipedia

बोर्ड प्रतिनिधित्व परे कुछ भी कार्यक्रम में ही के अंतर्गत आता है, के रूप में कई पहले ही बताया है।

2

वहां पहले से ही एक व्यापक रूप से इस्तेमाल प्रारूप शतरंज के लिए विशिष्ट Portable Game Notation कहा जाता है। Smart Game Format भी है, जो कई अलग-अलग खेलों के अनुकूल है।

+0

आप इन प्रारूपों में नियमों (चाल के विपरीत) कैसे लिखते हैं? –

2

मैं नियमों वर्णन करने के लिए Prolog सुझाव है।

0

Drools एक आधुनिक मानव पठनीय नियम कार्यान्वयन है - https://www.jboss.org/drools/। उनके पास एक तरीका है कि उपयोगकर्ता Excel में अपने नियम दर्ज कर सकते हैं। एक्सेल में अन्य टूल्स की तुलना में बहुत अधिक उपयोगकर्ता समझ सकते हैं।

2

मैं प्रतिक्रियाओं से अब तक क्या एकत्रित की हैं:

शतरंज बोर्ड डेटा अभ्यावेदन के लिए:

http://en.wikipedia.org/wiki/Board_representation_(chess)) [शतरंज बोर्ड अभ्यावेदन] (

के लिए पर विकिपीडिया लेख देखें। शतरंज डेटा प्रस्तुतिकरण स्थानांतरित करें:

Portable Game Notation और 012 पर विकिपीडिया लेख देखें

यह एक प्रोग्रामिंग भाषा के उपयोग से किया जाना चाहिए:

शतरंज के लिए अभ्यावेदन नियम। एक मामले में जहां नियम एक से अधिक भाषा में लागू किया जाएगा में लिखे कोड की मात्रा को कम करना चाहता है तो उसके लिए कुछ विकल्प

  1. एक भाषा है जहां एक embedable दुभाषिया लक्ष्य भाषाओं के लिए मौजूद है का उपयोग कर रहे हैं (उदाहरण के लिए लुआ, पायथन)।
  2. एक वर्चुअल मशीन का उपयोग करें जो सामान्य भाषाएं संकलित कर सकती हैं (उदा। सी # के लिए आयरनपीथन, जावा के लिए जेपीथॉन)।
  3. उन नियमों के लिए पृष्ठभूमि डिमन या उप-प्रक्रिया का उपयोग करें जिनके साथ लक्षित भाषाएं संवाद कर सकती हैं।
  4. प्रत्येक लक्ष्य भाषा में नियमों को एल्गोरिदम लागू करें।

हालांकि मुझे एक घोषणात्मक वाक्यविन्यास पसंद आया होगा जिसे शतरंज के नियमों को लागू करने के लिए कई भाषाओं द्वारा व्याख्या की गई हो सकती है, मेरे शोध ने मुझे कोई उम्मीदवार नहीं बनाया है। मुझे संदेह है कि Constraint Based Programming एक संभावित मार्ग हो सकता है कि कई भाषाओं के लिए सॉल्वर मौजूद हैं लेकिन मुझे यकीन नहीं है कि वे वास्तव में इस आवश्यकता को पूरा करेंगे। सभी ध्यान के लिए धन्यवाद और शायद भविष्य में एक जवाब दिखाई देगा।

0

बोर्ड की वर्तमान स्थिति (महल संभावनाओं सहित) का प्रतिनिधित्व करने के लिए आप Forsyth-Edwards Notation का उपयोग कर सकते हैं, जो आपको एक लघु एसीआईआई प्रस्तुतिकरण प्रदान करेगा। उदाहरण:

 
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 

उद्घाटन बोर्ड की स्थिति होगी।

फिर स्थिति से किसी विशेष कदम का प्रतिनिधित्व करने के लिए आप numeric move notation (जैसा कि पत्राचार शतरंज में उपयोग किया जाता है) का उपयोग कर सकते हैं, जो आपको बोर्ड पर एक चाल के एक छोटे (4-5 अंकों) का प्रतिनिधित्व देता है।

नियमों का प्रतिनिधित्व करने के लिए - मुझे खुद को जानना अच्छा लगेगा। वर्तमान में मेरे शतरंज इंजन के नियम सिर्फ पायथन में लिखे गए हैं और शायद मैं जितना चाहूं उतना घोषणात्मक नहीं हूं।

0

मैं ΤΖΩΤΖΙΟΥ द्वारा छोड़ी गई टिप्पणी से सहमत हूं, जैसे। बस सर्वर को सत्यापन करने दें और ग्राहकों को संभावित कदम सबमिट करने दें। यदि ऐसा नहीं है कि आप डिज़ाइन लेना चाहते हैं, तो बस एस लॉट और अन्य द्वारा सुझाए गए पायथन में नियम लिखें।

यह वास्तव में कठिन नहीं होना चाहिए। नियम है कि, बोर्ड (कैसलिंग के राज्य पर भरोसा करते हैं अंपैसां,, जाँच ड्रॉ, शह और मात, चेक के माध्यम से गुजर, तो यह और भी इस खिलाड़ी की बारी है, आदि -
: आप तीन प्रमुख श्रेणियों में नीचे नियम तोड़ सकते हैं)
- नियम जो सभी टुकड़ों पर लागू होते हैं (एक ही वर्ग को अपने स्वयं के रंग के दूसरे टुकड़े के रूप में नहीं ले सकते हैं, एक वर्ग डब्ल्यू/प्रतिद्वंद्वी के टुकड़े == कैप्चर पर जाकर, बोर्ड से बाहर नहीं जा सकते हैं)
- नियम जो प्रत्येक व्यक्तिगत टुकड़े पर लागू होता है। (पंजे पीछे की ओर नहीं जा सकते हैं, महल तिरछे स्थानांतरित नहीं हो सकते हैं, आदि)

प्रत्येक नियम को एक समारोह के रूप में कार्यान्वित किया जा सकता है, और फिर प्रत्येक आधा कदम के लिए, वैधता यह निर्धारित करके निर्धारित की जाती है कि यह सभी मान्यताओं को पास करता है या नहीं ।

प्रत्येक संभावित कदम प्रस्तुत, तो आप सिर्फ इस क्रम में नियमों की जांच करने की आवश्यकता होगी के लिए:

  1. प्रस्तावित कदम संभावित मान्य है? (टुकड़े के लिए सही "आकार")
  2. क्या यह बोर्ड के संयम को फिट करता है? (टुकड़ा अवरुद्ध है, क्या यह किनारे से आगे बढ़ेगा)
  3. क्या चाल राज्य की आवश्यकताओं का उल्लंघन करती है? उन में से सब ठीक है, तो सर्वर कानूनी रूप कदम को स्वीकार करना चाहिए (इस कदम के बाद जांच में मैं कर रहा हूँ? मैं चेक के माध्यम से चलते हैं? कानूनी अंपैसां कब्जा है?)

...

संबंधित मुद्दे