class Model::MoveStrategy

Constants

EvaluatedBoard

Public Instance Methods

select_move(game_tree) click to toggle source
# File lib/tic_tac_toe/model/move_strategy.rb, line 23
def select_move(game_tree)
  @team = game_tree.current_team
  evaluated_game_tree = min_max(game_tree, 9, true, -Float::INFINITY, Float::INFINITY)

  evaluated_game_tree.game_tree.previous_move
end

Private Instance Methods

evaluated_game_tree(game_tree) click to toggle source
# File lib/tic_tac_toe/model/move_strategy.rb, line 82
def evaluated_game_tree(game_tree)
  EvaluatedBoard.new(game_tree, game_tree.rating(@team))
end
max(game_trees, cut_off, alpha, beta) click to toggle source
# File lib/tic_tac_toe/model/move_strategy.rb, line 44
def max(game_trees, cut_off, alpha, beta)
  curr_eval_game_tree = nil

  game_trees.each do |game_tree|
    eval_game_tree = min_max(game_tree, cut_off, false, alpha, beta)

    eval_game_tree.game_tree = game_tree

    alpha = eval_game_tree.rating if eval_game_tree.rating > alpha

    curr_eval_game_tree = eval_game_tree if
      curr_eval_game_tree.nil? || eval_game_tree.rating > curr_eval_game_tree.rating

    break if beta <= alpha
  end

  curr_eval_game_tree
end
min(game_trees, cut_off, alpha, beta) click to toggle source
# File lib/tic_tac_toe/model/move_strategy.rb, line 63
def min(game_trees, cut_off, alpha, beta)
  curr_eval_game_tree = nil

  game_trees.each do |game_tree|
    eval_game_tree = min_max(game_tree, cut_off, true, alpha, beta)

    eval_game_tree.game_tree = game_tree

    beta = eval_game_tree.rating if eval_game_tree.rating < beta

    curr_eval_game_tree = eval_game_tree if
      curr_eval_game_tree.nil? || eval_game_tree.rating < curr_eval_game_tree.rating

    break if beta <= alpha
  end

  curr_eval_game_tree
end
min_max(game_tree, cut_off, maximizing, alpha, beta) click to toggle source
# File lib/tic_tac_toe/model/move_strategy.rb, line 32
def min_max(game_tree, cut_off, maximizing, alpha, beta)
  return evaluated_game_tree(game_tree) if cut_off.zero? || game_tree.complete?

  cut_off -= 1

  if maximizing
    max(game_tree.next_game_trees, cut_off, alpha, beta)
  else
    min(game_tree.next_game_trees, cut_off, alpha, beta)
  end
end