【发布时间】:2013-06-27 01:19:07
【问题描述】:
我正试图为井字游戏实现 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
它确实会产生结果,但 AI 很容易被击败,所以我知道出了点问题,任何帮助 不胜感激!
【问题讨论】:
-
您对哪里出了问题有什么看法? Stackoverflow 不能很好地处理刚刚扔给我们的代码。但如果您能向我们提出一些具体问题,我们很乐意为您提供帮助
-
negamax 函数的参考实现您使用什么?
-
最初在我的实现中遵循hamedahmadi.com/gametree/#negamax,但不是在每次迭代之前制作板对象的副本,而是在递归之后撤消移动。我放了一些打印语句来试图弄清楚发生了什么,我认为 value 工作正常,状态是 AI 返回 1 的胜利,玩家返回 -1 并且平局返回 0 但有些东西不能正常工作,因为 AI 会返回无意义的举动。
标签: ruby tic-tac-toe