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