नमस्ते
पिछली बार, मैंने दिखाया कि आप कैसे आसानी से और जल्दी से एक गेम "सांप" लिख सकते हैं
FBD प्रोग्रामिंग लैंग्वेज में, प्रोग्राम को कंट्रोलर में लोड करें और आखिर में हम सभी के लिए कुछ और करने के लिए प्रबंधन और बिजली और गर्मी उत्पादन के स्वत: विनियमन में शामिल
उपकरणों को मजबूर करें। कुछ "उपयोगी"।
हालांकि, उन लोगों से, जिन्हें बिजली संयंत्रों में परिचालन कर्मियों के काम का पहला ज्ञान था, मुझे एक महत्वपूर्ण टिप्पणी मिली कि "साँप" उद्देश्य कारणों से एसीएस टीपी के लिए स्पष्ट रूप से उपयुक्त नहीं है। सबसे पहले, इस तथ्य के बावजूद कि स्टेशन पर सभी स्वचालन स्वचालित प्रक्रिया नियंत्रण प्रणाली द्वारा नियंत्रित होते हैं और यह भी नियंत्रित करता है और बचाता है, जीवन की वास्तविकताएं ऐसी हैं कि ऑपरेटर को आवश्यक रूप से इसमें शीघ्र हस्तक्षेप के लिए तकनीकी प्रक्रिया की निगरानी करना भी आवश्यक है। इसलिए, खिलौना ऐसा होना चाहिए जो (पहले प्रस्तुत के विपरीत) ऑपरेटर के ध्यान को पूरी तरह से कब्जा नहीं करता है, उसे अनुप्रयोगों के बीच स्विच करने और खेल के लिए पूर्वाग्रह के बिना कुछ भी करने की अनुमति देता है। और दूसरी बात, खिलौना "साँप" स्वयं बहुत गतिशील है और बटन दबाने पर त्वरित (और उच्च स्तर पर आमतौर पर तत्काल और गहने) की आवश्यकता होती है, जिससे आसानी से एक छोटी सी त्रुटि हो सकती है: उदाहरण के लिए, खिलौने को नियंत्रित करने के बजाय, आप गलती से कुछ महत्वपूर्ण तकनीकी नियंत्रण कर सकते हैं ऐसे उपकरण जो ऑपरेशन के इस तरीके को नहीं छू सके। बेशक, कुछ भी बुरा नहीं होगा। किसी भी मामले में, संरक्षण काम करेगा, लेकिन टरबाइन को बंद करना या बायलर को सुरक्षा के साथ बंद करना, ये ऐसी चीजें हैं जो महत्वपूर्ण वित्तीय नुकसान और अनावश्यक कार्यों के कारण उन्हें वापस ऑपरेशन में डालती हैं।
यह सब स्पष्ट विचार की ओर जाता है जिसे आपको तर्क पर शांत खिलौने लागू करने की आवश्यकता होती है। एक विकल्प के रूप में - सभी प्रकार के सॉलिटेयर गेम या प्रसिद्ध "माइनस्वीपर"। इस तथ्य के कारण कि सभी प्रकार के सोलिटेयर को उन कार्डों की छवियों की आवश्यकता होती है जो तुरंत इंटरनेट पर नहीं पाए गए थे (बेशक, कार्ड के चित्र खोजने में आसान हैं, लेकिन मुझे आकार और गुणवत्ता, साथ ही कार्ड के डिजाइन के लिए विशेष आवश्यकताएं थीं), इसे
सैपर खिलौने को लागू करने का निर्णय लिया गया था।
इसके अतिरिक्त, इस विशेष खेल के कार्यान्वयन में एक और महत्वपूर्ण कारण है। अर्थात्, एक बार फिर एफबीडी में प्रोग्राम करना कितना आसान और मजेदार है।
कुछ परिचयात्मक शब्द
लेकिन पहले, कुछ परिचयात्मक शब्द (उन लोगों के लिए जो पढ़ने के लिए बहुत थक गए नहीं हैं)।
शायद हर कोई जो इस पोस्ट को अंत तक पढ़ता है, वह कहेगा (या लगता है): “बकवास! हां, मैं कोड की 30 पंक्तियों में सी (सी ++, डेल्फी, जेएस, आदि) में एक ही बात लिखूंगा। " और मैं इससे सहमत हूं। लेकिन एक बात है। इससे पहले कि आप कोड की 30 लाइनों की उच्च-स्तरीय भाषा में कुछ भी लिखें, आपको बस जरूरत है
यह उच्च स्तरीय भाषा सीखें।
और कोई भी FBD पर प्रोग्राम लिखना शुरू कर सकता है। इसके अलावा, मूल FBD प्रोग्रामिंग कौशल पूर्वस्कूली बच्चों को सिखाया जाता है।
मुझे लगता है कि कई लोग बचपन में कैसे याद करेंगे ...... पत्र क्यूब्स से शैक्षिक खेल की आड़ में उन्होंने शब्द एकत्र किए:
उदाहरण के लिए, अक्षरों से ... दूसरे शब्दों में, FBD प्रोग्रामिंग सरल और सहज है।
छोटी टिप्पणीयहां मैं कहता हूं कि FBD पुरानी आदत से बाहर है, हालांकि इस सब के मुख्य डेवलपर्स में से एक के अनुसार:
Deranged , 20 दिसंबर, 2013 को 12:25 पर
यह FBD नहीं है। संरचनाओं सहित डेटा प्रकारों के लिए समर्थन है। डेटा को संभावित (तात्कालिक मूल्य) और कमांड (बफ़र्ड मान) में भी विभाजित किया गया है। मूल्यों की गुणवत्ता के लिए अंतर्निहित समर्थन भी है। प्रतिक्रियाएं की जा सकती हैं, वे एक ज़ेबरा द्वारा प्रतिष्ठित हैं। इस मामले में, डेटा प्रकार के डिफ़ॉल्ट मानों को प्रारंभिक मान के रूप में लिया जाता है (प्रकार में निर्धारित)।
सामान्य तौर पर, हर चीज का एक वैगन होता है, मैंने स्थितियों के लिए संबंधों और समर्थन के रूप में निष्पादन आदेश के नियंत्रण को आगे बढ़ाने की योजना बनाई। फिर एफबीडी, एसएफसी और पारंपरिक फ्लोचार्ट का पूर्ण फ्रेंकस्टीन होगा।
बेशक, इस भाषा के लिए गंभीर एल्गोरिदम हैं, नियंत्रक संसाधनों के लिए संघर्ष, तकनीकी कार्यक्रम निष्पादन का अनुकूलन, मेमोरी ऑप्टिमाइज़ेशन और समग्र प्रदर्शन। स्मार्ट लोग सरलतम ब्लॉकों से सही एल्गोरिदम बनाने के लिए पहेली बनाते हैं। लेकिन कब से चूंकि यह लेख पूरी तरह से प्रकृति में खोजपूर्ण है, इसलिए हम इन सभी सूक्ष्मताओं को छोड़ देंगे और अंत में सीधे प्रोग्रामिंग में ही जाएंगे।
लेकिन उससे पहले त्वरित बुद्धिमत्ता पर थोड़ा सवाल। कौन अनुमान लगाएगा - "सम्मान और सम्मान", अधीर के लिए - जवाब नीचे स्पॉइलर में है।
तो - खेल "साँप" और खेल "माइनस्वीपर" FBD में प्रोग्रामिंग के संदर्भ में एक और एक ही खेल है। क्यों? और उनके पास क्या है जो इस तरह के बयान की अनुमति देता है?
जवाब हैसब कुछ बहुत सरल है। खेल "स्नेक" और खेल "माइन्सवेपर" दोनों में कोशिकाओं से मिलकर एक क्षेत्र है। बस इस क्षेत्र की कोशिकाएँ अलग-अलग मान लेती हैं और अलग-अलग प्रदर्शित होती हैं। यही है ... दूसरे शब्दों में, हम गेम प्रोग्राम "स्नेक", इसके ग्राफिकल इंटरफ़ेस, और आधे घंटे या एक घंटे में इसे सभी गेम "माइनस्वीपर" में रीमेक कर सकते हैं, क्योंकि वास्तव में हमें केवल एक एल्गोरिथ्म को बदलना है और क्षेत्र के एक सेल को फिर से बनाना है।
प्रोग्रामिंग शुरू करें
इसलिए, हम अपने कार्य को शुरू करना चाहते हैं।
मेरी व्यक्तिगत राय है कि 80% FBD प्रोग्रामिंग स्पष्ट रूप से कल्पना करना है कि हम अंत में क्या प्राप्त करना चाहते हैं। और इसलिए केवल हम इस तरह की समझ हासिल करते हैं, फिर 80% कार्य हल हो जाते हैं और कोड को स्केच करने और इसे कंघी करने के लिए शाब्दिक रूप से थोड़ा काम है। अब मैं व्यवहार में इस सिद्धांत को प्रदर्शित करने का प्रयास करूंगा।
मान लें कि हमारे पास "साँप" 20x20 कोशिकाओं के साथ सादृश्य द्वारा "सैपर" के लिए एक क्षेत्र है। इसलिए, हमें 400 मेमोरी कोशिकाओं की आवश्यकता है, जिनमें से प्रत्येक में क्षेत्र के प्रत्येक सेल को संसाधित किया जाएगा। कार्यक्रम की संरचना करने के लिए, हम सभी कोशिकाओं को पंक्तियों में तोड़ते हैं। इस प्रकार, हमें बीस पंक्ति एल्गोरिदम की आवश्यकता है, जिनमें से प्रत्येक में 20 सेल एल्गोरिदम शामिल होंगे। यानी हम कार्यक्रम के मूल को समझने आए हैं।
एल्गोरिथ्म "स्ट्रिंग"
स्ट्रिंग एल्गोरिथ्म पर अधिक विस्तार से विचार करें। या यों कहें कि इनपुट के लिए हमारे पास कौन सा डेटा होना चाहिए और इस एल्गोरिदम के आउटपुट में कौन सा डेटा है। मैं अंत से शुरू करने का सुझाव देता हूं - अर्थात आउटपुट से।
एल्गोरिदम आउटपुट
- सबसे पहले, हमें एक आउटपुट डेटा लाइन की आवश्यकता होती है, जो प्रत्येक मशीन की स्थिति को मानव-मशीन इंटरफ़ेस (या अधिक बस ऑपरेटर स्टेशन में) में प्रस्तुत करने के लिए निर्धारित करती है।
- दूसरी बात, हमें एक वेक्टर की जरूरत है जिसमें दिखाया गया है कि कौन से सेल में बम हैं और कौन से सेल सुरक्षित हैं।
- तीसरा, हमें एक संकेत की आवश्यकता है कि खिलाड़ी बम के साथ मैदान पर "कदम" रखता है और खेल खो जाता है, चलो इस निकास को "Big_Bada_Boom" कहते हैं।
- चौथा, सुविधा के लिए, "सैपर" में एक चिप होता है, जब यह एक सेल को हिट करता है जिसमें एक बम के साथ एक पड़ोस नहीं होता है, सभी खाली सेल जो इसे स्वचालित रूप से खोलते हैं। यानी हमें एक आउटपुट की आवश्यकता है जो प्रोग्राम द्वारा स्वयं "सेल खोलने" के लिए विपरीत कमांड भेजता है।
- पांचवें, एल्गोरिथ्म के लिए बम स्थापित करने के लिए, हमें एक आउटपुट की आवश्यकता है, जिसमें दिखाया गया है कि इस पंक्ति में कितने बम हैं। बेशक, यह मान सीधे खंड 2 में वर्णित वेक्टर से प्राप्त किया जा सकता है, यह केवल सभी नॉनजेरो बिट्स को जोड़ने के लिए पर्याप्त है। लेकिन सुविधा के लिए, हम इस फ़ंक्शन को मैक्रो के अंदर जोड़ देंगे।
- छठा, आंकड़ों के लिए, हमें यह जानना होगा कि पंक्ति में कितनी अधिक बंद कोशिकाएं बची हैं।
हम सभी को सैपर गेम की पूर्ण कार्यक्षमता की आवश्यकता है।
डेटा के साथ केवल 6 आउटपुट।
अब आइए इस बारे में सोचें कि हमें जिस आउटपुट की आवश्यकता है, उसे बनाने में सक्षम होने के लिए प्रवेश द्वार पर क्या होना चाहिए।
एल्गोरिथ्म इनपुट
- यह मानना तर्कसंगत है कि एल्गोरिथ्म का मुख्य इनपुट ओपन सेल प्लेयर से एक कमांड है। आखिरकार, यह खेल का मुख्य अर्थ है।
- प्रोग्रामिंग की स्पष्टता के लिए, हम एक और इनपुट का उपयोग करते हैं - "सेल पर ध्वज लगाएं", जो इंगित करता है कि एक बम है और गलती से इस सेल पर क्लिक नहीं करता है और फट जाता है।
- प्रत्येक सेल की स्थिति बनाने के लिए (और हमें याद है कि अगर सेल में कोई बम नहीं है, तो यह दिखाता है कि कितने बॉर्डर इसकी सीमा में हैं), आपको ऊपर की रेखा और नीचे की रेखा से वैक्टर शुरू करने की आवश्यकता होगी। आइए एल्गोरिथ्म को सार्वभौमिक बनाते हैं और तीन इनपुट जोड़ते हैं: वर्तमान के ऊपर एक पंक्ति में बम के साथ एक वेक्टर के लिए एक इनपुट, वर्तमान पंक्ति में बम के साथ एक वेक्टर के लिए एक इनपुट और वर्तमान के नीचे एक पंक्ति में बम के साथ वेक्टर के लिए एक इनपुट।
- एक नया खेल शुरू करने और कोशिकाओं के मूल्यों को फिर से लिखने के लिए, तार्किक इनपुट "नया गेम" जोड़ें।
- जैसा कि पहले उल्लेख किया गया है, यदि सेल खाली है और आस-पास बमों के साथ कोई सेल नहीं हैं, तो पड़ोसी कोशिकाओं को स्वचालित रूप से खोलना चाहिए। इसके लिए "ओपन विद प्रोग्राम" इनपुट जोड़ें।
- खैर, निश्चित रूप से, यह बिना खनन क्षेत्र के किस तरह का खेल है। तो हम "बम स्थापित करें" प्रविष्टि की आवश्यकता है।
कुल 8 इनपुट।
कार्यक्रम के मुख्य एल्गोरिथ्म से हमें इसकी आवश्यकता है।
हम अपने इनपुट और आउटपुट के साथ मैक्रो को जल्दी से भरते हैं और इस एल्गोरिथ्म को प्राप्त करते हैं:

