我在这里找到了来自用户的这段代码并编辑它以获得我的游戏板:
rows = [[f'{(n+1) + (i*7):4}' for n in range(7)] for i in range(7)]
rows = reversed([reversed(rows[i]) if i%2 else rows[i] for i in range(len(rows))])
for row in rows:
print(' | '.join(row))
这对我来说是一个完美的游戏板,7乘7:
43 | 44 | 45 | 46 | 47 | 48 | 49
42 | 41 | 40 | 39 | 38 | 37 | 36
29 | 30 | 31 | 32 | 33 | 34 | 35
28 | 27 | 26 | 25 | 24 | 23 | 22
15 | 16 | 17 | 18 | 19 | 20 | 21
14 | 13 | 12 | 11 | 10 | 9 | 8
1 | 2 | 3 | 4 | 5 | 6 | 7
我可以稍微理解一下代码,我知道它使用了一个列表生成器以及它如何反转每一行......
但我也希望能够在棋盘上打印玩家的位置。例如,如果Player1位于主板上的第6位,我想打印出一块新主板,但只需用#34; P1"替换数字6。我遇到了错误"TypeError: 'list_reverseiterator' object is not subscriptable"
如何使用上面的代码执行此操作?我需要一个不同的解决方案来绘制电路板吗?
答案 0 :(得分:2)
数字在第一个列表解析中生成,在f'..'
字符串中:
f'{(n+1) + (i*7):4}'
这会将数字计算为(n + 1) + (i * 7)
,并将其格式化为宽度为4的列。如果您想在此处显示其他内容,则需要将 替换为 P1
。如果您首先使用任何字符串格式生成数字,这会更容易:
playerpos = 6
numbers = (((n+1) + (i*7) for n in range(7)) for i in range(7))
rows = [[f'{"P1" if pos == playerpos else pos:>4}' for pos in row] for row in numbers]
rows = reversed([reversed(rows[i]) if i%2 else rows[i] for i in range(len(rows))])
numbers
然后是生成数字的生成器的生成器,然后第一个rows
表达式生成一个列表列表,格式化每个数字或字符串P1
如果号码与玩家位置匹配。
我在格式规范中添加了>
;默认情况下,数字是右对齐的,但其他所有数据都是左对齐的。 >
会覆盖并对齐所有内容,将P1
置于与数字相同的位置。
演示:
>>> playerpos = 6
>>> numbers = (((n+1) + (i*7) for n in range(7)) for i in range(7))
>>> rows = [[f'{"P1" if pos == playerpos else pos:>4}' for pos in row] for row in numbers]
>>> rows = reversed([reversed(rows[i]) if i%2 else rows[i] for i in range(len(rows))])
>>> for row in rows:
... print(' | '.join(row))
...
43 | 44 | 45 | 46 | 47 | 48 | 49
42 | 41 | 40 | 39 | 38 | 37 | 36
29 | 30 | 31 | 32 | 33 | 34 | 35
28 | 27 | 26 | 25 | 24 | 23 | 22
15 | 16 | 17 | 18 | 19 | 20 | 21
14 | 13 | 12 | 11 | 10 | 9 | 8
1 | 2 | 3 | 4 | 5 | P1 | 7