D&D骰子程序(无循环)

时间:2018-09-28 17:55:40

标签: python dice

我应该编写一个掷骰子五次的程序,但是我没有任何冗余,也不能使用任何循环。 我将在练习中粘贴文本。 “构建一个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 :(得分:2)

注意:这是一种糟糕的方法。循环的目的是消除冗余。没有任何形式的循环,所有解决方案都将很笨拙,难以阅读且效率很低。

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)

答案 1 :(得分:1)

使用综合列表

import random
randomList = [random.randint(1,diceType) for _ in range(5)]
diceRoll1, diceRoll2, diceRoll3, diceRoll4, diceRoll5 = randomList

答案 2 :(得分:0)

我将使用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)

这将创建一个包含对randint的5个单独引用的列表,然后在该列表上映射一个在1和diceType上调用其参数的函数。

(实际上,可以使用相同的方法简化itertools版本:

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

答案 3 :(得分:0)

就个人而言,如果我不能使用任何循环,我将使用一个列表来执行此操作,以跟踪已使用和未使用的内容。

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次。