2016-01-16 3 views
5

मैं विंडोज कंसोल पर पाइथन में एक आर्केनोइड गेम लिख रहा हूं और मुझे "प्रदर्शन" लूप के हर पुनरावृत्ति के बाद परेशान करने वाला क्या परेशान है। क्या किसी को यह पता है कि इसे कैसे कम किया जाए? इस कोड का हिस्सा है:सेमीडी कंसोल गेम; ब्लिंकिंग में कमी

#-*- coding: UTF-8 -*- 
import time 
import os 

clear = lambda: os.system('cls') 
def gra(): 
    koniec='0' 
    while koniec!='1': 
     for i in range(4): 
      for j in range(10): 
       print '[___]', 
      print '\n', 
     for i in range(10): 
      print '\n' 
     for i in range(10): 
      print ' ', 
     print '~~~~~~~~~~' 
     time.sleep(0.1) 
     clear() 
gra() 
+0

स्क्रीन साफ़ न करें। इसके बजाय, ड्राइंग से पहले स्क्रीन के ऊपरी बाएं कोने में अपने कर्सर को ले जाएं। – GingerPlusPlus

उत्तर

0

कुछ भी वास्तव में खिड़कियों सांत्वना के साथ किया ब्लिंक करेगा अगर आपके समाशोधन और स्क्रीन को फिर से लिखने, जब तक आप काफी उन्नत कुछ मुझे नहीं लगता कि आप को दूर कर सकते हैं खोजने के निमिष

मेरा एकमात्र सुझाव है कि जब कुछ वास्तव में बदलता है तो समाशोधन को सीमित करना है।

या cmd के बजाय एक tkinter पाठ बॉक्स का उपयोग करने के लिए। यदि आप उस विचार का उपयोग करना चाहते हैं तो मैं इसके साथ मदद कर सकता हूं, हालांकि मैं ज्यादातर पाइथन 3.4

उम्मीद करता है कि मदद करता है!

1

आप क्या कर सकते हैं इसकी एक सीमा है, लेकिन सब कुछ 1 बड़ी स्ट्रिंग में इकट्ठा करना और फिर स्क्रीन क्लीनर के बीच एक बार प्रिंट करना लूप में कई छोटे प्रिंटों से बेहतर है। निम्नलिखित कोड चलाने के लिए और देखो कितना बेहतर कार्यक्रम की दूसरी छमाही पहली छमाही की तुलना में चलाता है:

import time, os, random 

def display1(chars): 
    os.system('cls') 
    for row in chars: 
     print(''.join(row)) 

def display2(chars): 
    os.system('cls') 
    print('\n'.join(''.join(row) for row in chars)) 


chars = [] 
for i in range(40): 
    chars.append(["-"]*40) 

for i in range(100): 
    r = random.randint(0,39) 
    c = random.randint(0,39) 
    chars[r][c] = "X" 
    time.sleep(0.1) 
    display1(chars) 

os.system('cls') 
time.sleep(1) 

chars = [] 
for i in range(40): 
    chars.append(["-"]*40) 

for i in range(100): 
    r = random.randint(0,39) 
    c = random.randint(0,39) 
    chars[r][c] = "X" 
    time.sleep(0.1) 
    display2(chars) 

संपादित करें पर: आप cls से बचने के लिए @GingerPlusPlus के उत्कृष्ट विचार के साथ इन विचारों को जोड़ सकते हैं। यह चाल बड़ी संख्या में बैकस्पेस प्रिंट करना है। -

पहले cls के अपने स्वयं के संस्करण लिखें:

def cls(n = 0): 
    if n == 0: 
     os.system('cls') 
    else: 
     print('\b'*n) 

पहली बार यह कहा जाता है - पारित यह शून्य और यह सिर्फ स्क्रीन को साफ़ करें।

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

def display(chars): 
    s = '\n'.join(''.join(row) for row in chars) 
    print(s) 
    return len(s) 

की तरह प्रयुक्त इस प्रकार:

chars = [] 
for i in range(40): 
    chars.append(["-"]*40) 

for i in range(100): 
    n = 0 
    r = random.randint(0,39) 
    c = random.randint(0,39) 
    chars[r][c] = "X" 
    time.sleep(0.1) 
    cls(n) 
    n = display(chars) 

जब उपर्युक्त कोड चलाया जाता है, तो प्रदर्शन लगभग कोई झिलमिलाहट के साथ आसानी से बदलता है।

+0

मैंने आपके पहले सुझाव का उपयोग किया और अब यह बहुत बेहतर है। लेकिन दूसरे के साथ कुछ गड़बड़ है। 'डिफ डिस्प्ले (वर्ण):', 's = '\ n'.join (' 'अक्षर में पंक्ति के लिए शामिल हों (पंक्ति)), ' प्रिंट (ओं) ', ' वापसी लेन (ओं) ' लेन (ओं) हमेशा एक ही मूल्य है, इसलिए cls का यह संस्करण हर पुनरावृत्ति के बाद सब कुछ साफ़ करता है। – Jarshah

+0

@ जर्शाह यह मुद्दा था - स्क्रीन को बैकस्पेसिंग द्वारा साफ़ करने के अनुकरण के लिए, क्योंकि यह विधवाओं 'cls' कमांड से थोड़ी कम झिलमिलाहट करता है। आपको यह जानने की जरूरत है कि आपने कितने पात्रों को अभी लिखा है, इस पर ध्यान रखकर स्क्रीन कितनी बड़ी है। यदि स्क्रीन के केवल एक हिस्से को पुनर्भुगतान की आवश्यकता है और आप ट्रैकस्पेस के बारे में कितना ट्रैक कर सकते हैं - बस बैक-स्पेस आधारित 'cls()' को एक अलग मान पास करें। यदि आप पास करने के लिए इष्टतम 'एन' का पता लगा सकते हैं तो आप शायद झिलमिलाहट को और भी कम कर सकते हैं। –

+0

ओ.के. मैंने सोचा था कि आप यह जानना चाहते थे कि अंतिम परिवर्तन कहां बनाया गया था और फिर गिनती है कि आपको इसे साफ़ करने के लिए कितने बैकस्पेस की आवश्यकता है। शायद मैं इस तरह कुछ लागू करने की कोशिश करूंगा। – Jarshah

0

आप कर सकता है:

rows_full=row_count+2 
print("\033[F"*rows_full) 

#print the screen again 

नुकसान यह है कि आप कंसोल के सबसे ऊपर बिट अधिलेखित नहीं कर सकते हैं और पता है कि कैसे कई पंक्तियों मुद्रित किया गया है है कर रहे हैं। लेकिन फिक्स्ड-पंक्ति वाले एएससीआईआई ग्राफिक्स गेम के साथ काम करते समय पंक्ति राशि जानना तुच्छ होना चाहिए। यह CLS भी नहीं है, यह आपको बस शीर्ष पर ले जाता है।

ओह, स्पष्टीकरण! यह एएनएसआई एस्केप अनुक्रम F का उपयोग करता है, जो ऊपर की पंक्ति में चलता है। यह कई बार प्रिंट करता है, जो आपको स्क्रीन के शीर्ष पर रखता है। साथ ही, आपको पंक्ति गणना में 2 जोड़ना होगा, अन्यथा शीर्ष पंक्तियां दोहराई जाएंगी।

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

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