合并两个while循环

时间:2018-10-23 13:42:42

标签: python loops while-loop

我有两个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

如您所见,除了玩家1和玩家2以及得分1达到得分2以外,它们实际上是相同的。如何简化此代码?

3 个答案:

答案 0 :(得分: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)

我不确定为什么要使用break语句,因为这样一来就会打断循环,但是在这里,您已经定义了代码,并且每个用户都在使用它

答案 1 :(得分:0)

为避免重复相同的代码,您可以做的一件事就是定义一个函数,该函数接收玩家的人数并相应地修改该玩家的得分,例如updateScore()changeScore()。参数是玩家人数(1或2)以及您要更改多少点。

答案 2 :(得分:0)

那个大的while循环对于播放器1和播放器2几乎是相同的,因此您应该使其成为一个函数并将播放器的名称(或编号)作为参数传递。

但是还有更多:即使在函数内部,也有很多冗余。例如,您检查配对和非配对情况下的掷骰是否均等,并且可以使用三元... if ... else ...表达式进一步压缩该部分。另外,请注意,您的代码中还有其他一些问题,例如您似乎从未初始化过score1score2,并且score1-score1 -5中有一个错字。此外,even是什么,所有偶数的列表?相反,您可以使用total % 2 == 0检查total是否为偶数。

此外,您的if score < 0:支票不在循环中。如果这样做是故意的,那么break就没有意义了,因为它只会跳出外部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))

现在,只需调用该函数两次即可:

for _ in range(5):
    roll("Player 1")
    roll("Player 2")