मूल रूप से दो दृष्टिकोण हैं: कम प्रस्तुत करें, और तेज़ी से प्रस्तुत करें।
रेंडर कम आमतौर पर अधिक कठिन होता है, लेकिन यह भी कम गहन होता है। क्लासिक उदाहरण कारमैक के उत्सुक गेम होंगे - पीसी में पूरी स्क्रीन को एक बार में फिर से प्रस्तुत करने की हिम्मत नहीं थी, इसलिए कारमैक ने सुनिश्चित किया कि स्क्रीन के केवल हिस्सों को वास्तव में बदल दिया गया है। आपके मामले में, यह पुरानी स्क्रीन के खिलाफ नई स्क्रीन की जांच के रूप में सरल हो सकता है (निश्चित रूप से Console
विधियों का उपयोग किए बिना) - आपके द्वारा लिखे गए गेम के प्रकार के आधार पर, यह आपको बड़ी मात्रा में काम बचा सकता है।
तेजी से प्रस्तुत करना आमतौर पर आसान होता है। पुराने दिनों में सामान्य दृष्टिकोण आउटपुट बफर तक सीधे पहुंच प्राप्त करना था - प्लेफील्ड को अलग-अलग मेमोरी में रखने के बजाए, आप इसे सीधे ग्राफिक्स कार्ड में रखते थे - जो कि पूरी स्क्रीन को जितनी जल्दी हो सके उतना तेज़ करने में सक्षम था, बेशक, अन्यथा आप कभी भी अपनी सीआरटी स्क्रीन पर ज्यादा नहीं देख पाएंगे। यह विकल्प पिछड़ा संगतता के रूप में अभी भी सुलभ है, इसलिए यदि आप अपने एप्लिकेशन को टर्बो पास्कल कहते हैं, तो आप अभी भी इसका उपयोग कर सकते हैं, लेकिन यह वास्तव में सी # में आसानी से पहुंच योग्य नहीं है। StringBuilder
में पूरी स्क्रीन को प्रतिपादित करने में एक विकल्प है, और फिर Console.Write
सभी एक बार में। यह काफी तेज होगा, लेकिन यह बिल्कुल तारकीय नहीं है। char[]
आपको प्रदर्शन का एक अतिरिक्त बिंदु प्रदान करने की अनुमति देगा - आप अपने प्लेफील्ड को char[][]
के रूप में सीधे प्रस्तुत कर सकते हैं और फिर जब भी आप कुछ बदलते हैं तो आपको StringBuilder
को फिर से बनाने की आवश्यकता नहीं होती है - आपको केवल प्रत्येक प्लेफील्ड लाइन के लिए Console.Write
करना होगा।
और निश्चित रूप से, आप जितनी जल्दी हो सके परिवर्तनों को लिख सकते हैं; जिस गेम को आप लिख रहे हैं उसके आधार पर, यह "महान परिणामों के साथ तुच्छ" से "बहुत कठिन और अच्छा दिखने" से सभी तरह से हो सकता है। और चूंकि कंसोल का बफर क्षेत्र तब विंडो आकार से बड़ा हो सकता है, इसलिए आप इसे बफर के एक छिपे हिस्से में भी खींच सकते हैं, और उसके बाद पूरे परिवर्तन को एक बार में खींचने के लिए Console.MoveBufferArea
का उपयोग कर सकते हैं - इसे आमतौर पर "बैकबफरिंग" कहा जाता है। मुझे यकीन नहीं है कि यह अच्छा लगेगा, हालांकि - कंसोल विंडो आजकल आपको बफर में स्क्रॉल करने की अनुमति देती है, जो आपके उपयोग के मामले के लिए हानिकारक हो सकती है।
कंसोल बफर के लिए बहुत तेज पहुंच प्राप्त करने के अभी भी तरीके हैं, लेकिन .NET में पूरी तरह से रहने के दौरान नहीं - आपको पी/आमंत्रण का उपयोग करने की आवश्यकता होगी। इस विषय पर एक बड़ा जवाब यहां है - How can I write fast colored output to Console?।आधुनिक प्रणालियों पर, यह एक बैक बफर का उपयोग करने के लिए काफी समकक्ष है और इसे एक साथ "ड्राइंग" करता है - यह अविश्वसनीय रूप से तेज़ है। और फिर, आप सीधे अपने गेम डेटा के लिए बैक बफर का उपयोग कर सकते हैं - यह 20-30 साल पहले काम करता था, और यह आज भी काम करता है; सीमित संसाधनों के साथ खेलने में यह अच्छा अभ्यास है। क्या आप एक ऐसा गेम लिख सकते हैं जो सब कुछ के लिए वास्तव में कंसोल टेक्स्ट बफर का उपयोग करता है, या कम से कम लगभग सबकुछ? इस तरह की चीजों के साथ खेलना बहुत मजेदार है; आप इस तरह के खेलों की पूरी तरह से लिख सकते हैं, जिसमें टेट्रिस या लोड रनर जैसे गेम शामिल हैं। बेशक, यह केवल विंडोज पर काम करेगा, इसलिए यदि आप अन्य प्रणालियों का समर्थन करना चाहते हैं, तो यह बहुत मुश्किल है।
और अंत में, आप केवल अपना स्वयं का कंसोल लिख सकते हैं (या बेहतर, पहले से लिखे गए और परीक्षण किए गए किसी का उपयोग करें)। यदि आप समय के साथ अधिक चुनौतियों पर जाना चाहते हैं तो यह एक अच्छा अभ्यास है, और यह आपको समय के साथ और अधिक शक्तिशाली तकनीकों के साथ खेलने की अनुमति देगा। सामान्य उदाहरण बौने किले की तरह खेल होगा - अभी भी पाठ आधारित, अभी भी कंसोल की तरह, लेकिन वास्तव में एसडीएल जैसी तकनीकों का उपयोग करके ग्राफिक रूप से खींचा गया है। न केवल आधुनिक प्रणालियों पर यह बहुत तेज़ है (क्योंकि आपके पास टेक्स्ट बफर को सीधे एक्सेस करने का कोई आसान तरीका नहीं है), यह ग्राफिकल टाइल वाले गेम को आसानी से बदलने का विकल्प भी खोलता है। यह ठंडा सामान के लिए सीढ़ी पर एक और कदम पत्थर है :))
बस पूरी स्क्रीन को दोबारा नहीं हटाएं, केवल –
बदल गए हिस्सों में मैंने सोचा कि यह वही है जो मैं कर रहा था, लेकिन स्पष्ट रूप से मैं नहीं था, बस अब मैंने देखा है कि मेरा आखिरी "अन्य अगर" जरूरी नहीं है क्योंकि मैं वही काम कर रहा हूं, अगर == 1, मैंने आखिरी अन्यथा हटा दी, और अब यह बहुत बेहतर दिखता है! :) – Darkbound
क्या आपने स्ट्रिंगबफर का उपयोग करने का प्रयास किया था? – Caramiriel