-1

我目前正在为我的一个课程做一个项目,我必须使用 minmax 和 Alpha-Beta minmax 算法来实现一个 AI 对手来玩井字游戏来确定动作。

然而,我遇到的问题是试图为棋盘生成一个可能的移动列表。

我的问题代码如下

def genMoves(genBoard, turnNumber):
    moveList = []

    print "inMovesList"
    #Figure out if X or O go now

    if turnNumber % 2 == 0:
        moveChar = "O"
    else:
        moveChar = "X"

    i = 0;

    while i < 9:
        tempBoard = genBoard
        if tempBoard[i] == "*":
            #set tempBoard[i] to X or O
            tempBoard[i] = moveChar
            #append move, new board
            moveList.append((i, tempBoard))

        i+=1

    print "MovesList: "
    print moveList
    return moveList

我的板表示为初始化为 9 个字符串的列表["*", "*", "*", "*", "*", "*", "*", "*", "*"]

我的目标是让 move list 返回一个元组列表,元组的第一个元素是 i (插入 X 或 O 的位置​​),第二个元素是结果板。

我遇到的问题是我会收到一个包含正确数量的可能移动的列表(例如:如果我手动播放双方的前 4 个移动,它只会给我 5 个可能的移动)但是它会在每个移动中放置相同的移动包含 * 的位置。(所以它最终会为可能的第二步生成类似 X,O,O,O,O,O,O,O,O 的东西)

这不是我第一次不得不使用 minmax,但这是我第一次不得不在 python 中使用它。

有关如何解决此问题的任何建议都会有所帮助!

谢谢!

4

2 回答 2

1

这条线有问题:

tempBoard = genBoard

在这一行之后,您似乎认为您有两个列表 - 原始列表,仍然由 引用genBoard,以及一个新列表,现在由 引用tempBoard。不是这种情况。

此行不会创建列表的副本。相反,它绑定名称tempBoard以引用绑定到的同一对象genBoard

因此,随后对 的引用tempBoard[i]也会影响genBoard[i].

请尝试其中一种:

tempBoard = list(genBoard)
tempBoard = genBoard[:]
tempBoard = copy.copy(genBoard)

这些行中的每一行都会创建一个新列表,其初始内容与genBoard. tempboard绑定到这个新列表,同时genboard仍然绑定到旧列表。

如果有问题的对象比字符串列表更复杂,您可能需要这样做:

tempBoard = copy.deepcopy(genBoard)
于 2013-03-22T18:11:55.240 回答
0

我相信 Python 不会创建您的 Board 的副本,而只是指向原始版本。因此您的打印输出是:

"移动列表:" [[0,(X,O,O,O,O,O,O,O,O)],[1,(X,O,O,O,O,O,O,O,O )],[2,(X,O,O,O,O,O,O,O,O)]等。

并且您的 genBoard, 变量已更改。

测试添加

打印板

在你的方法结束之前

如果这确实是问题,请尝试谷歌如何创建您的董事会副本而不是引用它。

于 2013-03-22T17:55:39.830 回答