我在寫一個Python腳本,它應該允許人類和電腦玩家玩井字遊戲。爲了表示棋盤,我使用了3x3的Numpy陣列,其中1
和0
用於玩家的標記(而不是「X」和「O」)。我已經寫了下面的函數來決定勝負:如何使功能決定Tic-Tac-Toe的優勝者更簡潔
import numpy as np
class Board():
def __init__(self, grid = np.ones((3,3))*np.nan):
self.grid = grid
def winner(self):
rows = [self.grid[i,:] for i in range(3)]
cols = [self.grid[:,j] for j in range(3)]
diag = [np.array([self.grid[i,i] for i in range(3)])]
cross_diag = [np.array([self.grid[2-i,i] for i in range(3)])]
lanes = np.concatenate((rows, cols, diag, cross_diag))
if any([np.array_equal(lane, np.ones(3)) for lane in lanes]):
return 1
elif any([np.array_equal(lane, np.zeros(3)) for lane in lanes]):
return 0
因此,舉例來說,如果我執行
board = Board()
board.grid = np.diag(np.ones(3))
print board.winner()
我得到的結果1
。令我困擾的是any
聲明的重複。我想會有一個更簡潔,乾爽的編碼方式。 (我正在考慮使用MATLAB中的開關/外殼,但在Python中並不存在)。有什麼建議麼?
提供任何生成器表達式比列表理解更有效率。 「任何」短路,即一旦它獲得了真元素,它就會停止評估其他元素。但是,如果你通過一個列表comp,整個列表必須在'any'開始工作之前建立。然而如果你通過一個像任何一個gen exp(np.array_equal(lane,np.ones(3))的泳道,那麼gen exp甚至不會生成後面的元素。類似的評論適用於「全部」。 –