#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]), так как мне будет легче понять, что делает код, когда я прочитаю его снова в будущем.