在python3

时间:2015-08-18 18:11:39

标签: python python-3.x

我正在创建一个应该在命令行上运行的游戏。游戏使用文本作为画布(软件以矩形形状打印文本,当文本更改时,图像会更改)。我已经创建了一个小脚来测试它是如何工作的

import os

# function for printing out the game display grid
def printgrid(input):
    for i in range(len(input)):
        for j in range(len(input[0]):
            print(input[i][j], end='')
        print('') # newline after each row

grid = [['#' for x in range(10)] for x in range(10)]
while (True):
    # refresh the screen and reprint
    os.system('clear')
    printgrid(grid)

不幸的是,代码似乎打印网格太慢,导致打印过程中出现明显的滚动效果,这会使游戏无法播放。

  1. 有没有更快的方法在python中打印文本?

  2. 这种滚动效果的原因可能就是我没有在这段代码上设置任何帧率上限,它恰好在计算机显示器刷新时显示当前输出?

  3. 如果我的方法完全错误,那么最好的方法是什么?

3 个答案:

答案 0 :(得分:3)

打印到控制台通常很慢,因为大多数语言都会等到显示消息后再继续。你现在的方法可以解决这个问题。

如果您通过sys.stdout使用文件API,则可以根据需要write()多次,并在准备好打印屏幕时致电flush()。您也可以尝试尽可能少地调用write(),也许在内存中构建字符串并输出它们。

然而,绝对需要帧率上限。控制台不是快速接口,它不能做高帧速率。实施上限,并使用数字。

简而言之:

  • 尽可能少地致电write()
  • 仅在您准备好呈现
  • 时致电flush()
  • 将帧速率设置为10,然后是20,然后是30.实验

肯定让您的游戏加快速度的另一种方法是使用ncurses。有了它,您只能更新需要重新渲染的屏幕部分,而不是重新打印整个屏幕。

答案 1 :(得分:1)

由于Python 3.3 print()支持关键字参数“flush”(see documentation):

print('Hello World!', flush=True)

答案 2 :(得分:1)

假设您使用的是类Unix操作系统(Linux或Mac),那么最好的方法就是使用curses(https://docs.python.org/3/howto/curses.html)。但是,这可能需要付出很多努力,而且对于你正在做的事情可能会有点过分。

如果你选择走简单路线,那么你应该延迟重画。现在,在完成将所有内容放在屏幕上后,您立即清理,这会给您带来麻烦。相反,你可以做这样的事情:

from time import sleep
while (True):
    # refresh the screen and reprint
    os.system('clear')
    printgrid(grid)

    sleep(0.1)    # sleep 0.1 seconds before clear

这样做的目的是在重新绘制之前将文字留在屏幕上更长时间,这样可以更容易看到。玩你睡觉的时间,找到最适合你的应用程序。