如何使用 numpy 缩短井字棋检查

问题描述 投票:0回答:2

如何使用 numpy 来缩短我的代码,我会检查你是否赢了

我需要找到一种方法来使用 numpy 来适应我的代码,因为它又长又难。 我检查了 diag、horizontle 和 row,但我需要找到一种方法来用 numpy 缩短它

def checkHorizontle(board):
    global winner
    if board[0] == board[1] == board[2] and board[1] != "-":
        winner = board[0]
        return True
    elif board[3] == board[4] == board[5] and board[3] != "-":
        winner = board[3]
        return True
    elif board[6] == board[7] == board[8] and board[6] != "-":
        winner = board[6]
        return True

    
def checkRow(board):
    global winner
    if board[0] == board[3] == board[6] and board[0] != "-":
        winner = board[0]
        return True
    elif board[1] == board[4] == board[7] and board[1] != "-":
        winner = board[1]
        return True
    elif board[2] == board[5] == board[8] and board[2] != "-":
        winner = board[2]
        return True


def checkDiag(Board):
    global winner
    if board[0] == board[4] == board[8] and board[0] != "-":
        winner = board[0]
        return True
    elif board[2] == board[4] == board[6] and board[2] != "-":
        winner = board[2]
        return True

当我试图找到解决方案时,我的想法只是决定退出。我知道你可以用魔方找到它和 numpy 乘法函数,但我不知道怎么做

python numpy tic-tac-toe magic-square
2个回答
0
投票

不需要numpy,可以使用简单的循环:

WINNING_TRIPLETS = [ (0, 1, 2), (3, 4, 5), ...] # add all of them

for square1, square2, square3 in WINNING_TRIPLETS:
    if ...: # same logic as in your code, but only once with square1, square2, square3

0
投票

假设有一个这样的棋盘并想检查

X
是否赢了:

board = np.array([['X', 'O', np.nan],
                  ['O', 'X', np.nan],
                  ['X', 'X', 'X']])

您可以对行、列和对角线使用 4 个测试:

# check if any row is won
(board == 'X').all(axis=1).any()

# check if any column is won
(board == 'X').all(axis=0).any()

# check diagonals
diag1 = np.diagonal(board)
diag2 = np.diagonal(np.fliplr(board))
(diag1 == 'X').all() or (diag2 == 'X').all()

在测试中使用:

if ((board == 'X').all(axis=1).any() 
   or (board == 'X').all(axis=0).any()
   or (np.diagonal(board) == 'X').all()
   or (np.diagonal(np.fliplr(board)) == 'X').all()
   ):
    print('X won')

如果你想检查是否有玩家获胜:

# check if any row is won
(board[0] == board[1:]).all(0).any()

# check if any column is won
(board[:, [0]] == board[:, 1:]).all(1).any()

# check diagonals
diag1 = np.diagonal(board)
diag2 = np.diagonal(np.fliplr(board))
(diag1[0] == diag1[1:]).all() or (diag2[0] == diag2[1:]).all()
© www.soinside.com 2019 - 2024. All rights reserved.