ट्रैक
/
Crystal
Crystal
/
अभ्यास
/
शतरंज का खेल
शतरंज का खेल

शतरंज का खेल

सीखने का अभ्यास

परिचय

रेंज दो वैल्यू के बीच के अंतराल को दर्शाती हैं। जिन डेटा टाइप में रेंज का उपयोग होता है, उनमें सबसे आम Int, Char और String हैं। इनका उपयोग कई कामों के लिए किया जा सकता है, जैसे कलेक्शन को जल्दी बनाना, स्ट्रिंग को काटना, यह जाँचना कि कोई वैल्यू रेंज में है या नहीं, और इटरेशन। इन्हें रेंज ऑपरेटर .. या ... से बनाया जाता है (क्रमशः अंतिम वैल्यू को शामिल करने वाला और उसे शामिल न करने वाला)।

1..5  # A range containing 1, 2, 3, 4, 5
1...5 # A range containing 1, 2, 3, 4

दो रेंज ऑपरेटर होने का कारण यह है कि हम ऐसी रेंज बना सकें जो अंतिम वैल्यू को शामिल करें या न करें। यह तब काम आता है जब, उदाहरण के लिए, आप शून्य से शुरू होने वाले इंडेक्स के साथ काम कर रहे हों।

रेंज को Range इनिशियलाइज़र से भी बनाया जा सकता है।

Range.new(1, 5) # A range containing 1, 2, 3, 4, 5
Note

Crystal में रेंज ऑपरेटर .. या ... से रेंज बनाते समय अगर आप उस रेंज पर कोई मेथड कॉल करना चाहते हैं, तो रेंज को गोल ब्रैकेट में रखना होगा। वरना वह मेथड रेंज ऑपरेटर के दूसरे आर्गुमेंट पर कॉल हो जाएगा।

(1..5).size # => 5
1..5.size # => Error: undefined method 'size' for Int32

सबस्ट्रिंग निकालना

स्ट्रिंग को काटकर उसका कोई हिस्सा निकालने के लिए आप रेंज ऑपरेटर का उपयोग कर सकते हैं। इसके लिए सबस्ट्रिंग के शुरुआती और अंतिम इंडेक्स से एक रेंज बनाइए।

"Hello World"[0..4] # => "Hello"
"Hello World"[6..10] # => "World"

आप स्ट्रिंग के अंत से सबस्ट्रिंग निकालने के लिए ऋणात्मक इंडेक्स का भी उपयोग कर सकते हैं।

"Hello World"[-5..-1] # => "World"
"Hello World"[6..-4] # => "Wo"

रेंज के मेथड

रेंज के पास कुछ मेथड होते हैं जिनकी मदद से उन पर काम किया जा सकता है। उदाहरण के लिए, इन मेथड की मदद से रेंज की सभी वैल्यू का जोड़ निकाला जा सकता है या यह जाँचा जा सकता है कि रेंज में कोई वैल्यू शामिल है या नहीं।

मेथड विवरण उदाहरण
sum रेंज की सभी वैल्यू का जोड़ लौटाता है (1..5).sum # => 15
size रेंज का आकार लौटाता है (1..5).size # => 5
includes? अगर दी गई वैल्यू रेंज में शामिल है तो true लौटाता है, वरना false (1..5).includes?(3) # => true

अंतहीन और शुरुआत-रहित रेंज

एक रेंज अंतहीन और शुरुआत-रहित दोनों हो सकती है। ऐसी रेंज में शुरुआत या अंत की वैल्यू nil होती है, लेकिन रेंज बनाते समय nil को छोड़ा जा सकता है।

बिना शुरुआत और बिना अंत वाली रेंज तब काम आती हैं जब आप, उदाहरण के लिए, स्ट्रिंग को शुरू से या अंत तक काटना चाहते हैं।

"Hello World"[0..] # => "Hello World"
"Hello World"[4..] # => "o World"
"Hello World"[..5] # => "Hello"
Caution

अगर अंतहीन रेंज का उपयोग किसी कलेक्शन पर नहीं किया जाए और सावधानी न बरती जाए, तो यह एक अंतहीन क्रम बना सकती है।

अक्षरों की रेंज

अक्षरों का उपयोग रेंज में किया जा सकता है, जिससे आप दो अक्षरों के बीच के सारे अक्षर पा सकते हैं। उदाहरण के लिए, यह तब काम आता है जब आपको वर्णमाला चाहिए।

'a'..'z' # A range containing ['a', 'b', 'c', ..., 'z']

स्ट्रिंग की रेंज

