我正在尝试编写一些会覆盖其先前输出的代码,例如原始输出为“1”,但“1”替换为“2”。这使得看起来好像从未输出过“1”。 我有一个名为“Board”的列表,我使用此代码将此列表转换为多行字符串:
PrintBoard = """"""
for y in range(Board_Height):
for x in range(Board_Length):
PrintBoard += Board[y][x]
PrintBoard += "\n"
我得到了我想要的字符串。但是,我希望能够使用新字符串更新此字符串并将其替换为旧字符串。
示例输出:
+-------+ +-------+
| | *gets replaced by* | |
| | -------------------> | * |
| | | |
+-------+ +-------+
目前我一直尝试使用end="\r"
来做到这一点
例如
print(PrintBoard, end="\r")
UpdateBoard
print(PrintBoard, end="\r")
这导致了这个输出:
+-------+
| |
| |
| |
+-------+
+-------+
| |
| * |
| |
+-------+
答案 0 :(得分:0)
我建议您使用类似
的内容print(PrintBoard, end='')
for x in len(PrintBoard):
print("\b")
UpdateBoard()
print(PrintBoard, end='')
此解决方案使用ASCII退格符转义字符\ b。另外,我没有看到使用end="\r"
的重点,所以我将其替换为end=""
。
答案 1 :(得分:0)
我会将每个棋盘分成它自己的列表,如下所示:
l_nMinplacesPos.push_back(m_nCurrentTime);
然后打印你可以把它们拉在一起打印..
a = ["+-------+",
"| |",
"| |",
"| |",
"+-------+"]
b = ["+-------+",
"| |",
"| * |",
"| |",
"+-------+"]
div = [" ",
" rep with ",
" --------> ",
" ",
" "]
答案 2 :(得分:0)
这并不像你想象的那么微不足道。您可以使用\r
(回车)返回到当前行,或\b
将字符移回 - 这些都让人联想到早期的电子打字机时代 - 但要绕过屏幕,您需要更多控制终端。当然,您可以在Windows上的* nix / os.system('clear')
上调用os.system('cls')
来清除整个屏幕并再次绘制它,但这并不优雅。
相反,Python提供了专为此目的而设计的curses
模块。这是一个关于如何使用它的简单演示:
import curses
import time
console = curses.initscr() # initialize is our playground
# this can be more streamlined but it's enough for demonstration purposes...
def draw_board(width, height, charset="+-| "):
h_line = charset[0] + charset[1] * (width - 2) + charset[0]
v_line = charset[2] + charset[3] * (width - 2) + charset[2]
console.clear()
console.addstr(0, 0, h_line)
for line in range(1, height):
console.addstr(line, 0, v_line)
console.addstr(height-1, 0, h_line)
console.refresh()
def draw_star(x, y, char="*"):
console.addstr(x, y, char)
console.refresh()
draw_board(10, 10) # draw a board
time.sleep(1) # wait a second
draw_star(6, 6) # draw our star
time.sleep(1) # wait a second
draw_star(6, 6, " ") # clear the star
draw_star(3, 3) # place the star on another position
time.sleep(3) # wait a few seconds
curses.endwin() # return control back to the console
当然,你可以得到比这更好的,但它应该给你如何利用它的想法。
答案 3 :(得分:0)
您尚未指定是否需要在Linux或Windows上运行解决方案。
对于Linux,您可以使用zwer回答。但是, curses 模块在Windows上不可用。
Windows cmd 非常简单,无法理解高级格式。 您已清除并重绘整个窗口以获取动画。
这是一个星球随机移动20帧动画的例子:
import os
import time
import random
import copy
board = [['+', '-', '-', '-', '-', '-', '-', '-', '-', '+'],
['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
['+', '-', '-', '-', '-', '-', '-', '-', '-', '+']]
for i in range(20):
os.system('cls')
frame = copy.deepcopy(board)
frame[random.randint(1, 8)][random.randint(1, 8)] = '*'
print('\n'.join([''.join(i) for i in frame]))
time.sleep(1)