如何并排打印我的 ascii 卡?

Posted

技术标签:

【中文标题】如何并排打印我的 ascii 卡?【英文标题】:How can I print my ascii cards side by side? 【发布时间】:2021-12-24 23:51:25 【问题描述】:

我用 python 做了一个简单的二十一点游戏。我制作了游戏的其余部分,但我正在努力放入 ascii 卡,所以这只是代码的一小部分。我尝试将 * len(phand) 放在附加行的末尾。虽然这确实给了我多张并排的卡片,但它似乎不允许我编辑它们。

#Phand is the hand you draw so it could be any combination of cards

phand = ["2 of Hearts", "King of Diamonds", "Ace of Clubs"]
print(phand)

for xx in range(0, len(phand)):
  pcarddisplay = [] 
  pcarddisplay.append("┌─────────┐")
  pcarddisplay.append("│. . .│")
  pcarddisplay.append("│. . . . .│")
  pcarddisplay.append("│. . . . .│")
  pcarddisplay.append("│. . . .│")
  pcarddisplay.append("│. . . . .│")
  pcarddisplay.append("│. . . . .│")
  pcarddisplay.append("│. . .│")
  pcarddisplay.append("└─────────┘")

  x = ("│.", phand[xx][:1], ". . . .│")
  pcarddisplay[1] = "".join(x)

  x = ("│. . . .", phand[xx][:1], ".│")
  pcarddisplay[7] = "".join(x)

  if "Diamonds" in phand[xx]:
    pcarddisplay[4] = "│. . ♦ . .│"
  if "Clubs" in phand[xx]:
    pcarddisplay[4] = "│. . ♣ . .│"
  if "Hearts" in phand[xx]:
    pcarddisplay[4] = "│. . ♥ . .│"
  if "Spades" in phand[xx]:
    pcarddisplay[4] = "│. . ♠ . .│"

  print("\n".join(pcarddisplay))  
  

这个输出:

['2 of Hearts', 'King of Diamonds', 'Ace of Clubs']
┌─────────┐
│.2. . . .│
│. . . . .│
│. . . . .│
│. . ♥ . .│
│. . . . .│
│. . . . .│
│. . . .2.│
└─────────┘
┌─────────┐
│.K. . . .│
│. . . . .│
│. . . . .│
│. . ♦ . .│
│. . . . .│
│. . . . .│
│. . . .K.│
└─────────┘
┌─────────┐
│.A. . . .│
│. . . . .│
│. . . . .│
│. . ♣ . .│
│. . . . .│
│. . . . .│
│. . . .A.│
└─────────┘

我怎样才能将这些并排打印出来?

【问题讨论】:

您可以将每一行附加到像pcarddisplay[4] = pcarddisplay[4] + "│. . X . .│" 这样的“保留”变量中,然后一次性打印出来 【参考方案1】:

您必须更改代码才能生成一张卡片(此处为 mk_card 函数)。

然后生成所有卡片块并使用zipjoin 的组合来生成行:

phand = ["2 of Hearts", "King of Diamonds", "Ace of Clubs"]

def mk_card(s):
  pcarddisplay = [] 
  pcarddisplay.append("┌─────────┐")
  pcarddisplay.append("│. . .│")
  pcarddisplay.append("│. . . . .│")
  pcarddisplay.append("│. . . . .│")
  pcarddisplay.append("│. . . .│")
  pcarddisplay.append("│. . . . .│")
  pcarddisplay.append("│. . . . .│")
  pcarddisplay.append("│. . .│")
  pcarddisplay.append("└─────────┘")

  x = ("│.", s[:1], ". . . .│")
  pcarddisplay[1] = "".join(x)

  x = ("│. . . .", s[:1], ".│")
  pcarddisplay[7] = "".join(x)

  if "Diamonds" in s:
    pcarddisplay[4] = "│. . ♦ . .│"
  if "Clubs" in s:
    pcarddisplay[4] = "│. . ♣ . .│"
  if "Hearts" in s:
    pcarddisplay[4] = "│. . ♥ . .│"
  if "Spades" in s:
    pcarddisplay[4] = "│. . ♠ . .│"

  return pcarddisplay

print('\n'.join(map('  '.join, zip(*(mk_card(c) for c in phand)))))

输出:

┌─────────┐  ┌─────────┐  ┌─────────┐
│.2. . . .│  │.K. . . .│  │.A. . . .│
│. . . . .│  │. . . . .│  │. . . . .│
│. . . . .│  │. . . . .│  │. . . . .│
│. . ♥ . .│  │. . ♦ . .│  │. . ♣ . .│
│. . . . .│  │. . . . .│  │. . . . .│
│. . . . .│  │. . . . .│  │. . . . .│
│. . . .2.│  │. . . .K.│  │. . . .A.│
└─────────┘  └─────────┘  └─────────┘

【讨论】:

非常感谢您的快速回复。这很好用,谢谢。 不客气@ORKUNCIRAK 快乐编码 ;) 很好的机会来展示map 和生成器表达式之间的关系。答案两者都用。如果您更喜欢生成器表达式,它将是 print('\n'.join(' '.join(mc) for mc in zip(*(mk_card(c) for c in phand)))),如果您更喜欢 map()print('\n'.join(map(' '.join, zip(*map(mk_card, phand)))))

以上是关于如何并排打印我的 ascii 卡?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server Management Studio中的垂直选项卡 - 并排查询和结果?

如何在我的 Twitter 克隆中并排设置侧边栏、Feed 和小部件?

Intermec PM4i ASCII 符号打印

基于最大内容并排的相同宽度选项卡

用于打印的引导网格

带有并排选项卡的 Unity 自定义窗口