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 +9 -0
- data/lib/bowling_game.rb +4 -0
- data/lib/bowling_game/frame.rb +56 -0
- data/lib/bowling_game/game.rb +67 -0
- data/lib/bowling_game/game_runner.rb +32 -0
- data/lib/bowling_game/interactor.rb +45 -0
- metadata +54 -0
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()
|
data/lib/bowling_game.rb
ADDED
@@ -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: []
|