【发布时间】:2013-12-13 08:49:53
【问题描述】:
我正在尝试在 lua 中编写井字游戏,并计划使用极小极大算法来决定非人类动作。第一步涉及从单个输入状态生成所有可能的板状态树。我试图递归地做到这一点,但似乎无法弄清楚如何。 (我认为)我在概念上理解这应该如何完成,但是在 lua 中实现它时遇到了麻烦。
我正在尝试按以下方式构建我的树。每个节点都是一个包含两个字段的列表。
{ config = {}, children = {} }
Config 是一个整数列表 (0,1,2),代表空、X 和 O,并定义 TTT 板状态。 Children 是一个列表节点,它是所有可能的棋盘状态,距离当前节点一移动。
这是我目前必须构建游戏树的函数
function tree_builder(board, player)
supertemp = {}
for i in ipairs(board.config) do
--iterate through the current board state.
--for each empty location create a new node
--representing a possible board state
if board.config[i] == 0 then
temp = {config = {}, children = {}}
for j in ipairs(board.config) do
temp.config[j] = board.config[j]
end
temp.config[i] = player
temp.children = tree_builder(temp, opposite(player))
supertemp[i] = temp
end
end
return supertemp
end
函数调用方式如下:
start_board = {config = {1,0,0,0}, children = {} }
start_board.children = tree_builder(start_board, 1)
当我注释掉函数的递归元素(“temp.children = builder(temp, reverse(player))”行)并且只生成第一级子级时。输出是正确的。当通过概念上相同的代码调用时(我使用的是love2D,因此格式不同):
for i in pairs(start_board.children) do
print (start_board.children[i].config)
三个孩子是:
1,1,0,0
1,0,1,0
1,0,0,1
但是,一旦我添加了递归元素,以下是相同的三个子元素的输出
1,1,2,1
1,1,2,1
1,1,2,1
我一直在网上寻求帮助,我发现的大部分内容本质上是概念性的,或者涉及不同语言的实现。我相信我错误地实现了递归元素,但无法理解原因。
【问题讨论】:
-
我没有仔细查看您的代码,但您似乎使用了全局变量
supertemp和temp。请改用局部变量。
标签: algorithm recursion tree lua