lib/bridge/score.rb in bridge-0.0.13 vs lib/bridge/score.rb in bridge-0.0.14

- old
+ new

@@ -1,50 +1,39 @@ module Bridge class Score - attr_reader :tricks, :contract, :declarer, :modifier, :vulnerable + attr_reader :tricks, :contract, :declarer, :vulnerable # Creates new score object # # ==== Example - # Bridge::Score.new(:contract => "7SXX", :declarer => "S", :vulnerable => "NONE", :tricks => 13) + # Bridge::Score.new(:contract => "7SXX", :declarer => "S", :vulnerable => "BOTH", :tricks => 13) def initialize(options = {}) options[:vulnerable] ||= "NONE" options[:contract].gsub!(/(X+)/, "") @modifier = $1.nil? ? 1 : $1.to_s.size * 2 @tricks = options[:tricks] @contract = Bridge::Bid.new(options[:contract]) @vulnerable = options[:vulnerable] if Bridge::VULNERABILITIES.include?(options[:vulnerable].upcase) @declarer = options[:declarer] if Bridge::DIRECTIONS.include?(options[:declarer].upcase) end + # Returns nr of overtricks or undertricks. 0 if contract was made without them def result tricks - tricks_to_make_contract end - def tricks_to_make_contract - contract.level.to_i + 6 - end - - def doubled? - @modifier == 2 - end - - def redoubled? - @modifier == 4 - end - + # Returns true if contract was made, false otherwise def made? result >= 0 end - def small_slam? - contract.level.to_i == 6 + # Returns points achieved by declarer: + for made contract - if conctract wasn't made + def points + made? ? (made_contract_points + overtrick_points + bonus) : undertrick_points end - def grand_slam? - contract.level.to_i == 7 - end + #private def vulnerable? case vulnerable when "BOTH" true @@ -53,14 +42,30 @@ else vulnerable.split('').include?(declarer) end end - def points - made? ? (made_contract_points + overtrick_points + bonus) : undertrick_points + def small_slam? + contract.level.to_i == 6 end + def grand_slam? + contract.level.to_i == 7 + end + + def tricks_to_make_contract + contract.level.to_i + 6 + end + + def doubled? + @modifier == 2 + end + + def redoubled? + @modifier == 4 + end + def bonus game_bonus + grand_slam_bonus + small_slam_bonus + doubled_bonus + redoubled_bonus end def game_bonus @@ -108,11 +113,11 @@ def undertrick_points vulnerable? ? vulnerable_undertrick_points : not_vulnerable_undertrick_points end def made_contract_points - first_trick_points * modifier + (contract.level.to_i - 1) * single_trick_points * modifier + first_trick_points * @modifier + (contract.level.to_i - 1) * single_trick_points * @modifier end def overtrick_points if doubled? vulnerable? ? result * 200 : result * 100 @@ -121,24 +126,14 @@ else result * single_trick_points end end - def not_vulnerable_overtrick_points - if doubled? - result * 200 - elsif redoubled? - result * 400 - else - result * single_trick_points - end - end - # TODO: do some refactoring def vulnerable_undertrick_points if !made? - p = -100 * modifier + p = -100 * @modifier if result < -1 return p += (result + 1) * 300 if doubled? return p += (result + 1) * 600 if redoubled? return p += (result + 1) * 100 end @@ -148,10 +143,10 @@ end end def not_vulnerable_undertrick_points if !made? - p = -50 * modifier + p = -50 * @modifier if [-3, -2].include?(result) return p += (result + 1) * 200 if doubled? return p += (result + 1) * 400 if redoubled? return p += (result + 1) * 50 if (!doubled? and !redoubled?) elsif result < -3 \ No newline at end of file