如何在满足条件后立即中断while循环(而不是运行其余的代码)?

How to break while loop immediately after condition is met (and not run rest of code)?

提问人:Manpreet Singh 提问时间:12/1/2022 最后编辑:Manpreet Singh 更新时间:12/3/2022 访问量:325

问:

我有这个用 python 制作的骰子游戏,我正在使用函数进行评分逻辑(我相信这一切都按预期工作)。我把这些函数放在一个 while 循环中,这样当任何一个玩家达到 100 分时,游戏就结束了。但是,我无法让它按预期工作。

while int(player1Score) < 100 or int(player2Score) < 100:
    player1()
    player2()

这是其中一个函数(另一个函数相同,将分数添加到玩家 2 的变量中,并进行了一些输出更改):

def player1():
    global player1Score #global score to reference outside of function
    rTotal = 0 #running total - used when gamble
    
    print("\nPlayer 1 turn!")
    while 1==1:   
        d = diceThrow() #dicethrow output(s)
        diceIndexer(d)
        print(f"Dice 1: {dice1} \nDice 2: {dice2}")
        
        if dice1 == '1' and dice2 == '1': #both die = 1 (banked & running = 0)
            player1Score = 0
            rTotal = 0
            print("DOUBLE ONE! Banked total reset, Player 2's turn.")
            break
            
        elif dice1 == '1' or dice2 == '1': #either die = 1 (running = 0)
            rTotal = 0
            print("Rolled a single one. Player 2's turn!")
            break
                
        else: #normal dice roll - gamble or bank
            choice = input("Gamble (G) or Bank (B): ")
            choice = choice.upper() #incase lowercase letter given
                
            if choice == 'G': #if Gamble chosen - reroll dice & add to running
                rTotal += int(dice1) + int(dice2)
    
            elif choice == 'B': #used to save score.
                rTotal += int(dice1) + int(dice2)
                player1Score += rTotal
                print(f"\nPlayer 1 banked! Total: {player1Score}")
                break
    print("Turn over")

我试过将 while 循环中的“or”更改为“and”。虽然这确实停止得更快,但它并没有完全停止,因为其他玩家的分数高于 10。

python 布尔逻辑

评论

0赞 Michael Butscher 12/1/2022
至少“或”是错的,“和”是对的。我不明白“and”变体的问题。你能详细说明一下吗?
0赞 Manpreet Singh 12/1/2022
@MichaelButscher当我将 while 循环设置为“or”时,它会等待两者都高于 100 停止。选择“and”时,当玩家 1 达到 100 以上时,它会在玩家 2 的回合后停止,但当玩家 2 达到 100 以上时,它会按预期停止。

答:

0赞 Mircea Im 12/1/2022 #1

兄弟。

我阅读了您的代码,但我无法获得以下一些要点。

if dice1 == '1' and dice2 == '1': #both die = 1 (banked & running = 0)
            player1Score = 0

上面的代码使 player1Score 为零。 并且没有为 player2Score 添加分数代码。

因此,while 循环不会停止。 请先检查一下。

评论

0赞 Manpreet Singh 12/1/2022
这是一个功能,如果这个人得分为 1 双 1,他们的总分会下降到 0。关于这一点,这仅是玩家 1 的函数,我为玩家 2 提供了第二个函数,但用于 player2Score。
0赞 dev_master089 12/1/2022 #2

布尔逻辑的工作原理是这样的。

您希望在游戏运行时两个分数都小于 100,这也意味着其中一个分数不应为 100 或更高。

两者的分数都低于 100 分

int(player1Score) < 100 and int(player2Score) < 100

其中一个 socres 不是 100 或更高

!int(player1Score) >= 100 or !int(player1Score) >= 100

当您将“or”更改为“and”时,游戏没有停止的原因是,在调用 player1() 和 player2() 后,正在评估 player1Score 和 player2Score。即使玩家 1 的得分超过 100,游戏也不会停止,回合会转到玩家 2,进入下一个循环评估,最后停止循环。

要解决此问题,请将 player1() 和 player() 的 while 循环更改为 this。

while player1Score < 100:

并在计算分数后添加评估。

else: #normal dice roll - gamble or bank
    choice = input("Gamble (G) or Bank (B): ")
    choice = choice.upper() #incase lowercase letter given
    
    #    rTotal += int(dice1) + int(dice2)
    # rewriting the same code is a bad practice. 
    # In this case, you can just write the same code outside the if-else logic since if-else doesn't effect the code.

    rTotal += int(dice1) + int(dice2)

    if choice == 'G': #if Gamble chosen - reroll dice & add to running
        # added evaluation to stop the game
        if player1Score+rTotal >= 100:
            break
    if choice == 'B': #used to save score.
        player1Score += rTotal
        print(f"\nPlayer 1 banked! Total: {player2Score}")
        break

希望这会有所帮助。

评论

0赞 Manpreet Singh 12/2/2022
我明白你想说什么,但问题(如果你的意思是我应该替换)是循环中断,以便它进入下一个玩家的回合。我做了我原来的 while 循环,以便它会按顺序循环他们的回合,直到达到所需的分数。我看到的唯一其他解决方案是主要修改我的整个代码,我宁愿避免。while player1Score < 100:while 1==1:while int(player1Score) < 100 or int(player2Score) < 100:
0赞 dev_master089 12/5/2022
在这种情况下,对这两个循环都使用 ' while int(player1Score) < 100 或 int(player2Score) < 100: '。然后,即使循环进入下一个玩家,它也会立即停止。
0赞 Manpreet Singh 12/3/2022 #3

我所做的是在函数内部放置一个 if 语句(在 while 之外)以使用如下方式从函数返回一个值:return

def exampleFunction1():
    #scoring logic here
    if bank > finalScore: #Score to reach to win game
        print(f"Score is over {finalScore}!")
        return 0

然后在 while 循环中,将函数附加到变量,以便可以识别返回值。使用 while 循环的返回值:break

while True: #Breaks as soon as either player gets above 100 score
    x = exampleFunction1()
    if x == 0:
        break
    x = exampleFunction2()
    if x == 0:
        break

(旁注:我重写了我的整个程序,以采用一个函数并将其应用于不同的播放器,但我仍然使用了第二个所述的 while 循环)gameLogic()