class TicTacToe::Negamax

Public Class Methods

new(parameters) click to toggle source
# File lib/negamax.rb, line 3
def initialize(parameters)
  @child_node_generator = parameters[:child_node_generator]
  @terminal_node_criterion = parameters[:terminal_node_criterion]
  @evaluation_heuristic = parameters[:evaluation_heuristic]
end

Public Instance Methods

apply(node) click to toggle source
# File lib/negamax.rb, line 9
def apply(node)
  if terminal_node?(node)
    node
  else
    generate_child_nodes(node).max_by { |child| -score(child, -1) }
  end
end

Private Instance Methods

evaluate(node, color) click to toggle source
# File lib/negamax.rb, line 35
def evaluate(node, color)
  @evaluation_heuristic.call(node) * color
end
generate_child_nodes(node) click to toggle source
# File lib/negamax.rb, line 27
def generate_child_nodes(node)
  @child_node_generator.call(node)
end
score(node, color) click to toggle source
# File lib/negamax.rb, line 19
def score(node, color)
  if terminal_node?(node)
    evaluate(node, color)
  else
    generate_child_nodes(node).map { |child| -score(child, -color) }.max
  end
end
terminal_node?(node) click to toggle source
# File lib/negamax.rb, line 31
def terminal_node?(node)
  @terminal_node_criterion.call(node)
end