lib/basketball/drafting/front_office.rb in basketball-0.0.2 vs lib/basketball/drafting/front_office.rb in basketball-0.0.3
- old
+ new
@@ -1,19 +1,21 @@
# frozen_string_literal: true
module Basketball
module Drafting
- class FrontOffice
+ class FrontOffice < ValueObject
MAX_DEPTH = 3
MAX_FUZZ = 2
MAX_POSITIONS = 12
private_constant :MAX_DEPTH, :MAX_FUZZ, :MAX_POSITIONS
- attr_reader :prioritized_positions, :fuzz, :depth
+ attr_reader_value :prioritized_positions, :fuzz, :depth
def initialize(prioritized_positions: [], fuzz: rand(0..MAX_FUZZ), depth: rand(0..MAX_DEPTH))
+ super()
+
@fuzz = fuzz.to_i
@depth = depth.to_i
@prioritized_positions = prioritized_positions
# fill in the rest of the queue here
@@ -22,47 +24,39 @@
@prioritized_positions += random_positions_queue[0...need_count]
freeze
end
- def to_s
- "#{prioritized_positions.map(&:to_s).join(',')} (F:#{fuzz} D:#{depth})"
- end
-
- def pick(undrafted_players:, drafted_players:, round:)
+ def pick(undrafted_player_search:, drafted_players:, round:)
players = []
- players = adaptive_search(undrafted_players:, drafted_players:) if depth >= round
- players = balanced_search(undrafted_players:, drafted_players:) if players.empty?
- players = top_players(undrafted_players:) if players.empty?
+ players = adaptive_search(undrafted_player_search:, drafted_players:) if depth >= round
+ players = balanced_search(undrafted_player_search:, drafted_players:) if players.empty?
+ players = top_players(undrafted_player_search:) if players.empty?
players[0..fuzz].sample
end
private
- def adaptive_search(undrafted_players:, drafted_players:)
- search = PlayerSearch.new(undrafted_players)
-
+ def adaptive_search(undrafted_player_search:, drafted_players:)
drafted_positions = drafted_players.map(&:position)
- search.query(exclude_positions: drafted_positions)
+ undrafted_player_search.query(exclude_positions: drafted_positions)
end
- def balanced_search(undrafted_players:, drafted_players:)
- search = PlayerSearch.new(undrafted_players)
-
+ def balanced_search(undrafted_player_search:, drafted_players:)
players = []
# Try to find best pick for exact desired position.
# If you cant find one, then move to the next desired position until the end of the queue
available_prioritized_positions(drafted_players:).each do |position|
- players = search.query(position:)
+ players = undrafted_player_search.query(position:)
break if players.any?
end
- players = players.any? ? players : search.query
+ players = players.any? ? players : undrafted_player_search.query
end
def all_random_positions
Position::ALL_VALUES.to_a.shuffle.map { |v| Position.new(v) }
end