bowling_game_wilbertcr 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []