#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
, sopic1
isNone
, а не какую-то строку, представляющую кубик, как кажется, вы ожидаете. Вы должны определить свои кубики в виде строк или, возможно, лучше в виде списков строк, если вы хотите иметь возможность печатать их рядом.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 хочет «Я бы ожидал, что выходные данные будут представлять собой две игральные кости, отображаемые рядом друг с другом с тремя пробелами между ними», но, возможно, они были бы в порядке с этим решением