या यदि आप इसे प्रकट करते हैं:

अब हमारे एल्गोरिथ्म को अर्थ से भरें। जैसा कि मैंने पहले ही कहा, हमारे मुख्य एल्गोरिथ्म को भरने का मूल "मेमोरी सेल" मैक्रो है, जो 20 टुकड़े होंगे।
मेमोरी सेल एल्गोरिदम
आइए इस पर विचार करने की कोशिश करें कि खेल क्षेत्र के प्रत्येक सेल से हमें "सैपर" की क्या आवश्यकता हो सकती है, और इसके लिए हमें एक मैक्रो सबमिट करने की आवश्यकता है। चलो फिर से शुरू करते हैं, अर्थात्। बाहर निकलने से। और जब हम सभी डेटा तैयार करते हैं जो हमें चाहिए, तो यह स्पष्ट हो जाएगा कि इसे प्राप्त करने के लिए हमें इनपुट में क्या होना चाहिए।
एल्गोरिदम आउटपुट
- सबसे पहले, सेल में इस सेल की स्थिति दिखाने वाला आउटपुट होना चाहिए। क्या आपने कभी सोचा है कि एक सैपर गेम में एक क्षेत्र के प्रत्येक सेल कितने राज्यों को ले सकता है?
फील्ड सेल राज्योंउत्तर 12. यह मामला है - 12 अलग-अलग सेल मैपिंग के अनुरूप 12 राज्य।
मैंने उन्हें निम्नानुसार एन्कोड किया:
-1 - सेल बंद है।
0-8 - सेल खुला है और पड़ोसी कोशिकाओं में बमों की संख्या दिखाता है।
9 - सेल खुली है और उसमें एक बम था।
10 - सेल बंद है और उस पर एक झंडा लगा हुआ है।
- अलग-अलग, गणना और अन्य प्रसंस्करण के लिए, हम तर्क आउटपुट "सेल बंद" और "बम सेल में स्थापित है।"
- जैसा कि पहले ही उल्लेख किया गया है - यदि एक खाली सेल खोला जाता है, तो इसे स्वचालित रूप से पड़ोसी कोशिकाओं को खोलना चाहिए। तदनुसार, हमें अभी भी तार्किक संकेत "ओपन पड़ोसी" की आवश्यकता है।
- ठीक है, अंत में, अगर खिलाड़ी ने गलती की और बम के साथ मैदान पर "कदम रखा", तो यह तार्किक संकेत बनाने के लिए आवश्यक है कि खेल खो गया है। चलो इसे "Bada_Boom" कहते हैं।
कुल 5 निकास।
एल्गोरिथ्म इनपुट
आइए यह निर्धारित करने का प्रयास करें कि आवश्यक आउटपुट बनाने के लिए हमें क्या चाहिए।
- सबसे पहले, एल्गोरिथ्म को प्लेयर "ओपन फील्ड" से एक कमांड प्राप्त करना चाहिए।
- सादगी के लिए, एक अलग टीम के रूप में, हम यहां "सेट ए फ्लैग" कमांड भी सेट करते हैं।
- जैसा कि मैंने पहले कहा था - क्षेत्र के प्रत्येक सेल को पता होना चाहिए कि पड़ोसी कोशिकाओं में कितने बम लगाए गए हैं। हमारे पास इसके लिए "पड़ोसी" नामक एक अलग प्रवेश द्वार है।
- बम की शुरुआत को बेतरतीब ढंग से स्थापित करने के लिए, आपको तार्किक संकेत "यहां बम है" चाहिए, जिसके द्वारा सेल का खनन किया जाएगा।
- खैर, निश्चित रूप से, एक नया गेम शुरू करने के लिए, एक रीसेट संकेत होना चाहिए जो कोशिकाओं में सभी जानकारी को रीसेट करता है।
हम इस मैक्रो को सामान करते हैं और निम्नलिखित एल्गोरिथ्म प्राप्त करते हैं:

