【问题标题】:Setting variable to True does not exit while False loop当 False 循环时,将变量设置为 True 不会退出
【发布时间】:2021-09-26 05:34:13
【问题描述】:

我正在使用 Python 制作井字游戏,我几乎完成了,但我遇到了 while 循环的问题。这是我用来检查玩家是否拥有的函数的简化版本。

def check_win(board, marker):
    win = False
    if board['A1'] == marker and board['B1'] == marker and board['C1'] == marker:
        print(f'{marker} wins!')
        win = True
    return win

这是在我的代码中。

player_win = False
while player_win == False:
    # Player1's turn
    board_dict = get_and_place_marker(board_dict, player1)
    display_board(board_dict)
--> player_win = check_win(board_dict, player1)
    # Player2's turn
    board_dict = get_and_place_marker(board_dict, player2)
    display_board(board_dict)
--> player_win = check_win(board_dict, player2)

在 check_win() 的第一个实例中,它确实将 player_win 分配给 True,但它不会退出循环。它转到 Player2 的代码,然后在 Player2 获胜时退出。我在这里做错了什么? player_win 被赋值为 True 的第一刻不应该退出循环吗?

【问题讨论】:

  • 使用调试器。
  • 在while循环的开始,它会检查player_win,然后在再次检查之前执行整个循环。您可以使用 if 语句和 break 语句在循环中间中断。
  • "player_win 被赋值为 True 的第一刻不应该退出循环吗?"你为什么这么相信?您最初是从哪里了解到 while 循环的,该来源告诉您检查发生的时间?
  • 我投票结束这个问题,因为 Stack Overflow 无意取代现有的教程和文档。

标签: python while-loop boolean


【解决方案1】:

如果玩家 1 获胜,您仍然让玩家 2 有机会进行非获胜的移动,在这种情况下循环继续。条件不会因为条件中的变量发生变化而在循环体中间隐式计算。

不要让两个玩家在每次迭代中轮流,而是更改代码,以便恰好一个玩家轮流,每次在玩家之间交替。

from itertools import cycle

for player in cycle([player1, player2]):
    board_dict = get_and_place_marker(board_dict, player)
    if check_win(board_dict, player):
        break

然后您可以检查player 的值以查看循环退出后实际获胜的情况。

【讨论】:

  • 我的直觉反应是不应该回答这个问题,但是这个代码解决方案非常优雅。但是,答案并没有真正解决 OP 的误解(即:“不应该将 player_win 的第一时刻分配为 True 退出循环吗?”应该明确回答)。
猜你喜欢
  • 2015-11-27
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多