Как я могу напечатать несколько графических изображений ASCII по горизонтали, а не по вертикали?

#python

Вопрос:

Я работаю над проектом yahtzee и хочу отображать текстовую графику dice на экране слева направо, а не вверх и вниз

Это код, который у меня сейчас есть:

 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 |
========= ========= ========= ========= =========
 

И тогда игра может быть продолжена под кубиками. Можно ли это сделать?

Ответ №1:

Вот краткий фрагмент для этого.

Во-первых, переопределите свою функцию, чтобы возвращать список, содержащий каждую строку рисунка кубика, вместо того, чтобы печатать их напрямую.

 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 |",
                "=========",]
 

Затем вы можете zip и join элементы соединить различными линиями по горизонтали:

 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
                         ]
                        )
                    )
               )
     )
 

Комментарии:

1. Круглые скобки вокруг строк бессмысленны. Также, вероятно, стоит расширить строку, чтобы объяснить, что происходит на самом деле, потому что это может сбить с толку новичка.

2. @Pranav да они не нужны, я программно отредактировал код OP, я забыл удалить скобки 😉

3. Мне нравится использовать списки. Я лично предпочел бы подход с применением грубой силы в соответствии с » для i в диапазоне(len(die1)): печать(die1[i],`’, die2[i],», die3[i],», die4[i],», die5[i]), так как мне будет легче понять, что делает код, когда я прочитаю его снова в будущем.