class Frame NOMARK = 0 SPARE = 1 STRIKE = 2 def initialize @mark = NOMARK @rolls = [] end def addRoll(pins) if(@rolls.length < 3) @rolls << pins end end def first return roll(0) end def second return roll(1) end def third return roll(2) end def roll(n) if(@rolls[n]) return @rolls[n] end return 0 end def mark if(first == 10) return STRIKE elsif(first + second == 10) return SPARE end return NOMARK end def score score = first + second if(mark != NOMARK) score += third end return score end end class Game def initialize @frames = [] 12.times do @frames << Frame.new end @currentRoll = 1 @frameNum = 0 end def roll(pins) (0..@frameNum).each do | n | getFrame(n).addRoll(pins) end if(@currentRoll == 2 || pins == 10) @frameNum += 1 @currentRoll = 1 else @currentRoll = 2 end end def getFrame(n) return @frames[n] end def score(n) score = 0 (0..n).each do | frameNum | score += getFrame(frameNum).score end return score end def finalScore return score(9) end end