Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sarah - Bowling Challenge #405

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add functionality to calculate bonus for spare and strike. Tests green
  • Loading branch information
sarahc-dev committed May 21, 2023
commit 14ac68bed9565d34967a59f985b58699b3fa92f5
36 changes: 33 additions & 3 deletions lib/scorecard.rb
Original file line number Diff line number Diff line change
@@ -1,16 +1,46 @@
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
total = @scores.last[:score] + rolls.sum
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
63 changes: 62 additions & 1 deletion spec/scorecard_spec.rb
Original file line number Diff line number Diff line change
@@ -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