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

#python

#python

Вопрос:

В принципе, мое задание состоит в том, чтобы имитировать бросание кубиков и распечатывать их рядом в зависимости от того, что было брошено. Кости занимают по 5 строк каждая, поэтому мне нужен способ распечатать все 5 строк рядом с другим результатом матрицы из всех 5 строк.

Программа, которую я пробовал, пыталась преобразовать функции в обычные строки, но это не сработало, и я также попытался ввести end = » в самих функциях и просто поместить их прямо друг под другом, но и там мне не повезло. Я опубликовал только в том случае, если первый кубик равен 1.

 import random

def roll_dice():
    return random.choice(['1','2','3','4','5','6'])

def display_die1():
    print(" ------- ")
    print("|       |")
    print("|   *   |")
    print("|       |")
    print(" ------- ")

def display_die2():
    print(" ------- ")
    print("| *     |")
    print("|       |")
    print("|     * |")
    print(" ------- ")

def display_die3():
    print(" ------- ")
    print("| *     |")
    print("|   *   |")
    print("|     * |")
    print(" ------- ")

def display_die4():
    print(" ------- ")
    print("| *   * |")
    print("|       |")
    print("| *   * |")
    print(" ------- ")

def display_die5():
    print(" ------- ")
    print("| *   * |")
    print("|   *   |")
    print("| *   * |")
    print(" ------- ")

def display_die6():
    print(" ------- ")
    print("| * * * |")
    print("|       |")
    print("| * * * |")
    print(" ------- ")

def main():
    pic1, pic2, pic3, pic4, pic5, pic6 = display_die1(), display_die2(), display_die3(), display_die4(), display_die5(), display_die6()
    print(f"Craps: A Popular Dice Game")
    prompt = input(f"Press <Enter> to roll the dice.")
    if prompt == (""):
        x = roll_dice()
        y = roll_dice()
        add = int(x)   int(y)
        if x == '1':
            if y == '1':
                print(pic1, end = '')
                print(pic1)
            if y == '2':
                print(pic1, end = '')
                print(pic2)
            if y == '3':
                print(pic1, end = '')
                print(pic3)
            if y == '4':
                print(pic1, end = '')
                print(pic4)
            if y == '5':
                print(pic1, end = '')
                print(pic5)
            if y == '6':
                print(pic1, end = '')
                print(pic6)
        stopper = int(x)   int(y)
        if add == (7 or 11):
            print(f"You rolled a {add} on your first roll.")
            print(f"You win!")
        elif add == (2 or 3 or 12):
            print(f"You rolled a {add} on your first roll.")
            print(f"You lose!")
        else:
            print(f"You rolled a {add} on your first roll.")
            print(f"nThat's your point. Roll it again before you roll a 7 and lose!")
            while add != (7 or stopper):
                proceed = input(f"nPress <Enter> to roll the dice.")
                if proceed == (""):                
                    x = roll_dice()
                    y = roll_dice()
                    add = int(x)   int(y)
                    if (add == 7):
                        print(f"You rolled a 7.")
                        print(f"You lose!")
                        break
                    elif (add == stopper):
                        print(f"You rolled a {stopper}.")
                        print(f"You win!")
                        break
                    else:
                        print(f"You rolled a {add}")

main()
  

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

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

1. display_die1() печатает кубик и возвращает None , so pic1 is None , а не какую-то строку, представляющую кубик, как кажется, вы ожидаете. Вы должны определить свои кубики в виде строк или, возможно, лучше в виде списков строк, если вы хотите иметь возможность печатать их рядом.

2. print("⚀ ⚁ ⚂ ⚃ ⚄ ⚅") ……

Ответ №1:

Вы должны хранить dice в виде списков строк

 die3 = [
    " ------- ",
    "| *     |",
    "|   *   |",
    "|     * |",
    " ------- ",
]    


die4 = [
    " ------- ",
    "| *   * |",
    "|       |",
    "| *   * |",
    " ------- ",
]
  

и затем вы можете использовать zip() для создания пар [first row of die3, first row of die4] , [second row of die3, second row of die4] и т.д. И затем вы можете объединить pair с помощью "".join() и отобразить его

 for rows in zip(die3, die4):
    #print(rows)
    print(''.join(rows))

 -------  ------- 
| *     || *   * |
|   *   ||       |
|     * || *   * |
 -------  ------- 
  

вы можете сделать то же самое с большим количеством кубиков

 for rows in zip(die3, die4, die4, die3):
    print(''.join(rows))

 -------  -------  -------  ------- 
| *     || *   * || *   * || *     |
|   *   ||       ||       ||   *   |
|     * || *   * || *   * ||     * |
 -------  -------  -------  ------- 
  

Если вам нужно пространство между кубиками, используйте пробел в " ".join(rows)

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

