Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并两个while循环_Python_Loops_While Loop - Fatal编程技术网

Python 合并两个while循环

Python 合并两个while循环,python,loops,while-loop,Python,Loops,While Loop,我有两个while循环,它们在我的代码中占用了很多空间。我想知道是否有人知道如何合并它们以使我的代码更整洁和更小,因为我甚至不知道从哪里开始。我环顾四周,找不到如何合并两个几乎相同的循环。希望有人能帮助我。我发现了一个与此非常类似的问题,但对我来说,答案没有意义,因为代码不起作用,我试图修复它。这是代码 for i in range(5): while True: print(" ") input("Press enter to roll player 1 ") prin

我有两个while循环,它们在我的代码中占用了很多空间。我想知道是否有人知道如何合并它们以使我的代码更整洁和更小,因为我甚至不知道从哪里开始。我环顾四周,找不到如何合并两个几乎相同的循环。希望有人能帮助我。我发现了一个与此非常类似的问题,但对我来说,答案没有意义,因为代码不起作用,我试图修复它。这是代码

for i in range(5):
while True:
    print(" ")
    input("Press enter to roll player 1 ")
    print("Rolling dice!")
    roll1=random.randint(1,6)
    roll2=random.randint(1,6)
    print(roll1)
    print(roll2)
    total=(roll1 + roll2)
    print("Your total is:" ,total)
    score1=score1 +total

    if roll1 is roll2:
        if total in even:
            score1=score1 +10
            print(score1)
            print("You rolled a double. Roll again.")
            continue
        elif total in odd:
            score1-score1 -5
            print(score1)
            print("You rolled a double. Roll again.")
            continue

    elif total in even:
        score1=score1 +10
        print(score1)
        break

    elif total in odd:
        score1=score1 -5
        print(score1)
        break

if score1<0:
    print("Player 1, you went under 0. Game over.")
    break

while True:
    print(" ")
    input("Press enter to roll player 2 ")
    print("Rolling dice!")
    roll1=random.randint(1,6)
    roll2=random.randint(1,6)
    print(roll1)
    print(roll2)
    total=(roll1 + roll2)
    print("Your total is:" ,total)
    score2=score2 +total

    if roll1 is roll2:
        if total in even:
            score2=score2 +10
            print(score2)
            print("You rolled a double. Roll again.")
            continue
        elif total in odd:
            score2=score2 -5
            print(score2)
            print("You rolled a double. Roll again.")
            continue

    elif total in even:
        score2=score2 +10
        print(score2)
        break

    elif total in odd:
        score2=score2 -5
        print(score2)
        break

if score2<0:
    print("Player 2, you went under 0. Game over.")
    break
范围(5)内的i的
:
尽管如此:
打印(“”)
输入(“按回车键滚动播放器1”)
打印(“滚动骰子!”)
roll1=random.randint(1,6)
roll2=random.randint(1,6)
打印(滚动1)
打印(第2卷)
总计=(滚动1+滚动2)
打印(“您的总数为:”,总计)
分数1=分数1+总计
如果roll1是roll2:
如果总计为偶数:
分数1=分数1+10
打印(分数1)
打印(“你滚了一个双人。再滚一次。”)
持续
以奇数计的elif总计:
比分1-1-5
打印(分数1)
打印(“你滚了一个双人。再滚一次。”)
持续
以偶数表示的elif总计:
分数1=分数1+10
打印(分数1)
打破
以奇数计的elif总计:
分数1=分数1-5
打印(分数1)
打破

如果score1可以做一件事来避免相同代码的重复,那就是定义一个函数,该函数接受玩家的号码并相应地修改该玩家的分数,比如
updateScore()
changeScore()
。参数是玩家的数量(1或2)以及您希望更改的点数。

为该循环创建一个定义

