Software Challenge : Finale in der Spieldefinition beschreiben

Die Finalkonstellationen werden in der jeweiligen Spieldefinition folgendermaßen beschrieben:

finale do winner_certain? do |match| <Funktion die ermittelt, ob das übergebene match bereits entschieden ist. Muss false oder true zurückgeben> end day :<Bezeichnung des Finalabschnitts != contest>, :human_name => "<Anzuzeigender Name des Abschnitts>", :order => <Nummer zur Angabe, in welcher Reihenfolge die Abschnitte gespielt werden>, :depens => [<Array mit Bezeichnungen der Finalabschnitte, die gespielt sein müssen, bevor dieser gespielt werden kann>], :use => <:winners / :losers / {:best => <Benutze die NUMMER besten Spieler>}>, :from => <:contest (Vordefiniert: Rangliste des regulären Wettbewerbs) / :<Bezeichnung des Finalabschnitts aus dem die Spieler zu beziehen sind>>, :reorder_slots => <true / false (sollen die Konstellationen geändert werden, sodass 1 gg 7 spielt, 2 gg 6, usw.)>, :editable => <true / false (soll die Aufstellung manuell veränderbar sein?)>, :lineup_publishable => <true / false (soll der Admin die Aufstellung dieses Tages veröffentlichen können?)>, :ranking => {<Nummer der Platzierung> => <:losers / :winners>}, :multipleWinners => <true / false (kann es mehrere Sieger in einem Spiel geben?)> day ...j ... end 

`

Beispiel von 2010:

finale_do winner_certain? do |match| result = match.result :victories if result.nil? false else rounds_to_play = match.rounds.count - match.rounds.played.count diff = (result[0].to_f - result[1].to_f).abs diff > rounds_to_play end end day :quarter_final :human_name => "Viertelfinale", :order => 1, :use => {:best => 8}, :from => :contest, :reorder_slots => true, :editable => true, :lineup_publishable => true, :ranking => { 5 => :losers } day :half_final, :human_name => "Halbfinale", :order => 2, :depends => [:quarter_final], :use => :winners, :from => :quarter_final day :small_final, :human_name => "Kleines Finale", :order => 3, :depends => [:half_final], :use => :losers, :from => :half_final, :ranking => { 3 => :winners, 4 => :losers } day :final, :human_name => "Finale", :order => 4, :depends => [:half_final], :use => :winners, :multipleWinners => :true, :from => :half_final, :ranking => { 1 => :winners, 2 => :losers } end 

Technischer Hintergrund

finale ist eine Methode in der game_definition.rb. Diese bekommt den Block übergeben, der die Days enthält. Dieser wird von einer dynamisch generierten Klasse (finale_collector) ausgewertet (.instance_eval(&block)). Diese Klasse enthält wiederum eine Methode day welche dann den Hash mit den Einstellungen für den Finaltag bekommt und diesen in einem Array speichert. Nach der kompletten Auswertung können die einzelnen Tage dann aus diesem Array ausgelesen und benutzt werden. Ähnlich funktioniert es mit der Methode winner_certain?. Der übergebene Block wird gespeichert und kann später über .game_definition.finale_winner_certain?(match) aufgerufen werden.