1. Большое вам спасибо! Я думаю, следовало догадаться поместить их в списки…

Ответ №2:

Одна большая проблема заключается в этой строке:

 pic1, pic2, pic3, pic4, pic5, pic6 = display_die1(), display_die2(), display_die3(), display_die4(), display_die5(), display_die6()
  

Давайте упростим это до одного назначения и найдем ошибку:

 pic1 = display_die()
  

приведет к следующему:

В консоли:

  ------- 
| * * * |
|       |
| * * * |
 ------- 
  

И pic1 == None .

Другая проблема заключается в том, что вы можете печатать только построчно и не возвращаться назад. Итак, вам нужен механизм для печати в одной строке двух «строк» для каждой кости.

Решением было бы сохранить каждую строку dice в элементе списка:

 def get_dice_1():
    lines = [
    " ------- ",
    "| * * * |",
    "|       |",
    "| * * * |",
    " ------- "  
    ]
  

Для печати двух кубиков:

 def print_dices(list_dice_1, list_dice_2):
    for i range(len(list_dice_1)):
        line = list_dice_1[i]   "   "   list_dice_2[i]
        print(line)
  

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

1. Спасибо, что помогли мне!

Ответ №3:

Я думаю, лучшим решением было бы сохранить кости в списке, а затем вы можете распечатать каждую строку кости с помощью методов форматирования строк. Примером этого может быть:

 import random

dice_list = [
[
    " ------- ",
    "|       |",
    "|   *   |",
    "|       |",
    " ------- "],
    [
    " ------- ",
    "| *     |",
    "|       |",
    "|     * |",
    " ------- "],
    [
    " ------- ",
    "| *     |",
    "|   *   |",
    "|     * |",
    " ------- "],
    [
    " ------- ",
    "| *   * |",
    "|       |",
    "| *   * |",
    " ------- "],
    [
    " ------- ",
    "| *   * |",
    "|   *   |",
    "| *   * |",
    " ------- "],
    [
    " ------- ",
    "| * * * |",
    "|       |",
    "| * * * |",
    " ------- "]
]

roll1 = random.randint(0, 5)
roll2 = random.randint(0, 5)

for i in range(5): # number of rows of strings per dice
    print("{}   {}".format(dice_list[roll1][i], dice_list[roll2][i]))
  

Который выводит что-то вроде этого:

  -------     ------- 
| * * * |   | * * * |
|       |   |       |
| * * * |   | * * * |
 -------     ------- 
  

Однако следует отметить, что диапазон бросков кубиков с помощью этого метода равен 0-5, поэтому, если вы хотите сказать, print('You rolled a 2 and a 5') вам пришлось бы добавить 1 к обоим roll1 и roll2 , чтобы числа совпали!

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

1. Мне тоже очень нравится это предложение! Спасибо!

Ответ №4:

Редактировать:

Я знаю, что уже есть ответ, выбранный на этот пост, но вот альтернативное решение с использованием ключевого слова yield, которое можно использовать в последовательностях. У меня была эта мысль раньше, но у меня не было достаточно времени, чтобы создать для нее код. Во всяком случае, приятно видеть другой способ выполнить то же самое. 🙂

 def display_die1():
    yield (" ------- ")
    yield ("|       |")
    yield ("|   *   |")
    yield ("|       |")
    yield (" ------- ")


def display_die2():
    yield (" ------- ")
    yield ("| *     |")
    yield ("|       |")
    yield ("|     * |")
    yield (" ------- ")

dice1 = display_die1()
dice2 = display_die2()

for line in range(0,5):
    print(f"{next(dice1)}    {next(dice2)}")
  

Вот выходные данные:

  -------      ------- 
|       |    | *     |
|   *   |    |       |
|       |    |     * |
 -------      ------- 
  

Я надеюсь, это поможет!

################ Мой старый ответ

Использование docstrings вместо печати каждой отдельной строки даст вам более согласованный вывод.

 def display_die1():
    dice = '''
 ------- 
|       |
|   *   |
|       |
 ------- 
    '''
    return dice

def display_die2():
    dice = '''
 ------- 
| *     |
|       |
|     * |
 ------- 
    '''
    return dice

print(f"{str(display_die1())}   {str(display_die2())}")
  

В данном случае не рядом, а одна поверх другой.

Вот выходные данные

 python ./testing/dice_test.py

 ------- 
|       |
|   *   |
|       |
 ------- 

 ------- 
| *     |
|       |
|     * |
 ------- 
  

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

1. Я думаю, что OP хочет «Я бы ожидал, что выходные данные будут представлять собой две игральные кости, отображаемые рядом друг с другом с тремя пробелами между ними», но, возможно, они были бы в порядке с этим решением