Extracting tournament round building logic
This commit is contained in:
@@ -16,105 +16,4 @@ class MashTournament < ActiveRecord::Base
|
||||
:conditions => {:number => number}
|
||||
)
|
||||
end
|
||||
|
||||
def valid_number_of_contenders?(n_contenders)
|
||||
[8, 16, 32, 64, 128].include?(n_contenders)
|
||||
end
|
||||
|
||||
def create_rounds_for_contenders(n_contenders)
|
||||
if not valid_number_of_contenders?(n_contenders)
|
||||
raise StandardError.new(
|
||||
"The number of contenders must be 8, 16, 32, 64, or 128! " +
|
||||
"Got '#{n_contenders}'"
|
||||
)
|
||||
end
|
||||
|
||||
round = 1
|
||||
|
||||
while n_contenders > 1
|
||||
create_round(round, n_contenders)
|
||||
n_contenders = n_contenders / 2
|
||||
round += 1
|
||||
end
|
||||
|
||||
self.total_rounds = round - 1
|
||||
end
|
||||
|
||||
def fill_in_next_round
|
||||
self.rounds.sort{ |a,b| a.number <=> b.number}.each do |round|
|
||||
if not round.done?
|
||||
return assign_maps_for_round(round)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def create_round(round_number, n_contenders)
|
||||
round = MashTournamentRound.new(
|
||||
:mash_tournament_id => self.id,
|
||||
:number => round_number,
|
||||
:mash_count => n_contenders / 2
|
||||
)
|
||||
round.save!
|
||||
|
||||
n_contenders.times do
|
||||
Mash.new(
|
||||
:mash_tournament_id => self.id,
|
||||
:mash_tournament_round_id => round.id
|
||||
).save!
|
||||
end
|
||||
end
|
||||
|
||||
def assign_maps_for_round(round)
|
||||
if round.number == 1
|
||||
return assign_maps_for_round_one(round)
|
||||
end
|
||||
|
||||
previous = MashTournamentRound.find_by_mash_tournament_id_and_number(
|
||||
self.id, round.number - 1
|
||||
)
|
||||
previous_winners = previous.mashes.collect(&:winner_id)
|
||||
pool = Map.all(
|
||||
:order => 'RANDOM()',
|
||||
:conditions => ['id in ?', previous_winners]
|
||||
)
|
||||
|
||||
filled_in = []
|
||||
|
||||
round.mashes.each do |mash|
|
||||
mash.map_a = pool.pop.id
|
||||
mash.map_b = pool.pop.id
|
||||
mash.save!
|
||||
|
||||
filled_in << mash
|
||||
end
|
||||
|
||||
filled_in
|
||||
end
|
||||
|
||||
def assign_maps_for_round_one(round)
|
||||
pool = Map.all(
|
||||
:order => 'RANDOM()',
|
||||
:limit => round.mash_count * 2
|
||||
)
|
||||
|
||||
logger.info("Populating mashes from pool: #{pool.inspect}")
|
||||
|
||||
filled_in = []
|
||||
|
||||
round.mashes.each do |mash|
|
||||
map_a = pool.pop
|
||||
map_b = pool.pop
|
||||
logger.info("Assigning `map_a` from #{map_a.inspect}, " +
|
||||
"`map_b` from #{map_b.inspect} to mash #{mash.inspect}")
|
||||
|
||||
mash.map_a = map_a
|
||||
mash.map_b = map_b
|
||||
mash.save!
|
||||
|
||||
filled_in << mash
|
||||
end
|
||||
|
||||
filled_in
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user