Python TicTacToe minimax选择错误选项

我目前正在尝试为我的Python井字游戏实现一个AI。一切运行良好,除了一个特定情况。我当前的代码如下:

def testLine(line):    '''    ' :param line: Liste containing 3 ints    ' :return:   1, if all elements of the list == 1    '           -1, if all elements of the list == -1    '            0, otherwise    '''    if line[0] == 1 and line[1] == 1 and line[2] == 1:        return 1    elif line[0] == -1 and line[1] == -1 and line[2] == -1:        return -1    return 0def getWinner(board):    # test columns    for idx in range(3):        line = [board[0][idx], board[1][idx], board[2][idx]]        if not testLine(line) == 0:            return line[0]    # test rows    for idx in range(3):        line = board[idx]        if not testLine(line) == 0:            return line[0]    # test diagonals    line = [board[0][0], board[1][1], board[2][2]]    if not testLine(line) == 0:        return line[0]    line = [board[0][2], board[1][1], board[2][0]]    if not testLine(line) == 0:        return line[0]    # no winner    return 0def count(board, obj):    c = 0    for r in range(len(board)):        for col in range(len(board[r])): # FIXED IT            if board[r][col] == obj:                c += 1    return cdef nextMove(board, player):    if len(board[0]) + len(board[1]) + len(board[2]) == 1: return 0, 4    nextPlayer = player * (-1)    if not getWinner(board) == 0:        if player is 1: return -1, (-1, -1)        else: return 1, (-1, -1)    listOfResults = [] # empty array    if count(board, 0) == 0: # there is no empty field        return 0, (-1, -1)    _list = []    for i in range(len(board)):        for j in range(len(board[i])):            if board[i][j] == 0:                _list.append((i, j))    for (i, j) in _list:        board[i][j] = player        ret, move = nextMove(board, nextPlayer)        listOfResults.append(ret)        board[i][j] = 0    if player is 1:        maxPossibleValue = max(listOfResults)        return maxPossibleValue, _list[listOfResults.index(maxPossibleValue)]    else:        minPossibleValue = min(listOfResults)        return minPossibleValue, _list[listOfResults.index(minPossibleValue)]if __name__ == '__main__':    print(str(nextMove([[ 1,  -1,  0],                        [ -1, -1,  1],                        [ 1,  1,  0]],                       -1)))

输出: (0, (0, 2))

我可以肯定地说countgetWinnertestLine运行得很完美。但是代码最底部的这个场景的输出是错误的,因为它应该是(0, 2, 2),因为计算机必须“阻止”我在底行获胜的机会。你对如何修复我的minimax算法有建议吗?

编辑:我已经修复了它。 错误出在count方法中。你不应该说

for col in board[r]

而应该说

for col in range(len(board[r]))

因为否则它不会保持元素的正确顺序,整个方法会返回一个错误的值。


回答:

我已经修复了它。错误出在count方法中。你不应该说

for col in board[r]

而应该说

for col in range(len(board[r]))

因为否则它不会保持元素的正确顺序,整个方法会返回一个错误的值。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注