我目前正在尝试为我的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))
我可以肯定地说count
、getWinner
和testLine
运行得很完美。但是代码最底部的这个场景的输出是错误的,因为它应该是(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]))
因为否则它不会保持元素的正确顺序,整个方法会返回一个错误的值。