bowling_game_wilbertcr 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/bin/bowling_game ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require 'bowling_game'
4
+
5
+ game = Bowling_game::Game.new()
6
+ interactor = Bowling_game::Interactor.new(game,STDOUT)
7
+ game_runner = Bowling_game::Game_runner.new(game, interactor)
8
+
9
+ game_runner.play()
@@ -0,0 +1,4 @@
1
+ require 'bowling_game/game.rb'
2
+ require 'bowling_game/game_runner.rb'
3
+ require 'bowling_game/interactor.rb'
4
+ require 'bowling_game/frame.rb'
@@ -0,0 +1,56 @@
1
+ module Bowling_game
2
+ class Frame
3
+ attr_reader :next
4
+
5
+ def initialize(frame_number)
6
+ @rolls = []
7
+ @next = nil
8
+ @frame_number = frame_number + 1
9
+ end
10
+
11
+ def roll(pins)
12
+ @pins = pins
13
+ @rolls << @pins
14
+ end
15
+
16
+ def set_next(frame)
17
+ @next = frame
18
+ end
19
+
20
+ def over?
21
+ is_strike? || two_rolls_played_on_frame?
22
+ end
23
+
24
+ def is_strike?
25
+ @rolls.first != nil && @rolls.first == 10
26
+ end
27
+
28
+ def two_rolls_played_on_frame?
29
+ roll_number == 2
30
+ end
31
+
32
+ def total_over_10?(pins)
33
+ roll_number == 1 && pins_in_first_roll + pins > 10
34
+ end
35
+
36
+ def is_spare?
37
+ @rolls.length == 2 && pins_in_frame == 10
38
+ end
39
+
40
+ def pins_in_first_roll
41
+ @rolls[0] if @rolls.first != nil
42
+ end
43
+
44
+ def roll_number
45
+ @rolls.length
46
+ end
47
+
48
+ def frame_number
49
+ @frame_number
50
+ end
51
+
52
+ def pins_in_frame
53
+ @rolls.inject(0) {|result, element| result + element}
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,67 @@
1
+ module Bowling_game
2
+ class Game
3
+ attr_reader :pins, :current_frame
4
+
5
+ def initialize()
6
+ @first_frame = Frame.new(0)
7
+ @current_frame = @first_frame
8
+ end
9
+
10
+ def roll(pins)
11
+ set_new_frame if @current_frame.over?
12
+ @current_frame.roll(pins)
13
+ end
14
+
15
+ def set_new_frame()
16
+ new_frame = Frame.new(@current_frame.frame_number)
17
+ @current_frame.set_next(new_frame)
18
+ @current_frame = new_frame
19
+ end
20
+
21
+ def score()
22
+ @current_frame = @first_frame
23
+ score = 0
24
+ 10.times do
25
+ if @current_frame.is_strike?()
26
+ score += 10 + next_two_rolls
27
+ move_to_next_frame
28
+ elsif @current_frame.is_spare?
29
+ score += 10 + next_roll
30
+ move_to_next_frame
31
+ else
32
+ score += two_rolls_in_frame
33
+ move_to_next_frame
34
+ end
35
+ end
36
+ score
37
+ end
38
+
39
+ def next_frame
40
+ @current_frame.next
41
+ end
42
+
43
+ def next_two_rolls
44
+ next_frame.is_strike? ? pins_in_next_two_rolls : next_frame.pins_in_frame
45
+ end
46
+
47
+ def pins_in_next_two_rolls
48
+ next_frame.pins_in_first_roll + next_frame.next.pins_in_first_roll
49
+ end
50
+
51
+ def next_roll
52
+ next_frame.pins_in_first_roll
53
+ end
54
+
55
+ def two_rolls_in_frame
56
+ @current_frame.pins_in_frame
57
+ end
58
+
59
+ def move_to_next_frame
60
+ @current_frame = next_frame
61
+ end
62
+
63
+ def tenth_frame_over?
64
+ @current_frame.frame_number == 10 && @current_frame.over?
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,32 @@
1
+ module Bowling_game
2
+ class Game_runner
3
+ attr_reader :game
4
+
5
+ def initialize(game, interactor)
6
+ @game = game
7
+ @interactor = interactor
8
+ end
9
+
10
+ def play
11
+ @interactor.welcome
12
+ until @game.tenth_frame_over? do
13
+ do_roll_routine
14
+ end
15
+
16
+ if @game.current_frame.is_strike?
17
+ 2.times do
18
+ do_roll_routine
19
+ end
20
+ elsif @game.current_frame.is_spare?
21
+ do_roll_routine
22
+ end
23
+ @interactor.score
24
+ end
25
+
26
+ def do_roll_routine
27
+ @interactor.prompt_for_roll_input
28
+ @interactor.get_knocked_pins_from_user
29
+ @interactor.display_roll_and_frame_number
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,45 @@
1
+ module Bowling_game
2
+ class Interactor
3
+
4
+
5
+ def initialize(game,output)
6
+ @output = output
7
+ @game = game
8
+ end
9
+
10
+ def welcome
11
+ @output.puts 'Welcome to Bowling Game!'
12
+ end
13
+
14
+ def prompt_for_roll_input
15
+ @output.puts 'Please enter the score of the current roll:'
16
+ end
17
+
18
+ def get_knocked_pins_from_user()
19
+ pins = gets.chomp
20
+ until input_correct?(pins)
21
+ @output.flush
22
+ @output.puts "Invalid input, please enter current roll again."
23
+ pins = gets.chomp
24
+ end
25
+ @game.roll(pins.to_i)
26
+ end
27
+
28
+ def input_correct?(pins)
29
+ !contains_illegal_characters?(pins) && !(@game.current_frame.total_over_10?(pins.to_i))
30
+ end
31
+
32
+ def display_roll_and_frame_number()
33
+ @output.puts "The above was roll number #{@game.current_frame.roll_number}"+
34
+ " on frame number #{@game.current_frame.frame_number}."
35
+ end
36
+
37
+ def score
38
+ @output.puts "Game over, your score was #{@game.score}"
39
+ end
40
+
41
+ def contains_illegal_characters?(pins)
42
+ /[^0-9]/.match(pins) ? true : false
43
+ end
44
+ end
45
+ end
metadata ADDED
@@ -0,0 +1,54 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bowling_game_wilbertcr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Wilbert Sequeira
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-06-26 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Console Bowling Game Score Calculator
15
+ email: wilbertcr@gmail.com
16
+ executables:
17
+ - bowling_game
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/bowling_game/frame.rb
22
+ - lib/bowling_game/interactor.rb
23
+ - lib/bowling_game/game.rb
24
+ - lib/bowling_game/game_runner.rb
25
+ - lib/bowling_game.rb
26
+ - bin/bowling_game
27
+ homepage: http://rubygems.org/gems/bowling_game_wilbertcr
28
+ licenses: []
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ requirements: []
46
+ rubyforge_project:
47
+ rubygems_version: 1.8.25
48
+ signing_key:
49
+ specification_version: 3
50
+ summary: ! 'Console Bowling Game Score Calculator: The console request the user for
51
+ the rolls or every frame and calculates the score of the game using the input.
52
+ User needs not to know the rules of the game, as they are built into the game,
53
+ as such, the game will now when its over, based on the user input.'
54
+ test_files: []