From 9d226fcd27b6c2470edf718ad36a262348891470 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 22 Apr 2014 15:50:21 -0400 Subject: re-factor for tournament_stage's and separate scheduling modules --- lib/scheduling/elimination.rb | 55 +++++++++++++++++++++++++++++ lib/scheduling/elimination.svg.erb | 72 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 lib/scheduling/elimination.rb create mode 100644 lib/scheduling/elimination.svg.erb (limited to 'lib/scheduling') diff --git a/lib/scheduling/elimination.rb b/lib/scheduling/elimination.rb new file mode 100644 index 0000000..519d08a --- /dev/null +++ b/lib/scheduling/elimination.rb @@ -0,0 +1,55 @@ +module Scheduling + class Elimination + + def initialize(tournament_stage) + @tournament_stage = tournament_stage + end + + def tournament_stage + @tournament_stage + end + def tournament + self.tournament_stage.tournament + end + + def create_matches + num_teams = (self.tournament.players.count/self.tournament.min_players_per_team).floor + num_matches = num_teams - 1 + for i in 1..num_matches + self.tournament_stage.matches.create(status: 0, submitted_peer_evaluations: 0) + end + match_num = num_matches-1 + team_num = 0 + # for each grouping of min_players_per_team + self.tournament.players.each_slice(min_players_per_team) do |team_members| + # if the match is full, move to the next match, otherwise move to the next team + if (team_num == min_teams_per_match) + match_num -= 1 + team_num = 0 + else + team_num += 1 + end + # create a new team in the current match + self.tournament_stage.matches[match_num].teams.push(Team.create(users: team_members)) + end + end + + def match_finished(match) + matches = match.tournament_stage.matches_ordered + cur_match_num = matches.invert[match] + unless cur_match_num == 1 + match.winner.matches.push(matches[cur_match_num/2]) + end + end + + def graph + require 'erb' + erb_filename = File.join(File.dirname(__FILE__), 'elimination.svg.erb') + + erb = ERB.new(File.read(erb_filename)) + erb.filename = erb_filename + return erb.result + end + + end +end diff --git a/lib/scheduling/elimination.svg.erb b/lib/scheduling/elimination.svg.erb new file mode 100644 index 0000000..91b8f6a --- /dev/null +++ b/lib/scheduling/elimination.svg.erb @@ -0,0 +1,72 @@ +<% + +matches = @tournament_stage.matches_ordered +# depth of SVG tree +depth = Math.log2(matches.count).floor+1; +# height of SVG +height = 200 * 2**Math.log2(matches.count).floor + 100; +lastrx = 0 +lastry = 0 +lastrh = 0 +lastrw = 0 + +%> + <% %> + + + + + + + <% (1..matches.count).each do |i| %> + + + <% when 0 %> + <% if matches[i-1].teams.count < @tournament_stage.tournament.min_teams_per_match %> + stroke="red" + fill-opacity="0.6" + <% else %> + stroke="green" + <% end %> + <% when 1 %> + stroke="orange" + <% when 2 %> + stroke="yellow" + <% when 3 %> + stroke="grey" + <% end %> /> + " /> + + <% if matches[i-1].teams.first %> + Team <%= matches[i-1].teams.first.id %> + <% end %> + + VS + " /> + + <% if matches[i-1].teams[1] %> + Team <%= matches[i-1].teams[1].id %> + <% end %> + + <% if i > 1 %> + + <% end %> + <% if Math.log2(i+1) == Math.log2(i+1).ceil %> + <% lastrx = rx + lastry = ry + lastrh = rh + lastrw = rw %> + <% end %> + + <% end %> + -- cgit v1.2.3-2-g168b