Python cmd控制台游戏;减少眨眼

Python cmd控制台游戏;减少眨眼,python,Python,我正在windows控制台上用python编写一个神秘的游戏,而困扰我的是每次循环显示后都会令人讨厌地眨眼。有人知道如何减少吗?这是代码的一部分: #-*- 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

我正在windows控制台上用python编写一个神秘的游戏,而困扰我的是每次循环显示后都会令人讨厌地眨眼。有人知道如何减少吗?这是代码的一部分:

#-*- 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()

如果您清除并重写屏幕,windows控制台的任何实际操作都将闪烁,除非您发现一些非常先进的东西,否则我认为您无法消除闪烁

我唯一的建议是将清除限制在实际发生变化时

或者使用tkinter文本框代替cmd。如果您想使用这个想法,我可以提供帮助,尽管我主要使用tkinter for Python3.4


希望这有帮助

您所能做的是有限的,但是将所有内容收集到一个大字符串中,然后在屏幕清除之间打印一次,要比在一个循环中打印许多小打印好。运行以下代码,看看程序的下半部分比上半部分运行得好多少:

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)
编辑:您可以将这些想法与@gingerplus的优秀想法结合起来,以避免cls。诀窍是打印大量的退格

首先-编写您自己的cls版本:

第一次调用它时,将其传递为零,然后清除屏幕

以下函数以一个大字将字符数组推送到命令窗口,并返回打印的字符数,因为这是重新定位光标所需的退格数:

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)
运行上述代码时,显示屏变化平稳,几乎没有闪烁。

您可以执行以下操作:

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

#print the screen again
缺点是您无法覆盖控制台的最顶层,并且必须知道打印了多少行。但是在使用固定行ASCII图形游戏时,知道行数应该是微不足道的。它也不是一个CLS,它只是把你带到顶端

哦,解释!它使用ANSI转义序列F,它移动到上面的行。它会打印很多次,这会让你进入屏幕的顶部。此外,必须在行数中添加2,否则顶部的行将重复


PS:如果有人知道如何制作,以便该方法可以到达控制台的顶部,我会给你一些cookies。

不要清除屏幕。取而代之的是,在绘图之前,将光标移动到屏幕的左上角。我使用了您的第一个建议,现在好多了。但是第二个有点问题。def displaychars:,s='\n'.join.joinrow for row in chars,prints,return lens lens在这里始终具有相同的值,因此此版本的cls在每次迭代后都会清除所有内容。@Jarshah这就是点-模拟通过退格清除屏幕,因为它的闪烁比widows cls命令的闪烁要少一点。你需要通过记录你刚刚写了多少个字符来知道屏幕有多大。如果只需要重新绘制屏幕的一部分,并且您可以跟踪退格的大小,只需传递一个不同的值,然后返回基于空间的cls。如果你能找出一个最佳的n,你可能会减少闪烁甚至更多。我以为你想知道上一次更改是在哪里进行的,然后计算需要清除多少退格。也许我会尝试应用类似的东西。@Jarshah代码主要是概念证明。在我的心智模型中,我认为char数组就像一个图像文件,每一步都会被推送到屏幕上。我是这样写代码的,因为如果你有一个图像,这是某种意义上的增长,那么你可能会推动更大的数组到屏幕上,因此我不想硬线的数量的退格。如果你有一个像移动物体的背景,那么也许你可以跟踪退格多少来重新绘制移动物体。一个技巧是只在第一次运行时在顶部打印一条空行。这完全可以解决问题。
rows_full=row_count+2
print("\033[F"*rows_full)

#print the screen again