0

我正在用头撞墙,试图为井字游戏实施 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

它确实产生了结果,但人工智能很容易被击败,所以我知道出了点问题,感谢任何帮助!

4

1 回答 1

2

问题是value需要相对于mark当前执行的negamax而不是总是相对于计算机。如果您使用以下修改后的定义将mark参数传递给valuefrom ,您将获得正确的结果:negamaxvalue

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 为时已晚 ;-),但将其“置于测试中”也是一个不错的选择。

另外,请理解,根据其他评论,这不是您通常会在 SO 上得到答案的问题。我什至不知道这个问题是否会在审核过程中幸存下来而不会被删除。出于各种个人原因,我一直在研究它。

更新:查看您的参考实现,您会注意到 negamax 代码包含表达式sign[color]*Analysis(b)。那sign[color]是你实际上失踪了。

于 2013-06-27T04:16:30.057 回答