字典值上的 For 循环返回不正确的布尔值

For Loop on Dictionary Values Returning Incorrect Bool Value

提问人:C_b3al 提问时间:11/17/2023 更新时间:11/19/2023 访问量:18

问:

我正在学习用 python 编码,并尝试编写一个井字游戏。我使用了一个函数来评估游戏是否已绘制(应该只有一个实例是 True - 其中 3x3 网格中的所有空格都由 Xs 或 O 填充),但它返回了网格特定排列的错误值。

当玩家尝试时,棋盘的原始字典值(数字 1-9)被替换为 Xs/O(例如下面的)。

# board prior to starting game
board1 = {1:'1', 2:'2', 3:'3', 4:'4', 5:'5', 6: '6', 7: '7', 8:'8', 9:'9'}

# board after 3 turns
board4 = {1:'X', 2:'O', 3:'X', 4:'4', 5:'5', 6: '6', 7: '7', 8:'8', 9:'9'}

这是我正在使用的功能和我遇到的问题。

def game_drawn(board):
    for i in board.values():
        if i not in ['1','2','3','4','5','6','7','8','9']:
            game_drawn = True
        else:
            game_drawn = False
    return game_drawn

board9 = {1:'X', 2:'O', 3:'X', 4:'O', 5:'O', 6: 'X', 7: '7', 8:'X', 9:'O'}

print(game_drawn(board9))

# calling the function on this particular arrangement returns True, when it should return False. I've not had this problem with any other arrangement of the grid. 

在此处输入图像描述

我尝试要求程序在循环运行时打印每个 i 值,然后打印函数的结果;似乎当循环到达“7”时,它不会运行布尔运算,而是跳到下一个值 i。

测试结果

循环 字典 for 循环 if-statement 布尔

评论

0赞 Scott Hunter 11/17/2023
使用调试器来跟踪执行的操作将清楚地表明问题所在。game_drawn
0赞 Scott Hunter 11/17/2023
了解修改后的程序的输出以实际查看程序的修改版本会有所帮助。

答:

0赞 C_b3al 11/17/2023 #1

我陈述的逻辑是不正确的:每次迭代都覆盖了前一次迭代;因此,只要棋盘中第 9 个位置的值 != 9,函数的结果就是真的。ifi

我更改了函数以将 Y 或 N 值写入新列表,具体取决于是否可以在我比较的列表中找到该值。然后,使用单独的语句,我可以根据新列表中是否存在 N 值来评估游戏是赢了还是平了。iif

解决这个问题有点迂回,但它正在工作。

def game_drawn(board):
    drawn = []
    for i in board.values():
        if i not in ['1','2','3','4','5','6','7','8','9']:
            drawn.append('Y')
        else:
            drawn.append('N')
    if 'N' in drawn:
        game_drawn = False
    else:
        game_drawn = True
    return game_drawn

board9 = {1:'X', 2:'O', 3:'X', 4:'O', 5:'O', 6: 'X', 7: '7', 8:'X', 9:'O'}

print('Board 9: ' + str(game_drawn(board9)))