Python 如何创建一个生成器生成器来检测Tic Tac Toe中的获胜列?
作为我正在学习的Python MOOC的一部分,我想更好地理解Python 如何创建一个生成器生成器来检测Tic Tac Toe中的获胜列?,python,generator,list-comprehension,tic-tac-toe,Python,Generator,List Comprehension,Tic Tac Toe,作为我正在学习的Python MOOC的一部分,我想更好地理解generator的使用 这里有一个tic-tac-toe的练习,我想用generator检查一个获胜的棋盘 为了检测获胜的列我创建了3个不同的生成器, 是否有创建生成器的选项来创建所有3个生成器对象 board = [['x', '.', '.'], ['.', 'o', '.'], ['x', '.', '.']] player_mark = 'x' col1_winner = all(mark== player_mark fo
generator
的使用
这里有一个tic-tac-toe的练习,我想用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)
对创建生成器的一般情况很有帮助,但还不够。您可以使用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
很好,我在摸索这个