我正在撞墙试图为tic-tac-toe实施negamax
def negamax(board_obj, mark, depth)
if board_obj.game_over?
return value(board_obj)
else
max = -1.0/0 # negative infinity
if mark == @mark
next_mark = @opponent_mark
else
next_mark = @mark
end
board_obj.empty_squares.each do |square|
board_obj[square] = mark
x = -negamax(board_obj, next_mark, depth + 1)
board_obj[square] = ' '
if x > max
max = x
@scores << x
@best_move = square if depth == 1
end
end
return max
end
end
# determines value of final board state
def value(board_obj)
if board_obj.mark_win?(@mark)
return 1
elsif board_obj.mark_win?(@opponent_mark)
return -1
else
return 0
end
end
其余代码在这里:https://github.com/dave-maldonado/tic-tac-doh/blob/AI/tic-tac-doh.rb
它确实产生了结果,但人工智能很容易被击败所以我知道出了什么问题,任何帮助 非常感谢!
答案 0 :(得分:1)
问题是value
需要相对于mark
当前执行中的negamax
,而不是始终相对于计算机。如果您使用以下mark
的修改定义将value
参数从negamax
传递给value
,您将获得正确的结果:
def value(board_obj, mark)
if board_obj.mark_win?(mark)
return 1
elsif board_obj.mark_win?(mark == 'X' ? 'O' : 'X')
return -1
else
return 0
end
end
也就是说,negamax
身体的前两行需要:
if board_obj.game_over?
return value(board_obj, mark)
也就是说,相对于Ruby,良好的设计原则等,这个整体计划留下了很多不足之处(没有违法行为)。现在您已经运行了,您可能希望转到Code Review SE获取一些反馈。 :-)虽然现在使用TDD已经太晚了;-),但是进行“测试”也是一个不错的选择。
此外,请理解,根据其他评论,这不是一个问题,你通常会在这里得到答案。我甚至不知道这个问题是否能够在审查过程中继续存在而不会被删除。我出于各种个人原因对其进行了研究。
更新:查看您的参考实现,您会注意到negamax代码包含表达式sign[color]*Analysis(b)
。这是sign[color]
,你有效地失踪了。