def roller(player_num):
    while True:
        print(" ")
        input("Press enter to roll player %s " % str(player_num))
        print("Rolling dice!")
        roll1=random.randint(1,6)
        roll2=random.randint(1,6)
        print(roll1)
        print(roll2)
        total=(roll1 + roll2)
        print("Your total is:" ,total)
        score1=score1 +total

        if roll1 is roll2:
            if total in even:
                score1=score1 +10
                print(score1)
                print("You rolled a double. Roll again.")
                continue
            elif total in odd:
                score1-score1 -5
                print(score1)
                print("You rolled a double. Roll again.")
                continue

        elif total in even:
            score1=score1 +10
            print(score1)
            break

        elif total in odd:
            score1=score1 -5
            print(score1)
            break

    if score1<0:
        print("Player %s, you went under 0. Game over." %s str(player_num)
        break

roller(1)
roller(2)
def辊(玩家数量):
尽管如此:
打印(“”)
输入(“按enter键滚动玩家%s”%str(玩家数量))
打印(“滚动骰子!”)
roll1=random.randint(1,6)
roll2=random.randint(1,6)
打印(滚动1)
打印(第2卷)
总计=(滚动1+滚动2)
打印(“您的总数为:”,总计)
分数1=分数1+总计
如果roll1是roll2:
如果总计为偶数:
分数1=分数1+10
打印(分数1)
打印(“你滚了一个双人。再滚一次。”)
持续
以奇数计的elif总计:
比分1-1-5
打印(分数1)
打印(“你滚了一个双人。再滚一次。”)
持续
以偶数表示的elif总计:
分数1=分数1+10
打印(分数1)
打破
以奇数计的elif总计:
分数1=分数1-5
打印(分数1)
打破

如果score1那么大的
while
循环对于玩家1和玩家2实际上是相同的,那么您应该将其作为一个函数,并将玩家的名称(或数字)作为参数传递

但还有更多:即使在函数内部,也存在大量冗余。例如,您检查成对和非成对情况下的辊是否均匀,您可以使用三元
进一步压缩该部分。。。如果。。。否则…
表达式。另外,请注意,代码中还有一些问题,例如,您似乎从未初始化
score1
score2
,并且在
score1-score1-5
中有一个打字错误。还有,什么是偶数,是所有偶数的列表?相反,您可以使用
total%2==0
检查
total
是否为偶数

此外,如果分数<0:
检查不在循环范围内,则您的
。如果这是有意的,那么
中断
就没有意义,因为它只会中断外部
for
循环,这可能不是有意的。此外,您还可以为分数不是
<0
的情况添加一些输出

将所有这些放在一起,函数可以如下所示:

def roll(player):
    score = 0
    while True:
        input("\nPress enter to roll, %s" % player)
        roll1 = random.randint(1,6)
        roll2 = random.randint(1,6)
        print("Rolling dice!", roll1, roll2)
        total = roll1 + roll2
        score += total
        score += 10 if total % 2 == 0 else -5
        print("Your total is:", score)
        if roll1 == roll2:
            print("You rolled a double. Roll again.")
        else:
            break
    if score < 0:
        print("%s, you went under 0. Game over." % player)
    else:
        print("%s, your final score is %d." % (player, score))

嗨,欢迎来到StackOverflow!像“请告诉我如何改进这一点”或一般要求为您编写代码这样的问题在这里并不受欢迎。如果你问一个关于错误或不确定性的简明问题,你更有可能得到一个礼貌且有根据的回答。也就是说,我建议您研究Python中的面向对象编程,并使用封装逻辑的
run()
方法实现一个类
Player
。这样,它将轻松扩展到700万玩家:)两个循环99.9%相同。只需将玩家的名字作为一个参数(并返回分数,如果需要的话,但似乎不是),然后调用该函数两次,一次调用玩家1,一次调用玩家2。因为你正在寻找解决方案,这是一件很难查找的事情,我建议你去读一下“函数”。它们是几乎任何语言的基本构建块,也是代码重用的头号工具。我会记住这一点,并感谢您的回答。除了Oliver的建议,在发布python代码时,请仔细检查标识,因为它可能是sintax错误的来源。感谢这一点。break语句用于表示如果分数低于0,那么如果分数高于0,则不会中断
for _ in range(5):
    roll("Player 1")
    roll("Player 2")