首页 > 解决方案 > 如何水平而不是垂直打印多个 ASCII 艺术图形?

问题描述

我正在做一个 yahtzee 项目,想在屏幕上从左到右显示骰子文本图形,而不是上下

这是我现在拥有的代码:

import random

die1 = random.randint(1,6)
die2 = random.randint(1,6)
die3 = random.randint(1,6)
die4 = random.randint(1,6)
die5 = random.randint(1,6)

def diepic(die):
    if die == 1:
        print ("=========")
        print ("|       |")
        print ("|   O   |")
        print ("|       |")
        print ("=========")
    elif die == 2:
        print ("=========")
        print ("| O     |")
        print ("|       |")
        print ("|     O |")
        print ("=========")
    elif die == 3:
        print ("=========")
        print ("| O     |")
        print ("|   O   |")
        print ("|     O |")
        print ("=========")
    elif die == 4:
        print ("=========")
        print ("| O   O |")
        print ("|       |")
        print ("| O   O |")
        print ("=========")
    elif die == 5:
        print ("=========")
        print ("| O   O |")
        print ("|   O   |")
        print ("| O   O |")
        print ("=========")
    else:
        print ("=========")
        print ("| O   O |")
        print ("| O   O |")
        print ("| O   O |")
        print ("=========")

diepic(die1)
diepic(die2)
diepic(die3)
diepic(die4)
diepic(die5)

这将从上到下打印出随机骰子选择,但我想在屏幕的最顶部从左到右打印出来。有没有一种简单的方法可以做到这一点?此代码将打印出来,如下所示:

=========
|       |
|   O   |
|       |
=========
=========
| O     |
|       |
|     O |
=========
=========
| O     |
|   O   |
|     O |
=========
=========
| O   O |
|       |
| O   O |
=========
=========
| O   O |
|   O   |
| O   O |
=========

我想要这样:

========= ========= ========= ========= =========
|       | | O     | | O     | | O   O | | O   O |
|   O   | |       | |   O   | |       | |   O   |
|       | |     O | |     O | | O   O | | O   O |
========= ========= ========= ========= =========

然后游戏可以在骰子下继续进行。这可以做到吗?

标签: python

解决方案


这是一个快速的片段。

首先,重新定义您的函数以返回包含骰子图形每一行的列表,而不是直接打印它们。

def diepic(die):
    if die == 1:
        return ["=========",
                "|       |",
                "|   O   |",
                "|       |",
                "=========",]
    elif die == 2:
        return ["=========",
                "| O     |",
                "|       |",
                "|     O |",
                "=========",]
    elif die == 3:
        return ["=========",
                "| O     |",
                "|   O   |",
                "|     O |",
                "=========",]
    elif die == 4:
        return ["=========",
                "| O   O |",
                "|       |",
                "| O   O |",
                "=========",]
    elif die == 5:
        return ["=========",
                "| O   O |",
                "|   O   |",
                "| O   O |",
                "=========",]
    else:
        return ["=========",
                "| O   O |",
                "| O   O |",
                "| O   O |",
                "=========",]

然后你可以zipjoin元素水平连接不同的行:

import random
    
print('\n'.join(map('  '.join, zip(*[diepic(random.randint(1,6)) for i in range(5)]))))

示例输出:

=========  =========  =========  =========  =========
| O     |  | O   O |  | O     |  |       |  | O   O |
|       |  |       |  |   O   |  |   O   |  | O   O |
|     O |  | O   O |  |     O |  |       |  | O   O |
=========  =========  =========  =========  =========

最后一部分的注释代码。由于这是一种理解,因此应从下到上阅读:

print(                                                  # print the whole
      '\n'.join(                                        # join the lines
                map('  '.join,                          # join the swapped chunks
                    zip(*[                              # swap the chunks
                          diepic(random.randint(1,6))   # return the chunks per die
                                 for i in range(5)      # repeat 5 times
                         ]
                        )
                    )
               )
     )

推荐阅读