python - 井字游戏和 Minimax AI

标签 python algorithm recursion minimax

这是我的基本 Tic Tac Toe 程序代码(减去实际的游戏类和我的测试)。 我在编写实际的 minimax 算法时遇到了问题。我很难验证实际发生了什么,但这段代码似乎只是从当前状态返回随机移动。

我的想法是,我无法在 minimax() 中初始化“最佳”变量,因为每次调用该函数时它都会被覆盖...此时我真的迷路了。

任何人都可以指出我在这个算法上的正确方向吗?我觉得我已经很接近了,但是缺少一些关于递归的关键点或概念,它们将把所有这些放在一起。

def makeMove(board, player, location):
    gridlist = list(board)
    gridlist[location] = player
    return ''.join(gridlist)

def printBoard(board):
    return board

def winner(board):
    for row in winning_combos:
        if (board[row[0]] is not ' ') and (equal([board[i] for i in row])):
            return board[row[0]]

def equal(row):
    return row == [row[0]] * 3

winning_combos = [
        [0, 1, 2], [3, 4, 5], [6, 7, 8],
        [0, 3, 6], [1, 4, 7], [2, 5, 8],
        [0, 4, 8], [2, 4, 6]]

def availableMoves(board):
    return [k for k, v in enumerate(board) if v == ' ']

def isComplete(board):
    if availableMoves(board) == []:
        return True
    elif winner(board):
        return True
    else:
        return False

def x_won(board):
    return winner(board) == 'x'

def o_won(board):
    return winner(board) == 'o'

def tied(board):
    return isComplete(board) and winner(board) is None

def get_enemy(player):
    if player == 'x':
        return 'o'
    else:
        return 'x'

def score(board):
    if x_won(board):
        return 10
    elif o_won(board):
        return -10
    elif tied(board):
        return 0


def determine(board, player):
    if isComplete(board):
        return score(board)
    best = 0
    for move in availableMoves(board):
        board = makeMove(board, player, move)
        val = determine(board, get_enemy(player))
        print val
        if val > best:
            best = val
    return best

最佳答案

您的代码示例缺少极小极大算法的 1 个关键部分。你正在做最大的部分,而不是最小的部分。您假设两位玩家总是会以更高的值(value)下棋。那不是真的。对手将取较低的值。所以修改你的确定函数来检查轮到谁了。如果轮到计算机了,像你一直在做的那样取更高的值。但是如果轮到对方了,就这样取较低的值:

if(value<best)
   best = val;

这应该可以解决您的问题。

关于python - 井字游戏和 Minimax AI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27849607/

相关文章:

PHP 解析目录和子目录的文件路径和仅 jpg 图片类型的名称

python - 一个类的成员元组(而不是成员变量)?

python - 初学者 python 编程帮助交叉淡化声音

algorithm - 开发线性时间算法来遍历图

algorithm - 子矩阵 NxN 矩阵和具有 N 个非零值的最大和,仅 O(N^2)

c++ - 如何在控制台中正确显示二叉搜索树?

python - pylint 解析器 - Jenkins 违规插件的独立替代方案

python - 属性错误: 'Series' object has no attribute 'columns'

javascript - 基于二维数组生成测试用例

java - 为什么不能将 LinkedList 的最后一个节点设置为 null?