अब हम स्वयं मेमोरी सेल एल्गोरिथ्म को प्रोग्राम करते हैं। यह बेहद सरल है:

एल्गोरिथ्म के सिद्धांत का एक संक्षिप्त विवरण- पड़ोसियों की स्थिति से बना एक वेक्टर "BitDescipher1" algoblock पर आता है, जो इस एल्गोरिथ्म का उपयोग करके अनपैक्ड है, और फिर वेक्टर में इकाइयों (बमों) की संख्या की गणना "Slug1" aloboblock पर की जाती है। सवाल तुरंत उठता है: क्यों 9 बिट्स है, जब सेल में केवल 8 पड़ोसी अधिकतम हैं। उत्तर है: बहुमुखी प्रतिभा के लिए। तथ्य यह है कि, जैसा कि बाद में देखा जाएगा, मैंने प्रत्येक सेल में पड़ोसियों को खोजने के लिए एक और मैक्रो लिखा। और सभी मामलों के लिए मैक्रो को सार्वभौमिक बनाने के लिए (और एक सेल में केवल 8 पड़ोसी नहीं हो सकते हैं जब यह क्षेत्र के केंद्र में है, लेकिन केवल 3 जब यह कोने में है, या 5 जब यह मैदान के किनारे पर है) नौ बिट्स टैप करें।
- ट्रिगर "RStrig1" का उपयोग सेल पर "ध्वज" को सेट और रीसेट करने के लिए किया जाता है। पहला कमांड ट्रिगर को कॉक करता है, और दूसरा कमांड रीसेट करता है। जैसा कि आप आरेख से देख सकते हैं, एक कॉक्ड ट्रिगर "I2" एल्बॉब पर "ओपन" कमांड के पारित होने को रोकता है ट्रिगर आउटपुट से मूल्य व्युत्क्रम के साथ "और" एल्गोरिथ्म के इनपुट पर सेट है। यानी जबकि ट्रिगर को कॉक किया गया है, "गलत" एल्गोरिथ्म के दूसरे इनपुट पर आता है और पहले इनपुट के मूल्य की परवाह किए बिना "एंड" एल्गोरिथ्म का आउटपुट भी "गलत" है। यह पता चला है कि "ओपन" कमांड "आरएस 2" ट्रिगर को रीसेट नहीं कर सकता है और हम गलती से एक सेल खोलने के खिलाफ बीमित होते हैं जिसे हम खोलना नहीं चाहते हैं।
- "RS2" ट्रिगर सेल की स्थिति बनाने का कार्य करता है: क्या यह बंद या खुला है। जैसा कि आप आरेख से देख सकते हैं, ट्रिगर को रीसेट कमांड (एक नए गेम की शुरुआत) द्वारा कॉक किया गया है और ओपन कमांड आने पर ही रीसेट किया जाता है।
- ट्रिगर “RS1” का उपयोग इस सेल में बम की उपस्थिति को इंगित करने के लिए किया जाता है। यह "जब यहां बम है" कार्यक्रम से आता है, तो यह कार्यक्रम से आता है, जो सेल में बम सेट करता है और एक नया गेम शुरू होने पर रीसेट किया जाता है।
- "I3" एल्गोरिथ्म इस योजना में सबसे महत्वपूर्ण है। "RS1" ट्रिगर (बम यहां स्थापित किया गया है) और इस सेल में "ओपन" कमांड के आने से इसका मान AND द्वारा जुड़ जाता है। यदि दोनों शर्तें पूरी होती हैं, तो आउटपुट पर "ट्रू" बनता है, जिसका अर्थ है कि खिलाड़ी ने बम के साथ मैदान पर कदम रखा है। यह मान "Bada_Boom" के आउटपुट को खिलाया जाता है, जो तब "Big_Bada_Boom" के आउटपुट पर सभी कोशिकाओं से एकत्र किया जाता है और नुकसान का मतलब होता है।
- कैस्केड में व्यवस्थित तीन "च्वाइस" एल्गोरिदम कोशिका की स्थिति बनाते हैं। "च्वाइस 1" एल्गोरिथ्म पर, यह बनता है कि यदि सेल खोला जाए तो आउटपुट क्या होगा: संख्या "0-8" पड़ोस में कोशिकाओं में बमों की संख्या के अनुसार, या खनन सेल के अनुरूप संख्या "9"। यदि फ़ील्ड अभी भी बंद है ("RS2" ट्रिगर को कॉक किया गया है), तो "-1" एल्गोरिथ्म "-1" पर सेट है, जो कि हम पहले सहमत थे, बंद सेल की स्थिति से मेल खाती है। यदि फ़ील्ड बंद है ("RS2" ट्रिगर को कॉक किया गया है) और उसी समय ("I4" एल्गोरिथम) "Trig1" ट्रिगर को कॉक किया गया है, तो "च्वाइस 3" एल्गोरिथ्म पर मान को जबरन सेट फ्लैग के समान "10" में बदल दिया जाता है।
- नवीनतम तुलना एल्गोरिदम का उपयोग स्वचालित रूप से पड़ोसी कोशिकाओं को खोलने के लिए किया जाता है। यदि हमें "Vybry3" आउटपुट पर शून्य मिला, तो खिलाड़ी ने सेल खोला, जिसके आगे कोई बम नहीं हैं। फिर एक टीम को पड़ोसी कोशिकाओं को खोलने के लिए भेजा जाता है।
यह आदिम एल्गोरिथम पूरे खेल का आधार है। केवल कुछ कंबाइनिंग प्रोग्राम और डोपिलिवैनिया कार्यक्षमता थे।
अब 20 "मेमोरी सेल्स" से मिलकर मैक्रो "स्ट्रिंग" शुरू करते हैं।
स्वयं मैक्रो और विवरण। चित्र बड़ा है।
मैक्रो अपने आप में बेहद सरल है। 20 एल्गोरिदम "मेमोरी सेल" एक आम मैक्रो के इनपुट और आउटपुट के साथ जुड़ा हुआ है। सेल की स्थिति के लिए, यह संबंध सीधे चला जाता है, बाकी के लिए - या तो "बिटशिफ्टर" एल्गोरिदम के माध्यम से एक वेक्टर में तार्किक मानों को पैक करने के लिए, या एक पंक्ति में आवश्यक तत्वों की संख्या की गणना करने के लिए या "या" एल्गोरिथ्म के माध्यम से पड़ोसी कोशिकाओं को खोलने के लिए आउटपुट कमांड उत्पन्न करने के लिए या अंत के माध्यम से। खेल ("Big_Bada_Boom")।
विशेष ध्यान केवल "ओपन", "वेक्टर के परिवर्तन" और "ओपन पड़ोसियों" पर ध्यान दिया जाता है।
हम प्रत्येक ऐसे ब्लॉक को अलग से मानते हैं।
चलो ब्लॉक से शुरू करते हैं: खोलें
यह देखना आसान है कि यहां वे खिलाड़ी और प्रोग्राम से "ओआर" कमांड को जोड़ते हैं, जब यह एक खाली सेल के पड़ोसियों को खोलता है।
आइए ब्लॉक पर विचार करें: वेक्टर परिवर्तन
विचार बहुत सरल है। तीन वैक्टर हमारे पास आते हैं और हमें यह गणना करने की आवश्यकता होती है कि प्रत्येक खदान एक विशिष्ट स्थिति में कितने सेल को घेरे हुए है। ऐसा करने के लिए, मेरा इरादा बस वेक्टर को दाईं ओर (स्थिति - 2) में स्थानांतरित करना है और शिफ्ट के बाद प्रत्येक वेक्टर के पहले तीन बिट्स में लोगों की संख्या को गिनना है। लेकिन फिर मैं एक मजेदार बात पर आया। लेकिन क्या होगा यदि कोशिका की स्थिति पहले है? फिर, बाकी के साथ सादृश्य द्वारा, मुझे वेक्टर को एक नकारात्मक मूल्य से स्थानांतरित करना होगा (यानी सही नहीं, लेकिन बाएं)। बेशक, बाईं ओर चले गए सभी बिट शून्य होंगे, लेकिन गिनती के सामान्य सिद्धांत को संरक्षित किया जाएगा। हालांकि, एल्गोरिथ्म के कार्यान्वयन की सूक्ष्मताओं ने इसकी अनुमति नहीं दी, इसलिए मुझे एक अलग प्रसंस्करण करने के लिए सेल की स्थिति पर और सेल की पहली स्थिति के लिए एक चेक लगाना पड़ा। तथ्य की बात के रूप में, यह प्रसंस्करण केवल वर्तमान लाइन में दूसरी बिट और सभी लाइनों में तीसरे बिट्स को संसाधित करने में शामिल है। याद रखें, मैंने लिखा था कि मानक मैक्रो के लिए मुझे 9 बिट्स पड़ोसियों के रूप में बनाने की आवश्यकता थी, और 8 नहीं, जैसा कि तर्क द्वारा आवश्यक है। यह इस स्थिति के ठीक कारण है।
सबसे अधिक चौकस पाठकों ने पहले ही ध्यान दिया है कि यहां एक स्पष्ट रूप से अनावश्यक ऑपरेशन किया जा रहा है। मुझे पड़ोसियों का वर्णन करने वाले बिट्स मिलते हैं, उन्हें एक वेक्टर में पैक करते हैं, और फिर उन्हें अनपैक करते हैं और फिर से जोड़ते हैं। यानी पैकिंग और अनपैकिंग ऑपरेशन स्पष्ट रूप से बेमानी हैं। लेकिन मैंने डिबगिंग और विज़ुअलाइज़ेशन के लिए इस विकल्प को छोड़ दिया।
आइए ब्लॉक पर विचार करें: पड़ोसी खोलें
यहां, सामान्य तौर पर, सब कुछ बहुत सरल है। यदि सेल खाली है, तो इसे एक नहीं, बल्कि 8 पड़ोसी कोशिकाओं के रूप में खोलना चाहिए। जीवन के एकीकरण और सरलीकरण के लिए, इसे 8 पड़ोसी कोशिकाएं न खोलें, लेकिन 9 (हाँ, और स्वयं भी। एफबीडी भाषा में, कभी-कभी सबसे सरल धारणा भी, जो कार्यक्रम के काम या संसाधनों को प्रभावित नहीं करती है, जीवन को बहुत सरल बना देती है)। इस प्रकार, मैक्रो एल्गोरिदम सरल है। हम सेल की स्थिति की जांच करते हैं। यदि सेल दूसरे या अधिक पदों पर है, तो हम पहले लगातार बिट्स से वेक्टर बनाते हैं और उन्हें शिफ्ट करते हैं (याद रखें, वेक्टर के प्रसंस्करण के साथ सादृश्य द्वारा, न केवल दाईं ओर, बल्कि बाईं ओर, क्योंकि हम वेक्टर के कुछ हिस्से को शुरुआत में नहीं लाते हैं, लेकिन इसके विपरीत, हम प्रारंभिक वेक्टर को उस भाग से स्थानांतरित करते हैं जिसकी हमें आवश्यकता है) (स्थिति -2)। यदि हमारे पास पहला सेल है, तो हम दो बिट्स के प्रारंभिक वेक्टर बनाते हैं और इसे (स्थिति -1) = 0 अर्थात द्वारा स्थानांतरित करते हैं। वास्तव में कहीं नहीं जा रहा है।
फिर हमें बस "ओआर" के अनुसार सभी तैयार वैक्टर को जोड़ना होगा और उन्हें मुख्य आउटपुट देना होगा।
मैं एक और मैक्रो का भी उल्लेख करना चाहूंगा। खेल शुरू करने से पहले, हमें क्षेत्र में बेतरतीब ढंग से खानों को रखने की आवश्यकता है। लेकिन क्या होगा अगर कोई यादृच्छिक संख्या जनरेटर नहीं है और "रैंडम" कमांड उपलब्ध नहीं है। बेशक, इंटरनेट पर छद्म यादृच्छिक क्रम उत्पन्न करने के लिए कई एल्गोरिदम हैं। लेकिन वे काफी जटिल हैं और अपने आप में उनका कार्यान्वयन एक अलग लेख के हकदार हैं।
इसलिए, मुझे सामान्य तरीके से जाना था और एक मैक्रो "रैंडम जेनरेटर" बनाना था।
मैक्रो कैसे काम करता है का एक संक्षिप्त विवरण, . तो ठीक है। !
, .
( « » « »). «» , . , . ( 4-5 , 6-7 ). . 1000000 100. [0..100). , 100, . [1..20], 5 ( «3»), . — 100, [0..19]. . . , « » , , 4-7 , , .
हम सभी हिस्सों को एक साथ जोड़ते हैं और सुंदरता जोड़ते हैं
तो, हमारे कार्यक्रम के सभी भाग तैयार हैं। हम उन्हें एक साथ जोड़ते हैं और स्ट्रैपिंग करते हैं:मुख्य कार्यक्रम आकर्षित करना। थोड़ा स्पष्टीकरण— — «1» . , «» «_» «SR2» «_» , .
«1» «RS1» («Game_over» — , , «RS3» («Victory»), , .. . «1» ( , ).
( «1») ( ) «RS2» («_»), . यानी , «_Random» «» «», «RS1» « ».
. , «1», «SR2» .
36-40 . 0 400 . , , .
. . «RS1» («Game_over») , «RS3» («Victory»).
2 :
«2». . «2» ( ) . यानी (.. , , ) . , .
«1» , . . 400. 400, , .
.
हम ग्राफिक इंटरफ़ेस को तेज करते हैं
यह सिर्फ कुछ मिनटों में किया जाता है। सेल के लिए 12 चित्र खींचे गए हैं (मैंने इसके लिए पेंट का इस्तेमाल किया है) और उनका प्रदर्शन सेल की स्थिति के आधार पर सेट किया गया है। फिर इस सेल को 400 बार कॉपी किया जाता है (डरने की कोई आवश्यकता नहीं है, क्योंकि 400 सेल सिर्फ नौ ऑपरेशन Ctrl + c - Ctrl + v) हैं और आपको एक माइनफ़ील्ड मिलता है। हम इंटरनेट पर पाते हैं कि पहली छवि जो "सैपर" के लोगो के लिए सार्थक है। हम टाइमर डिस्प्ले और "न्यू गेम" बटन को फास्ट करते हैं।और अब सबसे कठिन हिस्सा खेल में जीत और हार के लिए चित्रों का चयन करना है। तब मुझे "परमाणु विस्फोट" और "विजय" के अनुरोधों के लिए खोज इंजन में पहली तस्वीरें मिलीं। और यह बात है - खेल तैयार है।हारी
: , , , .
संक्षेप में कहना
जो कोई भी इस पोस्ट को पूरी तरह से लागू करने में सक्षम था, उसने शायद यह देखा कि हमने एक सरल, लेकिन अभी भी "हैलो, वर्ल्ड!" प्रोग्राम नहीं लिखा है, और साथ ही हमें प्रोग्रामर के मंचों पर बैठने के लिए बिल्कुल किसी भी निर्देशिका, सहायता की आवश्यकता नहीं है, धूम्रपान मैनुअल आदि। सभी की जरूरत थी, हमें कुछ घंटों में पता चला (और व्यक्तिगत रूप से, ज्यादातर समय मैंने चित्रों के लिए एल्गोब्लॉक की एक सुंदर व्यवस्था पर बिताया), इसके अलावा, घटाव, गुणन और तर्क एल्गोरिदम "और", "या" के एल्गोरिदम का उपयोग करते हुए, जो एक छात्र के लिए भी स्पष्ट थे। साथ ही कुछ सरलतम आरएस-ट्रिगर शामिल हैं। कार्यक्रम में उपयोग किया जाने वाला सबसे जटिल एल्गोरिथ्म "इंटीग्रेटर" है। और फिर हमने इसे फीडबैक और बॉर्डर चेकिंग के साथ एक योजक के रूप में उपयोग किया। यानी
वास्तव में, आप इंटीग्रेटर को "अतिरिक्त" एल्गोरिथ्म और दो "तुलना" एल्गोरिदम के साथ बदल सकते हैं।दूसरे शब्दों में, FBD पर प्रोग्रामिंग सरल और मजेदार है, और प्रारंभिक स्तर पर, बुनियादी तर्क को समझने के अलावा किसी भी ज्ञान या कौशल की आवश्यकता नहीं है। मुख्य बात अंतिम परिणाम का एक स्पष्ट विचार है। यदि यह है, तो कार्यक्रम ही इसका तार्किक निष्कर्ष है। यदि, हालांकि, "अभी तक हम क्या प्राप्त करना चाहते हैं" अभी तक प्रस्तुत नहीं किया गया है, तो शायद यह अधिक स्पष्ट रूप से कार्य को तैयार करने के लायक है। मुझे तुरंत कहना होगा कि उपरोक्त सभी एफबीडी पर लागू सभी परियोजनाओं पर लागू नहीं होते हैं, लेकिन सरल छोटे कार्यों के लिए, जैसे कि हमारे उदाहरण में दिए गए। क्योंकि
हज़ारों संकेतों वाली विशाल परियोजनाओं के लिए, यह संभव नहीं है कि यह सब सिर में जोड़ा जाए। लेकिन इस मामले में भी, एक बड़ी परियोजना को छोटे उप-प्रकारों में विभाजित किया जाता है, जहां हमारा दृष्टिकोण पहले से ही पूरी तरह से लागू हो रहा है (ज़ाहिर है, परियोजना के लिए सामान्य आवश्यकताओं को ध्यान में रखते हुए)।क्योंकि
एफबीडी भाषा सार्वभौमिक है और हमने सरलतम एल्गोरिदम का उपयोग किया जो कार्यक्रम में किसी भी कार्यान्वयन के लिए बुनियादी हैं, फिर इस कार्यक्रम को घरेलू और विदेशी दोनों (जैसे सीमेंस या एबीबी से नियंत्रक), किसी भी नियंत्रक पर न्यूनतम प्रयास के साथ पुन: प्रस्तुत किया जा सकता है।इससे जो असत्य रहता है
क्लासिक सैपर गेम के तीन कार्य अनारक्षित रहे।
पहली सेटिंग में फ़ील्ड के आकार को सेट करने की क्षमता है। यह आसानी से हो जाता है। तथ्य की बात के रूप में, बस "मेमोरी सेल" एल्गोरिदम को कॉपी किया जाता है क्योंकि क्षेत्र में कई बार सेल होते हैं। केवल एक समस्या है: गतिशील स्मृति की कमी, अर्थात्। किसी भी डेटा को जोड़ने या हटाने के लिए "फ्लाई पर" असमर्थता। और इससे एक सरल निष्कर्ष इस प्रकार है - बदलते क्षेत्र के आकार को बनाना बहुत सरल है - पहले आपको अधिकतम फ़ील्ड आकार के लिए कार्य को प्रोग्राम करने की आवश्यकता है, और उसके बाद केवल निष्क्रिय कोशिकाओं के लिए तार्किक विशेषता सेट करें, जो कि इस विशेषता द्वारा ग्राफिकल इंटरफ़ेस में प्रदर्शित नहीं किया जाएगा और खेल के दौरान संसाधित नहीं किया जाएगा।
दूसरा पहला क्लिक पर सेल का प्रतिस्थापन है, अगर बम मूल रूप से इसमें था। यानी हमारे प्रोग्राम में, विंडोज में "सैपर" के विपरीत, पहले क्लिक पर खोने का मौका है। यह भी आसानी से किया जाता है, यह "Game_over" ट्रिगर और बंद कोशिकाओं की संख्या के लिए प्राप्त संकेत की जांच करने के लिए पर्याप्त है। यदि हमारे पास बंद कोशिकाओं की संख्या 399 है और "Game_over" ट्रिगर को कॉक करने के लिए एक सिग्नल आया है, तो आपको इस सिग्नल को ब्लॉक करने की आवश्यकता है, उस सेल को रीसेट करें जिस पर क्लिक किया गया था और एल्गोरिथ्म को बेतरतीब ढंग से दूसरी खदान को स्थापित करने के लिए चलाया गया था, जबकि खदान को पहले से ही खोलने की क्षमता को अवरुद्ध करते हुए। सेल।
खैर, जैसा कि आप विवरण से देख सकते हैं, आंकड़े इकट्ठा करने का कार्य लागू नहीं किया गया है। यानी सबसे अच्छा परिणाम याद नहीं है, रिकॉर्ड सेट करने वाले व्यक्ति का नाम। जीत और हार आदि का अनुपात। लेकिन यह सब इतना तुच्छ है कि यह सचमुच माउस क्लिक के एक जोड़े के साथ किया जाता है, इसलिए मैं इस फ़ंक्शन को लागू करने के लिए सभी को छोड़ देता हूं।
इस पोस्ट को अंत तक पढ़ने वाले सभी को धन्यवाद। मुझे उम्मीद है कि यह दिलचस्प था।