स्ट्रिंग का उपयोग भी रेंज में किया जा सकता है, जिससे दो स्ट्रिंग के बीच की सारी स्ट्रिंग मिल जाती हैं। लेकिन जब स्ट्रिंग रेंज में एक से अधिक अक्षर उपयोग किए जाते हैं, तो इसका व्यवहार Char के व्यवहार से थोड़ा अलग होता है। जटिल स्ट्रिंग रेंज बनाते समय यह व्यवहार उलझाने वाला हो सकता है, इसलिए सावधानी बरतिए।

("aa".."az") # A range containing ["aa", "ab", "ac", ..., "az"]

निर्देश

शतरंज के एक शौकीन के तौर पर आप इस खेल का अपना वर्शन लिखना चाहते हैं। हाँ, ऑनलाइन शतरंज के बहुत से इम्प्लीमेंटेशन पहले से उपलब्ध होंगे, लेकिन आपका वाला अनोखा होगा!

सबसे पहले आप मोहरों के लिए एक बुनियादी चाल तंत्र बनाएँगे।

यह शतरंज का खेल आठ खानों चौड़े और आठ खानों लंबे बोर्ड पर खेला जाएगा। हर खाने की पहचान एक अक्षर और एक संख्या से होती है।

1. रैंक और फाइल की रेंज परिभाषित कीजिए

खेल को बोर्ड की रैंक संग्रहीत करनी होंगी। रैंक बोर्ड की पंक्तियाँ हैं, और उन्हें 1 से 8 तक क्रमांकित किया गया है।

खेल को बोर्ड की फाइलें भी संग्रहीत करनी होंगी। फाइलें बोर्ड के कॉलम हैं, और उनकी पहचान A से H तक के अक्षरों से होती है।

Chess::RANKS और Chess::FILES कॉन्स्टेंट परिभाषित कीजिए, जो क्रमशः रैंकों और फाइलों की रेंज संग्रहीत करते हैं।

Chess::RANKS
# => 1..8

Chess::FILES
# => 'A'..'H'

2. जाँचिए कि खाना मान्य है या नहीं

खेल को यह जाँचना होगा कि कोई खाना मान्य है या नहीं। कोई खाना तब मान्य होता है जब उसकी रैंक और फाइल रैंकों और फाइलों की रेंज के अंदर हों।

Chess.valid_square? मेथड परिभाषित कीजिए, जो rank और file आर्गुमेंट लेता है। rank में रैंक का int होता है और file में फाइल का char होता है। अगर रैंक और फाइल रैंकों और फाइलों की रेंज के अंदर हैं तो मेथड true लौटाता है, वरना false लौटाता है।

Chess.valid_square?(1, 'A')
# => true

3. खिलाड़ी का उपनाम निकालिए

खेल को खिलाड़ी का उपनाम निकालना होगा। उपनाम खिलाड़ी के पहले नाम के पहले दो अक्षरों और उसके अंतिम नाम के अंतिम दो अक्षरों से बनता है। उपनाम बड़े अक्षरों में होना चाहिए।

Chess.nickname मेथड परिभाषित कीजिए, जो first_name और last_name आर्गुमेंट लेता है। first_name में खिलाड़ी के पहले नाम की स्ट्रिंग होती है और last_name में उसके अंतिम नाम की स्ट्रिंग। यह मेथड खिलाड़ी का उपनाम बड़े अक्षरों वाली स्ट्रिंग के रूप में लौटाता है।

Chess.nickname("John", "Doe")
# => "JOOE"

4. चाल का संदेश बनाइए

खेल को हर चाल के लिए एक संदेश बनाना होगा, जिसमें यह बताया जाए कि किस खिलाड़ी ने किस खाने पर चाल चली। संदेश में खिलाड़ी का उपनाम और वह खाना शामिल होना चाहिए जहाँ उसने चाल चली। खेल को यह भी तय करना होगा कि चाल मान्य है या नहीं। इसके लिए वह जाँचेगा कि खाने की फाइल और रैंक फाइलों और रैंकों की रेंज के अंदर हैं या नहीं।

अगर चाल मान्य है, तो संदेश यह होना चाहिए: "{nickname} moved to {square}" अगर चाल अमान्य है, तो संदेश यह होना चाहिए: "{nickname} attempted to move to {square}, but that is not a valid square"

Chess.move_message मेथड परिभाषित कीजिए, जो first_name, last_name और square आर्गुमेंट लेता है। इनमें first_name में खिलाड़ी के पहले नाम की स्ट्रिंग, last_name में उसके अंतिम नाम की स्ट्रिंग, और square में उस खाने की स्ट्रिंग होती है जहाँ खिलाड़ी ने चाल चली। यह मेथड चाल का संदेश स्ट्रिंग के रूप में लौटाता है।

Chess.move_message("John", "Doe", "A1")
# => "JOOE moved to A1"
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Crystal Exercism

शतरंज का खेल शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Crystal को 26 कॉन्सेप्ट142 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।