我正在编写一个程序,我希望骰子可以并排打印。然而,实际输出仅将第二管芯的顶部基座放置在第一管芯的底部基座旁边。任何人都可以帮助我理解为什么会这样吗?
die1 = ('+-------+\n| |\n| * |\n| |\n+-------+')
die2 = ('+-------+\n| * |\n| |\n| * |\n+-------+')
die3 = ('+-------+\n| * |\n| * |\n| * |\n+-------+')
die4 = ('+-------+\n| * * |\n| |\n| * * |\n+-------+')
die5 = ('+-------+\n| * * |\n| * |\n| * * |\n+-------+')
die6 = ('+-------+\n| * * * |\n| |\n| * * * |\n+-------+')
list_die = ['0', die1, die2, die3, die4, die5, die6]
x = list_die[1]+' ' + list_die[2]
print(x)
my output
+-------+
| |
| * |
| |
+-------+ +-------+
| * |
| |
| * |
+-------+
答案 0 :(得分:0)
尝试使用zip和列表
要让它们并排打印,您需要使用zip连接它们
die1 = ('+-------+','| |','| * |','| |','+-------+')
die2 = ('+-------+','| * |','| |','| * |','+-------+')
die3 = ('+-------+','| * |','| * |','| * |','+-------+')
die4 = ('+-------+','| * * |','| |','| * * |','+-------+')
die5 = ('+-------+','| * * |','| * |','| * * |','+-------+')
die6 = ('+-------+','| * * * |','| |','| * * * |','+-------+')
list_die = ['0',die1,die2,die3,die4,die5,die6];
die_a = list_die[1];
die_b = list_die[2];
for line in zip(die_a,die_b):
print line;
output:
('+-------+', '+-------+')
('| |', '| * |')
('| * |', '| |')
('| |', '| * |')
('+-------+', '+-------+')
答案 1 :(得分:0)
分开获取各行,连接这些行,然后重新加入。请注意,最终结果比原始字符串的简单串联少\n
:
def pair(i,j):
linesI = list_die[i].split('\n')
linesJ = list_die[j].split('\n')
return '\n'.join(x+y for x,y in zip(linesI,linesJ))
例如,
>>> print(pair(1,2))
+-------++-------+
| || * |
| * || |
| || * |
+-------++-------+
开启编辑; 反复拆分相同的字符串效率很低。保留原始定义,您可以使用以下行:
list_die = ['0',die1,die2,die3,die4,die5,die6]
list_die = [d.split('\n') for d in list_die]
现在list_die
包含拆分。
您现在可以使用:
def pair(i,j):
return '\n'.join(x+y for x,y in zip(list_die[i],list_die[j]))
其功能与上述相同。
冒着有点太可爱的风险,你可以制作一个更灵活的版本,可以在一行上打印任意数量的骰子(例如用于编写Risk或Yahtzee游戏,通常涉及三个或更多骰子):
def dice(*args):
return '\n'.join(''.join(t) for t in zip(*(list_die[i] for i in args)))
所以,例如:
>>> print(dice(1))
+-------+
| |
| * |
| |
+-------+
>>> print(dice(1,2))
+-------++-------+
| || * |
| * || |
| || * |
+-------++-------+
>>> print(dice(3,1,4))
+-------++-------++-------+
| * || || * * |
| * || * || |
| * || || * * |
+-------++-------++-------+
进一步编辑:您可以在不使用zip
的情况下执行此操作,但代价是延长代码时间。 zip
专为并行迭代而设计。例如,你组装一对并排的骰子,但是平行地向下迭代两个骰子面。不使用zip
,您需要使用列表索引来保持迭代并行。例如,pair()
的第二个版本(其中list_die
包含已分割为线条的骰子面孔)将如下所示:
def pair(i,j):
lines = []
for k in range(len(list_die[i])):
lines.append(list_die[i][k] + list_die[j][k])
return '\n'.join(lines)
这样可行,但超过200%(5行而不是2行)。
答案 2 :(得分:0)
要回答为什么会出现这种情况的问题,请注意您对print
和显式\n
的调用会在文本中插入换行符,这会强制输出一行。
除非你使用操纵控制台的代码,否则一旦你走了一条线,你就无法恢复。您可以像打印机一样从左到右,从上到下打印。你无法打印。
如果您需要此功能,请查看图形库 。 Curses是C ++的简易goto库,可能有python等价物。
当然,正如其他答案所提到的,您可以将文本并排格式化,这对您来说当前目的可能是更好的选择。