From dd5226beb65e01450a9d1548a676fe61030dffee Mon Sep 17 00:00:00 2001 From: sarahc-dev Date: Sat, 20 May 2023 13:54:58 +0100 Subject: [PATCH 1/6] initial files setup --- .rspec | 1 + Gemfile | 7 ++++ Gemfile.lock | 26 ++++++++++++ spec/spec_helper.rb | 98 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 132 insertions(+) create mode 100644 .rspec create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 spec/spec_helper.rb diff --git a/.rspec b/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/Gemfile b/Gemfile new file mode 100644 index 00000000..41df210d --- /dev/null +++ b/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +# gem "rails" + +gem "rspec", "~> 3.12" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 00000000..135b57b2 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,26 @@ +GEM + remote: https://rubygems.org/ + specs: + diff-lcs (1.5.0) + rspec (3.12.0) + rspec-core (~> 3.12.0) + rspec-expectations (~> 3.12.0) + rspec-mocks (~> 3.12.0) + rspec-core (3.12.2) + rspec-support (~> 3.12.0) + rspec-expectations (3.12.3) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.12.0) + rspec-mocks (3.12.5) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.12.0) + rspec-support (3.12.0) + +PLATFORMS + x86_64-darwin-20 + +DEPENDENCIES + rspec (~> 3.12) + +BUNDLED WITH + 2.4.13 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 00000000..c80d44b9 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,98 @@ +# This file was generated by the `rspec --init` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See https://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # https://rspec.info/features/3-12/rspec-core/configuration/zero-monkey-patching-mode/ + config.disable_monkey_patching! + + # This setting enables warnings. It's recommended, but in some cases may + # be too noisy due to issues in dependencies. + config.warnings = true + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end From 9b91b152bb3e314dd77cbe857fa2856a971c8881 Mon Sep 17 00:00:00 2001 From: sarahc-dev Date: Sat, 20 May 2023 21:43:45 +0100 Subject: [PATCH 2/6] test drive Scorecard class with #scores, #total and #add_frame. Tests green --- lib/scorecard.rb | 12 ++++++++++++ spec/scorecard_spec.rb | 23 +++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 lib/scorecard.rb create mode 100644 spec/scorecard_spec.rb diff --git a/lib/scorecard.rb b/lib/scorecard.rb new file mode 100644 index 00000000..eeac0dbb --- /dev/null +++ b/lib/scorecard.rb @@ -0,0 +1,12 @@ +class Scorecard + attr_accessor :scores, :total + + def initialize + @scores = [] + @total = 0 + end + + def add_frame(scores) + @scores << scores + end +end \ No newline at end of file diff --git a/spec/scorecard_spec.rb b/spec/scorecard_spec.rb new file mode 100644 index 00000000..e69d47ff --- /dev/null +++ b/spec/scorecard_spec.rb @@ -0,0 +1,23 @@ +require 'scorecard' + +context Scorecard do + it 'initialises with an empty array of scores and total 0' do + scorecard = Scorecard.new + expect(scorecard.scores).to eq [] + expect(scorecard.total).to eq 0 + end + + it 'adds a single frame' do + scorecard = Scorecard.new + scorecard.add_frame([3, 4]) + expect(scorecard.scores).to eq [[3, 4]] + end + + it 'adds multiple frames' do + scorecard = Scorecard.new + scorecard.add_frame([3, 4]) + scorecard.add_frame([2, 0]) + scorecard.add_frame([6, 3]) + expect(scorecard.scores).to eq [[3, 4], [2, 0], [6, 3]] + end +end \ No newline at end of file From e1053bde9bf1fd9bf0f22cef75997194126d0716 Mon Sep 17 00:00:00 2001 From: sarahc-dev Date: Sun, 21 May 2023 16:03:53 +0100 Subject: [PATCH 3/6] amend data structure in scorecard to hash --- lib/scorecard.rb | 10 +++++++--- spec/scorecard_spec.rb | 13 ++++++++----- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/scorecard.rb b/lib/scorecard.rb index eeac0dbb..b328ff78 100644 --- a/lib/scorecard.rb +++ b/lib/scorecard.rb @@ -3,10 +3,14 @@ class Scorecard def initialize @scores = [] - @total = 0 end - def add_frame(scores) - @scores << scores + def add_frame(rolls) + if @scores.empty? + total = rolls.sum + else + total = @scores.last[:score] + rolls.sum + end + @scores << { rolls: rolls, score: total } end end \ No newline at end of file diff --git a/spec/scorecard_spec.rb b/spec/scorecard_spec.rb index e69d47ff..8a786e7c 100644 --- a/spec/scorecard_spec.rb +++ b/spec/scorecard_spec.rb @@ -1,16 +1,15 @@ require 'scorecard' context Scorecard do - it 'initialises with an empty array of scores and total 0' do + it 'initialises with an empty array of scores' do scorecard = Scorecard.new expect(scorecard.scores).to eq [] - expect(scorecard.total).to eq 0 end - it 'adds a single frame' do + it 'adds a single "open" frame' do scorecard = Scorecard.new scorecard.add_frame([3, 4]) - expect(scorecard.scores).to eq [[3, 4]] + expect(scorecard.scores).to eq [{ rolls: [3, 4], score: 7 }] end it 'adds multiple frames' do @@ -18,6 +17,10 @@ scorecard.add_frame([3, 4]) scorecard.add_frame([2, 0]) scorecard.add_frame([6, 3]) - expect(scorecard.scores).to eq [[3, 4], [2, 0], [6, 3]] + expect(scorecard.scores).to eq [ + { rolls: [3, 4], score: 7 }, + { rolls: [2, 0], score: 9 }, + { rolls: [6, 3], score: 18 } + ] end end \ No newline at end of file From 14ac68bed9565d34967a59f985b58699b3fa92f5 Mon Sep 17 00:00:00 2001 From: sarahc-dev Date: Sun, 21 May 2023 18:06:14 +0100 Subject: [PATCH 4/6] add functionality to calculate bonus for spare and strike. Tests green --- lib/scorecard.rb | 36 ++++++++++++++++++++++-- spec/scorecard_spec.rb | 63 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 95 insertions(+), 4 deletions(-) diff --git a/lib/scorecard.rb b/lib/scorecard.rb index b328ff78..4d45bc3e 100644 --- a/lib/scorecard.rb +++ b/lib/scorecard.rb @@ -1,11 +1,17 @@ -class Scorecard - attr_accessor :scores, :total - +class Scorecard def initialize @scores = [] end + def scores + @scores + end + def add_frame(rolls) + calculate_bonus(rolls) + + return @scores << { rolls: rolls } if rolls.sum == 10 + if @scores.empty? total = rolls.sum else @@ -13,4 +19,28 @@ def add_frame(rolls) end @scores << { rolls: rolls, score: total } end + + private + + def calculate_bonus(rolls) + return if @scores.empty? + + if @scores.last[:rolls].include?(10) + strike_bonus(rolls) + elsif @scores.last[:rolls].sum == 10 + spare_bonus(rolls) + end + end + + def strike_bonus(rolls) + @scores.last[:score] = prev_score + 10 + rolls.sum + end + + def spare_bonus(rolls) + @scores.last[:score] = prev_score + 10 + rolls[0] + end + + def prev_score + return @scores[-2] ? @scores[-2][:score] : 0 + end end \ No newline at end of file diff --git a/spec/scorecard_spec.rb b/spec/scorecard_spec.rb index 8a786e7c..f91e73af 100644 --- a/spec/scorecard_spec.rb +++ b/spec/scorecard_spec.rb @@ -12,7 +12,7 @@ expect(scorecard.scores).to eq [{ rolls: [3, 4], score: 7 }] end - it 'adds multiple frames' do + it 'adds multiple "open" frames' do scorecard = Scorecard.new scorecard.add_frame([3, 4]) scorecard.add_frame([2, 0]) @@ -23,4 +23,65 @@ { rolls: [6, 3], score: 18 } ] end + + it 'adds a single strike' do + scorecard = Scorecard.new + scorecard.add_frame([10]) + expect(scorecard.scores).to eq [{ rolls: [10] }] + end + + it 'adds a single spare' do + scorecard = Scorecard.new + scorecard.add_frame([9, 1]) + expect(scorecard.scores).to eq [{ rolls: [9, 1] }] + end + + it 'adds multiple frames including a strike' do + scorecard = Scorecard.new + scorecard.add_frame([8, 1]) + scorecard.add_frame([10]) + scorecard.add_frame([3, 4]) + expect(scorecard.scores).to eq [ + { rolls: [8, 1], score: 9 }, + { rolls: [10], score: 26 }, + { rolls: [3, 4], score: 33 }, + ] + end + + it 'adds multiple frames including a spare' do + scorecard = Scorecard.new + scorecard.add_frame([9, 1]) + scorecard.add_frame([3, 4]) + expect(scorecard.scores).to eq [ + { rolls: [9, 1], score: 13 }, + { rolls: [3, 4], score: 20 }, + ] + end + + it 'correctly scores a gutter game' do + scorecard = Scorecard.new + scorecard.add_frame([0, 0]) + scorecard.add_frame([0, 0]) + scorecard.add_frame([0, 0]) + scorecard.add_frame([0, 0]) + scorecard.add_frame([0, 0]) + scorecard.add_frame([0, 0]) + scorecard.add_frame([0, 0]) + scorecard.add_frame([0, 0]) + scorecard.add_frame([0, 0]) + scorecard.add_frame([0, 0]) + expect(scorecard.scores.length).to eq 10 + expect(scorecard.scores).to eq [ + { rolls: [0, 0], score: 0 }, + { rolls: [0, 0], score: 0 }, + { rolls: [0, 0], score: 0 }, + { rolls: [0, 0], score: 0 }, + { rolls: [0, 0], score: 0 }, + { rolls: [0, 0], score: 0 }, + { rolls: [0, 0], score: 0 }, + { rolls: [0, 0], score: 0 }, + { rolls: [0, 0], score: 0 }, + { rolls: [0, 0], score: 0 } + ] + end end \ No newline at end of file From 2ab5fe96986db595c71d95c7658e38207ae3fb3e Mon Sep 17 00:00:00 2001 From: sarahc-dev Date: Sun, 21 May 2023 20:57:02 +0100 Subject: [PATCH 5/6] test drive Bowling class functionality #roll and #frame (up to 2 rolls) --- lib/bowling.rb | 17 ++++++++++++++ spec/bowling_spec.rb | 54 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 lib/bowling.rb create mode 100644 spec/bowling_spec.rb diff --git a/lib/bowling.rb b/lib/bowling.rb new file mode 100644 index 00000000..0ffef9d8 --- /dev/null +++ b/lib/bowling.rb @@ -0,0 +1,17 @@ +class Bowling + def initialize(io) + @io = io + end + + def frame + roll_1 = roll(1) + return [roll_1] if roll_1 == 10 + roll_2 = roll(2) + return [roll_1, roll_2] + end + + def roll(number) + @io.puts "Roll #{number} - number of pins down: " + return @io.gets.chomp.to_i + end +end \ No newline at end of file diff --git a/spec/bowling_spec.rb b/spec/bowling_spec.rb new file mode 100644 index 00000000..66df1072 --- /dev/null +++ b/spec/bowling_spec.rb @@ -0,0 +1,54 @@ +require 'bowling' + +describe Bowling do + context '#roll' do + it "gets the number of pins down on one roll" do + io = double :io + + expect(io).to receive(:puts).with("Roll 1 - number of pins down: ") + expect(io).to receive(:gets).and_return("4") + + bowling = Bowling.new(io) + bowling.roll(1) + end + end + + context '#frame' do + it 'returns an array containing 10 if roll a strike' do + io = double :io + + expect(io).to receive(:puts).with("Roll 1 - number of pins down: ") + expect(io).to receive(:gets).and_return("10") + + bowling = Bowling.new(io) + result = bowling.frame + expect(result).to eq [10] + end + + it 'returns an array of two rolls' do + io = double :io + + expect(io).to receive(:puts).with("Roll 1 - number of pins down: ") + expect(io).to receive(:gets).and_return("3") + expect(io).to receive(:puts).with("Roll 2 - number of pins down: ") + expect(io).to receive(:gets).and_return("4") + + bowling = Bowling.new(io) + result = bowling.frame + expect(result).to eq [3, 4] + end + + it 'returns an array of 0s if no pins knocked down' do + io = double :io + + expect(io).to receive(:puts).with("Roll 1 - number of pins down: ") + expect(io).to receive(:gets).and_return("0") + expect(io).to receive(:puts).with("Roll 2 - number of pins down: ") + expect(io).to receive(:gets).and_return("0") + + bowling = Bowling.new(io) + result = bowling.frame + expect(result).to eq [0, 0] + end + end +end \ No newline at end of file From 44c5cc62e96a07f8cab03850c85475596eebc7f2 Mon Sep 17 00:00:00 2001 From: sarahc-dev Date: Mon, 22 May 2023 10:24:46 +0100 Subject: [PATCH 6/6] amend scorecard to fix issue in logic for bonuses, add 10th frame logic separately, add readme and design image --- README.md | 39 +++++---- app.rb | 26 ++++++ images/bowling-design.jpg | Bin 0 -> 78263 bytes images/example-scorecard.png | Bin 0 -> 10121 bytes lib/bowling.rb | 9 +++ lib/scorecard.rb | 64 ++++++++++----- spec/scorecard_spec.rb | 153 ++++++++++++++++++++++++++++++++--- 7 files changed, 242 insertions(+), 49 deletions(-) create mode 100644 app.rb create mode 100644 images/bowling-design.jpg create mode 100644 images/example-scorecard.png diff --git a/README.md b/README.md index 15dc4762..4c2bd6c9 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,15 @@ -Bowling Challenge in Ruby -================= +# Bowling Challenge in Ruby -* Feel free to use google, your notes, books, etc. but work on your own -* If you refer to the solution of another coach or student, please put a link to that in your README -* If you have a partial solution, **still check in a partial solution** -* You must submit a pull request to this repo with your code by 9am Monday week +Initially I struggled to understand what was being asked in this task, and what the inputs and outputs should be. The Scorecard class works alone but I have added a Bowling class and Application class as this helped me better understand the functionality of the Scorecard. + +I found this link useful to understand what should happen step by step: [How Is Bowling Scored?](https://bowlingforbeginners.com/how-is-bowling-scored/) + +I wanted my challenge to reflect a real life bowling situation to produce a scorecard that could look something like this: +![bowling scorecard](images/example-scorecard.png) + +This was my initial design of the steps. I have decided to create a running total for each frame, and if there is a bonus updates once the next balls have been played. + +![my design](images/bowling-design.jpg) ## The Task @@ -16,22 +21,24 @@ A bowling game consists of 10 frames in which the player tries to knock down the As usual please start by -* Forking this repo +- Forking this repo -* Finally submit a pull request before Monday week at 9am with your solution or partial solution. However much or little amount of code you wrote please please please submit a pull request before Monday week at 9am. +- Finally submit a pull request before Monday week at 9am with your solution or partial solution. However much or little amount of code you wrote please please please submit a pull request before Monday week at 9am. -___STRONG HINT, IGNORE AT YOUR PERIL:___ Bowling is a deceptively complex game. Careful thought and thorough diagramming — both before and throughout — will save you literal hours of your life. +**STRONG HINT, IGNORE AT YOUR PERIL:** Bowling is a deceptively complex game. Careful thought and thorough diagramming — both before and throughout — will save you literal hours of your life. ## Focus for this challenge + The focus for this challenge is to write high-quality code. In order to do this, you may pay particular attention to the following: -* Using diagramming to plan your approach to the challenge -* TDD your code -* Focus on testing behaviour rather than state -* Commit often, with good commit messages -* Single Responsibility Principle and encapsulation -* Clear and readable code + +- Using diagramming to plan your approach to the challenge +- TDD your code +- Focus on testing behaviour rather than state +- Commit often, with good commit messages +- Single Responsibility Principle and encapsulation +- Clear and readable code ## Bowling — how does it work? @@ -60,6 +67,6 @@ A Perfect Game is when the player rolls 12 strikes (10 regular strikes and 2 str In the image below you can find some score examples. -More about ten pin bowling here: http://en.wikipedia.org/wiki/Ten-pin_bowling +More about ten pin bowling here: [http://en.wikipedia.org/wiki/Ten-pin_bowling](http://en.wikipedia.org/wiki/Ten-pin_bowling) ![Ten Pin Score Example](images/example_ten_pin_scoring.png) diff --git a/app.rb b/app.rb new file mode 100644 index 00000000..ba930c6c --- /dev/null +++ b/app.rb @@ -0,0 +1,26 @@ +require_relative 'lib/bowling' +require_relative 'lib/scorecard' + +class Application + + Frames = 10 + + def play + bowling = Bowling.new(Kernel) + scorecard = Scorecard.new + + 9.times do |i| + frame = bowling.frame + scorecard.add_frame(frame) + end + + # 10th frame? + frame_10 = bowling.frame + scorecard.add_final_frame(frame_10) + + p scorecard.scores + end +end + +app = Application.new +app.play \ No newline at end of file diff --git a/images/bowling-design.jpg b/images/bowling-design.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f0b436be43cfafefdb0bb9573276f4bd66336404 GIT binary patch literal 78263 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 LnoNU~S=j#oEvzCz literal 0 HcmV?d00001 diff --git a/lib/bowling.rb b/lib/bowling.rb index 0ffef9d8..1ff16c64 100644 --- a/lib/bowling.rb +++ b/lib/bowling.rb @@ -10,6 +10,15 @@ def frame return [roll_1, roll_2] end + def final_frame + score = frame + + return if score.sum != 10 + score << roll("bonus 1") + score << roll("bonus 2") if score.include?(10) + return score + end + def roll(number) @io.puts "Roll #{number} - number of pins down: " return @io.gets.chomp.to_i diff --git a/lib/scorecard.rb b/lib/scorecard.rb index 4d45bc3e..e733951b 100644 --- a/lib/scorecard.rb +++ b/lib/scorecard.rb @@ -7,40 +7,60 @@ def scores @scores end - def add_frame(rolls) - calculate_bonus(rolls) - - return @scores << { rolls: rolls } if rolls.sum == 10 + def add_frame(pins_down) + calculate_bonus(pins_down) unless @scores.empty? || @scores.last[:rolls].sum != 10 - if @scores.empty? - total = rolls.sum - else - total = @scores.last[:score] + rolls.sum + return @scores << { rolls: pins_down } if pins_down.sum == 10 + + # Not a spare or strike + total = @scores.empty? ? pins_down.sum : @scores.last[:score] + pins_down.sum + @scores << { rolls: pins_down, score: total } + end + + def add_final_frame(pins_down) + + if @scores[-2][:rolls].include?(10) + get_prev = @scores[-3][:score] + @scores[-2][:score] = get_prev + 20 + pins_down[0] end - @scores << { rolls: rolls, score: total } + + if @scores[-1][:rolls].include?(10) + add_strike_bonus(pins_down.slice(0, 2)) + elsif @scores[-1][:rolls].sum == 10 + add_spare_bonus(pins_down[0]) + end + + total = @scores.last[:score] + pins_down.sum + @scores << { rolls: pins_down, score: total } end private - def calculate_bonus(rolls) - return if @scores.empty? + def calculate_bonus(pins_down) + # last roll was spare + if !@scores.last[:rolls].include?(10) + add_spare_bonus(pins_down[0]) + else + # last roll was strike + # check if previous was also strike + if @scores[-2] && @scores[-2][:rolls].include?(10) + get_prev = @scores[-3] ? @scores[-3][:score] : 0 + @scores[-2][:score] = get_prev + 20 + pins_down[0] + end - if @scores.last[:rolls].include?(10) - strike_bonus(rolls) - elsif @scores.last[:rolls].sum == 10 - spare_bonus(rolls) - end + add_strike_bonus(pins_down) if !pins_down.include?(10) + end end - def strike_bonus(rolls) - @scores.last[:score] = prev_score + 10 + rolls.sum + def add_spare_bonus(bonus_1) + @scores.last[:score] = previous_score + 10 + bonus_1 end - def spare_bonus(rolls) - @scores.last[:score] = prev_score + 10 + rolls[0] + def add_strike_bonus(bonus_2) + @scores.last[:score] = previous_score + 10 + bonus_2.sum end - - def prev_score + + def previous_score return @scores[-2] ? @scores[-2][:score] : 0 end end \ No newline at end of file diff --git a/spec/scorecard_spec.rb b/spec/scorecard_spec.rb index f91e73af..e441e602 100644 --- a/spec/scorecard_spec.rb +++ b/spec/scorecard_spec.rb @@ -24,19 +24,29 @@ ] end - it 'adds a single strike' do + it 'adds a single spare' do scorecard = Scorecard.new - scorecard.add_frame([10]) - expect(scorecard.scores).to eq [{ rolls: [10] }] + scorecard.add_frame([9, 1]) + expect(scorecard.scores).to eq [{ rolls: [9, 1] }] end - it 'adds a single spare' do + it 'correctly calculates spare bonus' do scorecard = Scorecard.new scorecard.add_frame([9, 1]) - expect(scorecard.scores).to eq [{ rolls: [9, 1] }] + scorecard.add_frame([5, 3]) + expect(scorecard.scores).to eq [ + { rolls: [9, 1], score: 15 }, + { rolls: [5, 3], score: 23 } + ] + end + + it 'adds a single strike' do + scorecard = Scorecard.new + scorecard.add_frame([10]) + expect(scorecard.scores).to eq [{ rolls: [10] }] end - it 'adds multiple frames including a strike' do + it 'correctly adds strike bonus if next frame not a strike' do scorecard = Scorecard.new scorecard.add_frame([8, 1]) scorecard.add_frame([10]) @@ -48,13 +58,53 @@ ] end - it 'adds multiple frames including a spare' do + it 'correctly adds two strikes in a row' do scorecard = Scorecard.new - scorecard.add_frame([9, 1]) - scorecard.add_frame([3, 4]) + scorecard.add_frame([10]) + scorecard.add_frame([10]) + expect(scorecard.scores).to eq [ + { rolls: [10] }, + { rolls: [10] } + ] + end + + it 'correctly adds strike bonus after two strikes' do + scorecard = Scorecard.new + scorecard.add_frame([10]) + scorecard.add_frame([10]) + scorecard.add_frame([3, 6]) + scorecard.add_frame([5, 1]) + expect(scorecard.scores).to eq [ + { rolls: [10], score: 23 }, + { rolls: [10], score: 42 }, + { rolls: [3, 6], score: 51 }, + { rolls: [5, 1], score: 57 }, + ] + end + + it 'correctly calculates a game not ending on strike or spare' do + scorecard = Scorecard.new + scorecard.add_frame([10]) + scorecard.add_frame([3, 6]) + scorecard.add_frame([3, 7]) + scorecard.add_frame([10]) + scorecard.add_frame([10]) + scorecard.add_frame([5, 1]) + scorecard.add_frame([8, 2]) + scorecard.add_frame([7, 3]) + scorecard.add_frame([5, 4]) + scorecard.add_frame([2, 1]) expect(scorecard.scores).to eq [ - { rolls: [9, 1], score: 13 }, - { rolls: [3, 4], score: 20 }, + { rolls: [10], score: 19 }, + { rolls: [3, 6], score: 28 }, + { rolls: [3, 7], score: 48 }, + { rolls: [10], score: 73 }, + { rolls: [10], score: 89 }, + { rolls: [5, 1], score: 95 }, + { rolls: [8, 2], score: 112 }, + { rolls: [7, 3], score: 127 }, + { rolls: [5, 4], score: 136 }, + { rolls: [2, 1], score: 139 }, ] end @@ -84,4 +134,85 @@ { rolls: [0, 0], score: 0 } ] end + + it 'correctly scores a perfect game' do + scorecard = Scorecard.new + scorecard.add_frame([10]) + scorecard.add_frame([10]) + scorecard.add_frame([10]) + scorecard.add_frame([10]) + scorecard.add_frame([10]) + scorecard.add_frame([10]) + scorecard.add_frame([10]) + scorecard.add_frame([10]) + scorecard.add_frame([10]) + scorecard.add_final_frame([10, 10, 10]) + expect(scorecard.scores.length).to eq 10 + expect(scorecard.scores).to eq [ + { rolls: [10], score: 30 }, + { rolls: [10], score: 60 }, + { rolls: [10], score: 90 }, + { rolls: [10], score: 120 }, + { rolls: [10], score: 150 }, + { rolls: [10], score: 180 }, + { rolls: [10], score: 210 }, + { rolls: [10], score: 240 }, + { rolls: [10], score: 270 }, + { rolls: [10, 10, 10], score: 300 } + ] + end + + it 'correctly scores a full game with 1 bonus roll' do + scorecard = Scorecard.new + scorecard.add_frame([3, 5]) + scorecard.add_frame([6, 4]) + scorecard.add_frame([7, 2]) + scorecard.add_frame([10]) + scorecard.add_frame([7, 1]) + scorecard.add_frame([9, 1]) + scorecard.add_frame([10]) + scorecard.add_frame([1, 8]) + scorecard.add_frame([8, 2]) + scorecard.add_final_frame([6, 4, 5]) + expect(scorecard.scores.length).to eq 10 + expect(scorecard.scores).to eq [ + { rolls: [3, 5], score: 8 }, + { rolls: [6, 4], score: 25 }, + { rolls: [7, 2], score: 34 }, + { rolls: [10], score: 52 }, + { rolls: [7, 1], score: 60 }, + { rolls: [9, 1], score: 80 }, + { rolls: [10], score: 99 }, + { rolls: [1, 8], score: 108 }, + { rolls: [8, 2], score: 124 }, + { rolls: [6, 4, 5], score: 139 } + ] + end + + it 'correctly scores a full game with 2 bonus rolls' do + scorecard = Scorecard.new + scorecard.add_frame([3, 5]) + scorecard.add_frame([6, 4]) + scorecard.add_frame([7, 2]) + scorecard.add_frame([10]) + scorecard.add_frame([7, 1]) + scorecard.add_frame([9, 1]) + scorecard.add_frame([10]) + scorecard.add_frame([1, 8]) + scorecard.add_frame([8, 2]) + scorecard.add_final_frame([10, 4, 5]) + expect(scorecard.scores.length).to eq 10 + expect(scorecard.scores).to eq [ + { rolls: [3, 5], score: 8 }, + { rolls: [6, 4], score: 25 }, + { rolls: [7, 2], score: 34 }, + { rolls: [10], score: 52 }, + { rolls: [7, 1], score: 60 }, + { rolls: [9, 1], score: 80 }, + { rolls: [10], score: 99 }, + { rolls: [1, 8], score: 108 }, + { rolls: [8, 2], score: 128 }, + { rolls: [10, 4, 5], score: 147 } + ] + end end \ No newline at end of file