如何创建一个生成器的生成器来检测 Tic-Tac-Toe 中的获胜列?
How to Create a generator of generators to detect a winning column in Tic-Tac-Toe?
作为我正在学习的 Python MOOC 的一部分,我想更好地理解 generator
的用法。
有一个井字游戏的练习,我想用生成器来实现对获胜棋盘的检查。
为了检测获胜的 列 我创建了 3 个不同的生成器,
是否有创建生成器以创建所有 3 个生成器对象的选项?
board = [['x', '.', '.'], ['.', 'o', '.'], ['x', '.', '.']]
player_mark = 'x'
col1_winner = all(mark== player_mark for (mark, _, _) in board)
col2_winner = all(mark== player_mark for (_, mark, _) in board)
col3_winner = all(mark== player_mark for (_, _, mark) in board)
为了检测行中的胜利,我写了这个:
any(mark1 == mark2 == mark3 == player_mark for (mark1, mark2 , mark3) in board)
how-to-check-if-all-elements-of-a-list-matches-a-condition 很有帮助,但对于创建生成器的一般情况来说还不够。
您可以使用 zip(*board)
获取列的迭代器。例如:
board = [['x', '.', 'x'], ['x', 'o', '.'], ['x', '.', '.']]
player_mark = 'x'
col_win = any(all(mark == player_mark for mark in col) for col in zip(*board) )
col_win
#True
然后这可以与行有很好的对称性:
row_win = any(all(mark == player_mark for mark in row) for row in board )
如果你使用 numpy 数组,你可以很容易地找到行,列与 np.sum 和对角线的总和以及 np.trace -
import numpy as np
x=np.array([[1,0,-1],[0,1,-1],[-1,0,1]])
-->array([[ 1, 0, -1],
[ 0, 1, -1],
[-1, 0, 1]])
np.sum(x,axis=1)
-->array([0, 0, 0])
np.sum(x,axis=0)
-->array([ 0, 1, -1])
np.trace(x)
-->3
np.trace(np.fliplr(x))
-->-1
作为我正在学习的 Python MOOC 的一部分,我想更好地理解 generator
的用法。
有一个井字游戏的练习,我想用生成器来实现对获胜棋盘的检查。
为了检测获胜的 列 我创建了 3 个不同的生成器, 是否有创建生成器以创建所有 3 个生成器对象的选项?
board = [['x', '.', '.'], ['.', 'o', '.'], ['x', '.', '.']]
player_mark = 'x'
col1_winner = all(mark== player_mark for (mark, _, _) in board)
col2_winner = all(mark== player_mark for (_, mark, _) in board)
col3_winner = all(mark== player_mark for (_, _, mark) in board)
为了检测行中的胜利,我写了这个:
any(mark1 == mark2 == mark3 == player_mark for (mark1, mark2 , mark3) in board)
how-to-check-if-all-elements-of-a-list-matches-a-condition 很有帮助,但对于创建生成器的一般情况来说还不够。
您可以使用 zip(*board)
获取列的迭代器。例如:
board = [['x', '.', 'x'], ['x', 'o', '.'], ['x', '.', '.']]
player_mark = 'x'
col_win = any(all(mark == player_mark for mark in col) for col in zip(*board) )
col_win
#True
然后这可以与行有很好的对称性:
row_win = any(all(mark == player_mark for mark in row) for row in board )
如果你使用 numpy 数组,你可以很容易地找到行,列与 np.sum 和对角线的总和以及 np.trace -
import numpy as np
x=np.array([[1,0,-1],[0,1,-1],[-1,0,1]])
-->array([[ 1, 0, -1],
[ 0, 1, -1],
[-1, 0, 1]])
np.sum(x,axis=1)
-->array([0, 0, 0])
np.sum(x,axis=0)
-->array([ 0, 1, -1])
np.trace(x)
-->3
np.trace(np.fliplr(x))
-->-1