class Rubykon::GameScorer

Public Instance Methods

score(game) click to toggle source
# File lib/rubykon/game_scorer.rb, line 3
def score(game)
  game_score = {Board::BLACK => 0, Board::WHITE => game.komi}
  score_board(game, game_score)
  add_captures(game, game_score)
  determine_winner(game_score)
  game_score
end

Private Instance Methods

add_captures(game, game_score) click to toggle source
# File lib/rubykon/game_scorer.rb, line 45
def add_captures(game, game_score)
  game_score[Board::BLACK] += game.captures[Board::BLACK]
  game_score[Board::WHITE] += game.captures[Board::WHITE]
end
black_won?(game_score) click to toggle source
# File lib/rubykon/game_scorer.rb, line 58
def black_won?(game_score)
  game_score[Board::BLACK] > game_score[Board::WHITE]
end
determine_winner(game_score) click to toggle source
# File lib/rubykon/game_scorer.rb, line 50
def determine_winner(game_score)
  game_score[:winner] = if black_won?(game_score)
                          Board::BLACK
                        else
                          Board::WHITE
                        end
end
find_candidate_color(neighbor_colors) click to toggle source
# File lib/rubykon/game_scorer.rb, line 32
def find_candidate_color(neighbor_colors)
  neighbor_colors.find do |color|
    color != Board::EMPTY
  end
end
only_one_color_adjacent?(neighbor_colors, candidate_color) click to toggle source
# File lib/rubykon/game_scorer.rb, line 38
def only_one_color_adjacent?(neighbor_colors, candidate_color)
  enemy_color = Game.other_color(candidate_color)
  neighbor_colors.all? do |color|
    color != enemy_color
  end
end
score_board(game, game_score) click to toggle source
# File lib/rubykon/game_scorer.rb, line 12
def score_board(game, game_score)
  board = game.board
  board.each do |identifier, color|
    if color == Board::EMPTY
      score_empty_cutting_point(identifier, board, game_score)
    else
      game_score[color] += 1
    end
  end
end
score_empty_cutting_point(identifier, board, game_score) click to toggle source
# File lib/rubykon/game_scorer.rb, line 23
def score_empty_cutting_point(identifier, board, game_score)
  neighbor_colors = board.neighbour_colors_of(identifier)
  candidate_color = find_candidate_color(neighbor_colors)
  return unless candidate_color
  if only_one_color_adjacent?(neighbor_colors, candidate_color)
    game_score[candidate_color] += 1
  end
end