7 return SwissPairing.new
8 #return ExcludeSacrifice.new(SwissPairing.new)
9 #return RandomPairing.new
10 #return ExcludeSacrifice.new(RandomPairing.new)
16 log_message("Floodgate[%s]: too few players [%d]" %
17 [self.class, players.size])
19 log_message("Floodgate[%s]: found %d players. Pairing them..." %
20 [self.class, players.size])
24 def start_game(p1, p2)
27 Game.new(p1.game_name, p1, p2)
30 def delete_player_at_random(players)
31 return players.delete_at(rand(players.size))
34 def delete_player_at_random_except(players, a_player)
35 candidates = players - [a_player]
36 return delete_player_at_random(candidates)
39 def delete_most_playing_player(players)
40 max_player = players.max {|a,b| a.win + a.loss <=> b.win + b.loss}
41 return players.delete(max_player)
44 def delete_least_rate_player(players)
45 min_player = players.min {|a,b| a.rate <=> b.rate}
46 return players.delete(min_player)
49 def pairing_and_start_game(players)
50 return if players.size < 2
51 if players.size % 2 == 1
52 log_warning("#Players should be even: %d" % [players.size])
55 sorted = players.sort{ rand < 0.5 ? 1 : -1 }
57 pairs = [[sorted.shift]]
58 while !sorted.empty? do
59 if pairs.last.size < 2
60 pairs.last << sorted.shift
62 pairs << [sorted.shift]
66 start_game(pair.first, pair.last)
71 class RandomPairing < Pairing
74 return if players.size < 2
76 if players.size % 2 == 1
77 delete_most_playing_player(players)
79 pairing_and_start_game(players)
83 class SwissPairing < Pairing
86 return if players.size < 2
88 win_players = players.find_all {|a| a.last_game_win?}
89 remains = players - win_players
90 if win_players.size >= 2
91 if win_players.size % 2 == 1
92 remains << delete_least_rate_player(win_players)
94 pairing_and_start_game(win_players)
96 remains.concat(win_players)
98 return if remains.size < 2
99 if remains.size % 2 == 1
100 delete_most_playing_player(remains)
102 pairing_and_start_game(remains)
106 class ExcludeSacrifice
107 attr_accessor :sacrifice
109 def initialize(pairing)
111 @sacrifice = "gps500+e293220e3f8a3e59f79f6b0efffaa931"
116 players.size % 2 == 1 &&
117 players.find{|a| a.id == @sacrifice}
118 log_message("Floodgate: first, exclude %s" % [@sacrifice])
119 players.delete_if{|a| a.id == @sacrifice}
121 @pairing.match(players)
124 # Delegate to @pairing
125 def method_missing(message, *arg)
126 @pairing.send(message, *arg)
128 end # class ExcludeSacrifice