生成Python Tic-Tac-Toe的可能移动列表

时间:2013-03-22 17:43:03

标签: python list tic-tac-toe minmax

我目前正在为我的一个课程开展一个项目,我必须使用minmax和Alpha-Beta minmax算法来实现AI对手来玩tic-tac-toe来确定动作。

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

我的问题代码如下

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个字符串的列表。

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

&#34; MovesList:&#34; [[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,变量已更改。

测试添加

打印genBoard

直接在方法结束之前

如果确实存在问题,请尝试谷歌如何创建您的主板的副本而不是引用它。