嵌套列表中的嵌套循环
Nested loops in nested lists
我正在尝试在 python 中构建一个简单的 Tic-Tac-Toe 游戏,为了检查是否获胜,我正在使用嵌套循环在嵌套列表中搜索匹配项。出于某种原因,我的代码将只搜索第一个嵌套列表,而不是我预期的其余部分。
board = [ 'O', 'X', ' ', 'O', ' ', 'X', 'O', 'X', 'X' ]
wins = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
def checkWin(player):
win = False
for test in wins:
print (test)
count = 0
for squares in test:
if board[squares] == player:
count = count + 1
if count == 3:
win = True
return win
if __name__ == '__main__':
print ("\nChecking board for X win ...\n")
if checkWin("X"):
print ("Game over, X wins!")
print ("\nChecking board for O win ...\n")
if checkWin("O"):
print ("Game over, O wins")
根据棋盘,预计 O 会获胜,这是我得到的输出:
Checking board for X win ...
[0, 1, 2]
Checking board for O win ...
[0, 1, 2]
有人知道为什么会这样吗?
您 return 来自第一个嵌套列表测试,不管 这三个方块是否匹配。相反,只有 return 如果 win
为真:
def checkWin(player):
win = False
for test in wins:
count = 0
for squares in test:
if board[squares] == player:
count = count + 1
if count == 3:
win = True
if win:
return True
return False
如果win
为false,上面继续下一个嵌套列表进行下一次测试。
更好的是,当 count
设置为 3
时,只需 return,因为您知道您在那个阶段找到了匹配项:
def checkWin(player):
for test in wins:
count = 0
for squares in test:
if board[squares] == player:
count = count + 1
if count == 3:
return True
return False
您可以使用 all()
function:
而不是计数
def checkWin(player):
for test in wins:
if all(board[square] == player for square in test):
return True
return False
all()
returns False
早,一旦生成器表达式中的测试之一失败。
并且终极版增加any()
一行完成测试:
def checkWin(player):
return any(all(board[square] == player for square in test)
for test in wins)
演示:
>>> board = [ 'O', 'X', ' ', 'O', ' ', 'X', 'O', 'X', 'X' ]
>>> wins = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
>>> def checkWin(player):
... return any(all(board[square] == player for square in test)
... for test in wins)
...
>>> checkWin('X')
False
>>> checkWin('O')
True
我正在尝试在 python 中构建一个简单的 Tic-Tac-Toe 游戏,为了检查是否获胜,我正在使用嵌套循环在嵌套列表中搜索匹配项。出于某种原因,我的代码将只搜索第一个嵌套列表,而不是我预期的其余部分。
board = [ 'O', 'X', ' ', 'O', ' ', 'X', 'O', 'X', 'X' ]
wins = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
def checkWin(player):
win = False
for test in wins:
print (test)
count = 0
for squares in test:
if board[squares] == player:
count = count + 1
if count == 3:
win = True
return win
if __name__ == '__main__':
print ("\nChecking board for X win ...\n")
if checkWin("X"):
print ("Game over, X wins!")
print ("\nChecking board for O win ...\n")
if checkWin("O"):
print ("Game over, O wins")
根据棋盘,预计 O 会获胜,这是我得到的输出:
Checking board for X win ...
[0, 1, 2]
Checking board for O win ...
[0, 1, 2]
有人知道为什么会这样吗?
您 return 来自第一个嵌套列表测试,不管 这三个方块是否匹配。相反,只有 return 如果 win
为真:
def checkWin(player):
win = False
for test in wins:
count = 0
for squares in test:
if board[squares] == player:
count = count + 1
if count == 3:
win = True
if win:
return True
return False
如果win
为false,上面继续下一个嵌套列表进行下一次测试。
更好的是,当 count
设置为 3
时,只需 return,因为您知道您在那个阶段找到了匹配项:
def checkWin(player):
for test in wins:
count = 0
for squares in test:
if board[squares] == player:
count = count + 1
if count == 3:
return True
return False
您可以使用 all()
function:
def checkWin(player):
for test in wins:
if all(board[square] == player for square in test):
return True
return False
all()
returns False
早,一旦生成器表达式中的测试之一失败。
并且终极版增加any()
一行完成测试:
def checkWin(player):
return any(all(board[square] == player for square in test)
for test in wins)
演示:
>>> board = [ 'O', 'X', ' ', 'O', ' ', 'X', 'O', 'X', 'X' ]
>>> wins = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
>>> def checkWin(player):
... return any(all(board[square] == player for square in test)
... for test in wins)
...
>>> checkWin('X')
False
>>> checkWin('O')
True