Tic Tac Toe和Minimax AI

时间:2015-01-08 21:13:40

标签: 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 个答案:

答案 0 :(得分:1)

您的代码示例缺少minimax算法的1个重要部分。你做最大的部分,但不是最小的部分。你敢于认为两位球员都会以更高的价值参加比赛。事实并非如此。对手将采用较低的值。因此,修改您确定的功能,以检查它是谁。如果是计算机,请采取与您一直相同的更高价值。但如果是对手,请按照下面这样的较低值:

if(value<best)
   best = val;

这可以解决你的问题。