D & D программа для игры в кости (без петли) - PullRequest
0 голосов
/ 28 сентября 2018

Я должен написать программу для броска костей пять раз, но у меня не может быть никаких избыточностей, и я не могу использовать какие-либо циклы.Я вставлю сюда текст из упражнения.«Создайте приложение на python, чтобы оно предлагало пользователю ввести количество сторон, которые будут иметь кости (кости в стиле подземелий и драконов!). После этого оно будет бросать кости с таким количеством сторон пять раз и выводить все пять результатов впользователь Для бросания кубика пять раз потребуется пять повторяющихся блоков кода - удалите эту избыточность, используя пользовательскую функцию для броска кубика

Кто-нибудь может мне помочь?

import random

def main():

    diceType = int(input("Enter how many sides the dices will have: "))

    diceRoll1 = random.randint(1,diceType)
    diceRoll2 = random.randint(1,diceType)
    diceRoll3 = random.randint(1,diceType)
    diceRoll4 = random.randint(1,diceType)
    diceRoll5 = random.randint(1,diceType)

    print("The dices read", diceRoll1, diceRoll2, diceRoll3, diceRoll4, diceRoll5)

main()

Ответы [ 4 ]

0 голосов
/ 28 сентября 2018

Лично, если я не могу использовать какие-либо циклы, я бы сделал это со списком, чтобы отслеживать, что использовалось и не использовалось.

diceType = int(input("Enter how many sides the dices will have: "))
lyst = range(1,diceType+1)

diceRoll1 = random.choice(lyst)
lyst.remove(diceRoll1)
diceRoll2 = random.choice(lyst)
lyst.remove(diceRoll2)
diceRoll3 = random.choice(lyst)
lyst.remove(diceRoll3)
diceRoll4 = random.choice(lyst)
lyst.remove(diceRoll4)
diceRoll5 = random.choice(lyst)
lyst.remove(diceRoll5)

print("The dices read", diceRoll1, diceRoll2, diceRoll3, diceRoll4, diceRoll5)

Это не самое элегантное решение,но мне нравится, насколько это читабельно.Вы выбрали что-то из списка, а затем удалите это.А затем сделайте это еще 4 раза.

0 голосов
/ 28 сентября 2018

Я бы использовал модуль itertools.

>>> from itertools import islice, imap, repeat
>>> from random import randint
>>> diceType = 5
>>> list(islice(imap(random.randint, repeat(1), repeat(diceType)), 5))
[5, 5, 4, 5, 4]

repeat создает бесконечные последовательности из 1 с и diceType с.imap создает бесконечную последовательность результата вызова randint(1, diceType) (каждый вызов получает следующее значение repeat(1) и repeat(diceType) в качестве аргумента. islice создает конечный итератор, который принимает только первые 5 элементовбесконечная последовательность, и list фактически принимает значения от конечного итератора.

В тех же строках, без использования itertools, следующее (для простоты используется версия Python 2 map):

map(lambda f: f(1, diceType), [randint]*5)

Это создает список с 5 отдельными ссылками на randint, затем сопоставляет функцию, которая вызывает свои аргументы на 1 и diceType, с этим списком.

(На самом деле, *Версия 1024 * может быть упрощена с использованием того же подхода:

list(islice(map(lambda f: f(1, diceType), repeat(randint)), 5))

)

0 голосов
/ 28 сентября 2018

Использование списка понимания

import random
randomList = [random.randint(1,diceType) for _ in range(5)]
diceRoll1, diceRoll2, diceRoll3, diceRoll4, diceRoll5 = randomList
0 голосов
/ 28 сентября 2018

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

import random

def roll5(diceType, remaining_roll=5):

    if remaining_roll == 0:
        return []

    retval = roll5(diceType, remaining_roll - 1)
    retval.append(random.randint(1,diceType))
    return retval

diceType = int(input("Enter how many sides the dices will have: "))

diceRoll1, diceRoll2, diceRoll3, diceRoll4, diceRoll5 = roll5(diceType)
print("The dices read", diceRoll1, diceRoll2, diceRoll3, diceRoll4, diceRoll5)
...