提问人:Manpreet Singh 提问时间:12/1/2022 最后编辑:Manpreet Singh 更新时间:12/3/2022 访问量:325
如何在满足条件后立即中断while循环(而不是运行其余的代码)?
How to break while loop immediately after condition is met (and not run rest of code)?
问:
我有这个用 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。
答:
兄弟。
我阅读了您的代码,但我无法获得以下一些要点。
if dice1 == '1' and dice2 == '1': #both die = 1 (banked & running = 0)
player1Score = 0
上面的代码使 player1Score 为零。 并且没有为 player2Score 添加分数代码。
因此,while 循环不会停止。 请先检查一下。
评论
布尔逻辑的工作原理是这样的。
您希望在游戏运行时两个分数都小于 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
希望这会有所帮助。
评论
while player1Score < 100:
while 1==1:
while int(player1Score) < 100 or int(player2Score) < 100:
我所做的是在函数内部放置一个 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()
评论