我目前正在为我的一个课程开展一个项目,我必须使用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中使用它。
有关如何解决此问题的任何建议都会有所帮助!
谢谢!
答案 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
直接在方法结束之前
如果确实存在问题,请尝试谷歌如何创建您的主板的副本而不是引用它。