【问题标题】:Tic Tac Toe and Minimax AI井字游戏和 Minimax AI
【发布时间】:2015-01-08 21:13:39
【问题描述】:

这是我的基本井字游戏代码(减去实际游戏类和我的测试)。 我在编写实际的极小极大算法时遇到了麻烦。我很难验证实际发生了什么,但这段代码似乎只是从当前状态返回一个随机移动。

我的想法是,我无法在 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

【问题讨论】:

  • 嗯,你不应该返回最好的否定吗?因为你最好的一步是你对手最坏的一步,明白我的意思吗?
  • 那里肯定有我遗漏的条件,但我认为我首先在这个算法中遗漏了几个步骤,而且我已经用头撞了几天没有结果。

标签: python algorithm recursion minimax


【解决方案1】:

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

if(value<best)
   best = val;

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

【讨论】:

  • 嗨!感谢您的回答,我实际上有几个问题,其中最重要的是您的评论。我最终完成了算法,它必须被分成算法本身和第一次运行的包装器。 github.com/mekhami/tictactoe/blob/master/ttt.py 这有更新的算法和包装器(分别是 minimax() 和 determine()),它就像一个魅力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 2015-03-11
相关资源
最近更新 更多