Ruby_Dice 0.0.1 → 1.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.md +21 -21
- data/README.md +10 -11
- data/bin/Ruby_Dice +38 -38
- data/lib/Ruby_Dice.rb +4 -4
- data/lib/dice.rb +65 -59
- data/lib/player.rb +118 -90
- data/lib/scoresheet.rb +155 -156
- data/lib/scoring.rb +145 -145
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94e563c4bbfab5d2e0efe9e3b286b3b48f8bb45f
|
4
|
+
data.tar.gz: 4796d59ae2e73bf1b47bf7bf37adf250561c92c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef488d12af8d9e32624f69ec6e0b089ee0ea226f2057fe5656c83d346519ab8214d7df2c3ebc0cb85f124ab2daa4183a8b5d42d11362393ae664c031a91db5d5
|
7
|
+
data.tar.gz: 54e572b7af23e772b8fb9e8029c11c8002ae75b015d8aa342142f7a7d6bc8de8b5a2a2b6819c4cf0fb40cbd3ef60e8ceb341522aeca856554d1d88160ee3fae6
|
data/LICENSE.md
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
The MIT License (MIT)
|
2
|
-
|
3
|
-
Copyright (c) 2014 Mario Martinez and Zachary Perlmutter
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
7
|
-
in the Software without restriction, including without limitation the rights
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
10
|
-
furnished to do so, subject to the following conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
13
|
-
copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
-
SOFTWARE.
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2014 Mario Martinez and Zachary Perlmutter
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
CHANGED
@@ -1,11 +1,10 @@
|
|
1
|
-
# Ruby_Dice
|
2
|
-
A Yahtzee clone written in Ruby that runs in the terminal
|
3
|
-
|
4
|
-
This project is a personal project for educational purposes and becoming accustomed to the Ruby programming paradigm. Furthermore, it's to become accustomed to the Git workflow. Contributions are most welcome!
|
5
|
-
## Badges
|
6
|
-
[![Inline docs](http://inch-ci.org/github/martimatix/Ruby-Dice.svg?branch=master)](http://inch-ci.org/github/martimatix/Ruby-Dice)
|
7
|
-
[![Code Climate](https://codeclimate.com/github/martimatix/Ruby-Dice/badges/gpa.svg)](https://codeclimate.com/github/martimatix/Ruby-Dice)
|
8
|
-
[![Build Status](https://travis-ci.org/martimatix/Ruby-Dice.svg)](https://travis-ci.org/martimatix/Ruby-Dice)
|
9
|
-
[![Test Coverage](https://codeclimate.com/github/martimatix/Ruby-Dice/badges/coverage.svg)](https://codeclimate.com/github/martimatix/Ruby-Dice)
|
10
|
-
|
11
|
-
* [rubydoc.info](http://www.rubydoc.info/github/martimatix/Ruby-Dice/master)
|
1
|
+
# Ruby_Dice
|
2
|
+
A Yahtzee clone written in Ruby that runs in the terminal
|
3
|
+
|
4
|
+
This project is a personal project for educational purposes and becoming accustomed to the Ruby programming paradigm. Furthermore, it's to become accustomed to the Git workflow. Contributions are most welcome!
|
5
|
+
## Badges
|
6
|
+
[![Inline docs](http://inch-ci.org/github/martimatix/Ruby-Dice.svg?branch=master)](http://inch-ci.org/github/martimatix/Ruby-Dice)
|
7
|
+
[![Code Climate](https://codeclimate.com/github/martimatix/Ruby-Dice/badges/gpa.svg)](https://codeclimate.com/github/martimatix/Ruby-Dice)
|
8
|
+
[![Build Status](https://travis-ci.org/martimatix/Ruby-Dice.svg)](https://travis-ci.org/martimatix/Ruby-Dice)
|
9
|
+
[![Test Coverage](https://codeclimate.com/github/martimatix/Ruby-Dice/badges/coverage.svg)](https://codeclimate.com/github/martimatix/Ruby-Dice)
|
10
|
+
[![Gem Version](https://badge.fury.io/rb/Ruby_Dice.svg)](http://badge.fury.io/rb/Ruby_Dice)
|
data/bin/Ruby_Dice
CHANGED
@@ -1,38 +1,38 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
BEGIN {
|
3
|
-
if ARGV.include? "-h"
|
4
|
-
puts <<HELP
|
5
|
-
Usage: $ Ruby_Dice [--help]
|
6
|
-
\u00B7 --help -> Displays this help message
|
7
|
-
|
8
|
-
Gameplay:
|
9
|
-
Abbreviations:
|
10
|
-
\u00B7 1 -> Ones
|
11
|
-
\u00B7 2 -> Twos
|
12
|
-
\u00B7 3 -> Threes
|
13
|
-
\u00B7 4 -> Fours
|
14
|
-
\u00B7 5 -> Fives
|
15
|
-
\u00B7 6 -> Sixes
|
16
|
-
\u00B7 ss -> Small Straight
|
17
|
-
\u00B7 ls -> Large Straight
|
18
|
-
\u00B7 tok -> Three Of A Kind
|
19
|
-
\u00B7 fok -> Four Of A Kind
|
20
|
-
\u00B7 fh -> Full House
|
21
|
-
\u00B7 y -> Yahtzee
|
22
|
-
\u00B7 ? -> chance
|
23
|
-
HELP
|
24
|
-
exit
|
25
|
-
end
|
26
|
-
}
|
27
|
-
|
28
|
-
require "Ruby_Dice"
|
29
|
-
|
30
|
-
user = Player.new
|
31
|
-
|
32
|
-
until user.score.filled? do
|
33
|
-
puts ?\n
|
34
|
-
puts "New Turn".center(80)
|
35
|
-
puts ?\n
|
36
|
-
sleep 0.5
|
37
|
-
user.take_turn
|
38
|
-
end
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
BEGIN {
|
3
|
+
if ARGV.include? "-h"
|
4
|
+
puts <<HELP
|
5
|
+
Usage: $ Ruby_Dice [--help]
|
6
|
+
\u00B7 --help -> Displays this help message
|
7
|
+
|
8
|
+
Gameplay:
|
9
|
+
Abbreviations:
|
10
|
+
\u00B7 1 -> Ones
|
11
|
+
\u00B7 2 -> Twos
|
12
|
+
\u00B7 3 -> Threes
|
13
|
+
\u00B7 4 -> Fours
|
14
|
+
\u00B7 5 -> Fives
|
15
|
+
\u00B7 6 -> Sixes
|
16
|
+
\u00B7 ss -> Small Straight
|
17
|
+
\u00B7 ls -> Large Straight
|
18
|
+
\u00B7 tok -> Three Of A Kind
|
19
|
+
\u00B7 fok -> Four Of A Kind
|
20
|
+
\u00B7 fh -> Full House
|
21
|
+
\u00B7 y -> Yahtzee
|
22
|
+
\u00B7 ? -> chance
|
23
|
+
HELP
|
24
|
+
exit
|
25
|
+
end
|
26
|
+
}
|
27
|
+
|
28
|
+
require "Ruby_Dice"
|
29
|
+
|
30
|
+
user = Player.new
|
31
|
+
|
32
|
+
until user.score.filled? do
|
33
|
+
puts ?\n
|
34
|
+
puts "New Turn".center(80)
|
35
|
+
puts ?\n
|
36
|
+
sleep 0.5
|
37
|
+
user.take_turn
|
38
|
+
end
|
data/lib/Ruby_Dice.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
autoload :Dice, "dice"
|
2
|
-
autoload :Player, "player"
|
3
|
-
autoload :ScoreSheet, "scoresheet"
|
4
|
-
autoload :Scoring, "scoring"
|
1
|
+
autoload :Dice, "dice"
|
2
|
+
autoload :Player, "player"
|
3
|
+
autoload :ScoreSheet, "scoresheet"
|
4
|
+
autoload :Scoring, "scoring"
|
data/lib/dice.rb
CHANGED
@@ -1,59 +1,65 @@
|
|
1
|
-
class Dice # Class for working with the 5 dice at the same time
|
2
|
-
|
3
|
-
attr_reader :values # @return [Array] the dice.
|
4
|
-
|
5
|
-
def initialize(values=Array.new(5) {new_dice}) # @param values [Array<Fixnum>] that contains 5 Fixnums
|
6
|
-
check_dice values
|
7
|
-
@values = values
|
8
|
-
end
|
9
|
-
|
10
|
-
# @!group Roll Methods
|
11
|
-
|
12
|
-
=begin
|
13
|
-
@raise [ArgumentError] if i element > 4
|
14
|
-
@return [void]
|
15
|
-
@param i [Array<Fixnum>] < 4
|
16
|
-
=end
|
17
|
-
def roll(dice_to_roll)
|
18
|
-
for index in dice_to_roll
|
19
|
-
raise ArgumentError, "Illegal index" if index > 4
|
20
|
-
@values[index] = new_dice
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
=begin
|
25
|
-
@note Rolls all the dice
|
26
|
-
|
27
|
-
@return [
|
28
|
-
=end
|
29
|
-
def roll_all
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
@
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
@return [
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
1
|
+
class Dice # Class for working with the 5 dice at the same time
|
2
|
+
|
3
|
+
attr_reader :values # @return [Array] the dice.
|
4
|
+
|
5
|
+
def initialize(values=Array.new(5) {new_dice}) # @param values [Array<Fixnum>] that contains 5 Fixnums
|
6
|
+
check_dice values
|
7
|
+
@values = values
|
8
|
+
end
|
9
|
+
|
10
|
+
# @!group Roll Methods
|
11
|
+
|
12
|
+
=begin
|
13
|
+
@raise [ArgumentError] if i element > 4
|
14
|
+
@return [void]
|
15
|
+
@param i [Array<Fixnum>] < 4
|
16
|
+
=end
|
17
|
+
def roll(dice_to_roll)
|
18
|
+
for index in dice_to_roll
|
19
|
+
raise ArgumentError, "Illegal index" if index > 4
|
20
|
+
@values[index] = new_dice
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
=begin
|
25
|
+
@note Rolls all the dice
|
26
|
+
|
27
|
+
@return [Dice]
|
28
|
+
=end
|
29
|
+
def roll_all
|
30
|
+
new
|
31
|
+
end
|
32
|
+
|
33
|
+
# @!endgroup
|
34
|
+
|
35
|
+
def to_s # @return [String] instance variable dice
|
36
|
+
print @values
|
37
|
+
end
|
38
|
+
alias display to_s
|
39
|
+
|
40
|
+
=begin
|
41
|
+
@param values [Array<Integer>]
|
42
|
+
@see (#check_dice)
|
43
|
+
@note setting dice for values for testing
|
44
|
+
@!parse attr_writer :values
|
45
|
+
=end
|
46
|
+
def values=(values)
|
47
|
+
check_dice values
|
48
|
+
@values = values
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def new_dice # @return [Fixnum] a random number between 1 and 6, inclusive
|
54
|
+
(1..6).to_a.sample
|
55
|
+
end
|
56
|
+
|
57
|
+
=begin
|
58
|
+
@param dice [Array<Fixnum>]
|
59
|
+
@return [void]
|
60
|
+
@raise [ArgumentError] if dice does not meet expectations
|
61
|
+
=end
|
62
|
+
def check_dice(dice)
|
63
|
+
raise(ArgumentError, "Array must have 5 Integers that are between 1 and 6") unless dice.length == 5 && dice.all? {|val| (val.is_a? Fixnum) && (val.between? 1,6)}
|
64
|
+
end
|
65
|
+
end
|
data/lib/player.rb
CHANGED
@@ -1,90 +1,118 @@
|
|
1
|
-
require_relative "scoresheet.rb"
|
2
|
-
require 'set'
|
3
|
-
|
4
|
-
class Player
|
5
|
-
|
6
|
-
ScoreAbbr = { # Abbreviations used in-game
|
7
|
-
?1.to_sym => :ones,
|
8
|
-
?2.to_sym => :twos,
|
9
|
-
?3.to_sym => :threes,
|
10
|
-
?4.to_sym => :fours,
|
11
|
-
?5.to_sym => :fives,
|
12
|
-
?6.to_sym => :sixes,
|
13
|
-
ss: :small_straight,
|
14
|
-
ls: :large_straight,
|
15
|
-
tok: :three_of_a_kind,
|
16
|
-
fok: :four_of_a_kind,
|
17
|
-
fh: :full_house,
|
18
|
-
y: :yahtzee,
|
19
|
-
"?".to_sym => :chance
|
20
|
-
}
|
21
|
-
|
22
|
-
attr_reader :score # @return [ScoreSheet]
|
23
|
-
|
24
|
-
def initialize
|
25
|
-
@score = ScoreSheet.new
|
26
|
-
end
|
27
|
-
|
28
|
-
=begin
|
29
|
-
@todo finish method
|
30
|
-
@return [void]
|
31
|
-
=end
|
32
|
-
def take_turn
|
33
|
-
turn_over = false
|
34
|
-
(1..3).each do |i|
|
35
|
-
display_dice i
|
36
|
-
turn_over = user_input i
|
37
|
-
break if turn_over
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def display_dice(i)
|
42
|
-
sleep 0.5
|
43
|
-
puts String.new.center(80, ?-)
|
44
|
-
puts "Here are your dice. You have have #{3-i} #{i==2? "roll":"rolls"} remaining.\n\n"
|
45
|
-
puts "\tDice\t\tZ\tX\tC\tV\tB"
|
46
|
-
puts "\tValues\t\t" + score.dice.values.map{|value| value.to_s}.join(?\t)
|
47
|
-
puts String.new.center(80, ?-)
|
48
|
-
end
|
49
|
-
|
50
|
-
=begin
|
51
|
-
@param i [Fixnum] Amount of times rolled
|
52
|
-
@return [Boolean]
|
53
|
-
@note Gameplay
|
54
|
-
=end
|
55
|
-
def user_input(i)
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
#
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
1
|
+
require_relative "scoresheet.rb"
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
class Player
|
5
|
+
|
6
|
+
ScoreAbbr = { # Abbreviations used in-game
|
7
|
+
?1.to_sym => :ones,
|
8
|
+
?2.to_sym => :twos,
|
9
|
+
?3.to_sym => :threes,
|
10
|
+
?4.to_sym => :fours,
|
11
|
+
?5.to_sym => :fives,
|
12
|
+
?6.to_sym => :sixes,
|
13
|
+
ss: :small_straight,
|
14
|
+
ls: :large_straight,
|
15
|
+
tok: :three_of_a_kind,
|
16
|
+
fok: :four_of_a_kind,
|
17
|
+
fh: :full_house,
|
18
|
+
y: :yahtzee,
|
19
|
+
"?".to_sym => :chance
|
20
|
+
}
|
21
|
+
|
22
|
+
attr_reader :score # @return [ScoreSheet]
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
@score = ScoreSheet.new
|
26
|
+
end
|
27
|
+
|
28
|
+
=begin
|
29
|
+
@todo finish method
|
30
|
+
@return [void]
|
31
|
+
=end
|
32
|
+
def take_turn
|
33
|
+
turn_over = false
|
34
|
+
(1..3).each do |i|
|
35
|
+
display_dice i
|
36
|
+
turn_over = user_input i
|
37
|
+
break if turn_over
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def display_dice(i)
|
42
|
+
sleep 0.5
|
43
|
+
puts String.new.center(80, ?-)
|
44
|
+
puts "Here are your dice. You have have #{3-i} #{i==2? "roll":"rolls"} remaining.\n\n"
|
45
|
+
puts "\tDice\t\tZ\tX\tC\tV\tB"
|
46
|
+
puts "\tValues\t\t" + score.dice.values.map{|value| value.to_s}.join(?\t)
|
47
|
+
puts String.new.center(80, ?-)
|
48
|
+
end
|
49
|
+
|
50
|
+
=begin
|
51
|
+
@param i [Fixnum] Amount of times rolled
|
52
|
+
@return [Boolean]
|
53
|
+
@note Gameplay
|
54
|
+
=end
|
55
|
+
def user_input(i)
|
56
|
+
|
57
|
+
print_instructions i
|
58
|
+
|
59
|
+
input = gets.chomp.downcase
|
60
|
+
user_input = Set.new(input.split(''))
|
61
|
+
dice_controls = Set.new("zxcvb".split(''))
|
62
|
+
|
63
|
+
# If user wants to enter score
|
64
|
+
if ScoreAbbr.keys.include? input.to_sym
|
65
|
+
user_enter_score input.to_sym, i
|
66
|
+
# Else if user wants to roll the dice
|
67
|
+
elsif i < 3 && (user_input.subset? dice_controls)
|
68
|
+
user_roll_dice input, dice_controls
|
69
|
+
else
|
70
|
+
invalid_input
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Private methods need to be indented properly
|
75
|
+
private
|
76
|
+
def print_instructions i
|
77
|
+
if i < 3
|
78
|
+
print "Select dice to re-roll or select a score category: "
|
79
|
+
else
|
80
|
+
print "No rolls remaining. Select a score category: "
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def user_enter_score input_symbol, i
|
85
|
+
field = ScoreAbbr[input_symbol]
|
86
|
+
@score.enter_score field
|
87
|
+
puts score
|
88
|
+
@score.dice.roll_all
|
89
|
+
sleep 2
|
90
|
+
return true
|
91
|
+
rescue
|
92
|
+
puts "\n"
|
93
|
+
sleep 0.5
|
94
|
+
puts " You have already entered a score for that category. Try again. ".center(80, '!')
|
95
|
+
sleep 1.5
|
96
|
+
puts "\n"
|
97
|
+
user_input i
|
98
|
+
end
|
99
|
+
|
100
|
+
def user_roll_dice input, dice_controls
|
101
|
+
dice_to_roll = (0..4).to_a.select { |index| input.include? dice_controls.to_a[index]}
|
102
|
+
@score.dice.roll(dice_to_roll)
|
103
|
+
sleep 0.5
|
104
|
+
2.times {puts ?\n}
|
105
|
+
puts " Rolling Dice!\ ".center 80, "* "
|
106
|
+
sleep 1
|
107
|
+
return false
|
108
|
+
end
|
109
|
+
|
110
|
+
def invalid_input
|
111
|
+
puts "Invalid input. Please try again."
|
112
|
+
sleep 1.5
|
113
|
+
puts ?\n
|
114
|
+
user_input i
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
data/lib/scoresheet.rb
CHANGED
@@ -1,156 +1,155 @@
|
|
1
|
-
require_relative "dice.rb"
|
2
|
-
require_relative "scoring.rb"
|
3
|
-
|
4
|
-
class ScoreSheet # Keeps score throughout the game
|
5
|
-
include Scoring
|
6
|
-
|
7
|
-
UpperScores = :ones, :twos, :threes, :fours, :fives, :sixes # The fields on the top section of the score sheet
|
8
|
-
|
9
|
-
LowerScores = :three_of_a_kind, :four_of_a_kind, :full_house, :small_straight, :large_straight, :chance, :yahtzee # The fields on the bottom section of the score sheet
|
10
|
-
|
11
|
-
attr_reader :sheet # @return [Hash] table of two element arrays where the first value is the score and the second is whether the field has been played
|
12
|
-
attr_reader :dice # @return [Dice]
|
13
|
-
attr_reader :num_yahtzees # @return [Fixnum] counter for number of yahtzees scored in the game
|
14
|
-
=begin
|
15
|
-
@param custom_dice [Array<Fixnum>] custom dice for testing
|
16
|
-
=end
|
17
|
-
def initialize(custom_dice=Array.new(5) {Dice.new.instance_eval "new_dice"})
|
18
|
-
@sheet, @dice, @num_yahtzees = Hash.new, Dice.new(custom_dice), 0
|
19
|
-
Array.new(UpperScores).concat(LowerScores).each {|s| @sheet[s] = [0, false]}
|
20
|
-
end
|
21
|
-
|
22
|
-
=begin
|
23
|
-
@param field [Symbol]
|
24
|
-
@return [void]
|
25
|
-
@raise ArgumentError
|
26
|
-
=end
|
27
|
-
def enter_score(field)
|
28
|
-
if field == :yahtzee && ((available :yahtzee) || @num_yahtzees > 0)
|
29
|
-
@sheet[field] = yahtzee, true
|
30
|
-
elsif available field
|
31
|
-
@sheet[field] = send(field, @dice.values), true
|
32
|
-
else
|
33
|
-
raise ArgumentError, "Score already entered."
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
=begin
|
38
|
-
@return [true] if the score sheet is completely filled and no legal moves remain
|
39
|
-
@return [false] if the score sheet is not completely filled and there are still legal moves to be made
|
40
|
-
=end
|
41
|
-
def filled?
|
42
|
-
@sheet.collect{|k,v| v[1]}.reduce{|r,e| r && e}
|
43
|
-
end
|
44
|
-
|
45
|
-
def raw_upper # @return [Fixnum]
|
46
|
-
@sheet.select{|x| UpperScores.include? x }.collect{|k,v| v[0]}.reduce :+
|
47
|
-
end
|
48
|
-
|
49
|
-
def upper_score_total # @return [Fixnum] the total score of the upper part of the ScoreSheet, including bonuses
|
50
|
-
raw_upper + upper_score_bonus
|
51
|
-
end
|
52
|
-
def lower_score_total # @return [Integer] The total score of the lower part of the ScoreSheet
|
53
|
-
@sheet.select{|x| LowerScores.include? x }.collect{|k,v| v[0]}.reduce :+
|
54
|
-
end
|
55
|
-
def total # @return [Integer] the grand total
|
56
|
-
lower_score_total + upper_score_total
|
57
|
-
end
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
=begin
|
62
|
-
Checks if upper score bonus can be awarded
|
63
|
-
@return [Fixnum] 0 if raw_upper < 63
|
64
|
-
@return [Fixnum] 35 if raw_upper >= 63
|
65
|
-
=end
|
66
|
-
def upper_score_bonus
|
67
|
-
if raw_upper >= 63 then 35
|
68
|
-
else
|
69
|
-
0
|
70
|
-
end
|
71
|
-
end
|
72
|
-
=begin
|
73
|
-
@return [Fixnum]
|
74
|
-
Checks to see if you have all the of the same dice
|
75
|
-
=end
|
76
|
-
def yahtzee
|
77
|
-
if dice.values.all? {|x| x == dice.values[0]}
|
78
|
-
@num_yahtzees += 1
|
79
|
-
return sheet[:yahtzee][0] + 50 * 2 ** (@num_yahtzees - 1)
|
80
|
-
else
|
81
|
-
return 0
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
=begin
|
86
|
-
@todo Find a less complex way to create final string
|
87
|
-
@return [String]
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
ss
|
92
|
-
|
93
|
-
|
94
|
-
ss +=
|
95
|
-
ss += "
|
96
|
-
ss +=
|
97
|
-
ss
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
upper, lower
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
bonus_string, yahtzee_string
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
@
|
126
|
-
@param
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
score_label
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
@
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
end
|
1
|
+
require_relative "dice.rb"
|
2
|
+
require_relative "scoring.rb"
|
3
|
+
|
4
|
+
class ScoreSheet # Keeps score throughout the game
|
5
|
+
include Scoring
|
6
|
+
|
7
|
+
UpperScores = :ones, :twos, :threes, :fours, :fives, :sixes # The fields on the top section of the score sheet
|
8
|
+
|
9
|
+
LowerScores = :three_of_a_kind, :four_of_a_kind, :full_house, :small_straight, :large_straight, :chance, :yahtzee # The fields on the bottom section of the score sheet
|
10
|
+
|
11
|
+
attr_reader :sheet # @return [Hash] table of two element arrays where the first value is the score and the second is whether the field has been played
|
12
|
+
attr_reader :dice # @return [Dice]
|
13
|
+
attr_reader :num_yahtzees # @return [Fixnum] counter for number of yahtzees scored in the game
|
14
|
+
=begin
|
15
|
+
@param custom_dice [Array<Fixnum>] custom dice for testing
|
16
|
+
=end
|
17
|
+
def initialize(custom_dice=Array.new(5) {Dice.new.instance_eval "new_dice"})
|
18
|
+
@sheet, @dice, @num_yahtzees = Hash.new, Dice.new(custom_dice), 0
|
19
|
+
Array.new(UpperScores).concat(LowerScores).each {|s| @sheet[s] = [0, false]}
|
20
|
+
end
|
21
|
+
|
22
|
+
=begin
|
23
|
+
@param field [Symbol]
|
24
|
+
@return [void]
|
25
|
+
@raise ArgumentError
|
26
|
+
=end
|
27
|
+
def enter_score(field)
|
28
|
+
if field == :yahtzee && ((available :yahtzee) || @num_yahtzees > 0)
|
29
|
+
@sheet[field] = yahtzee, true
|
30
|
+
elsif available field
|
31
|
+
@sheet[field] = send(field, @dice.values), true
|
32
|
+
else
|
33
|
+
raise ArgumentError, "Score already entered."
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
=begin
|
38
|
+
@return [true] if the score sheet is completely filled and no legal moves remain
|
39
|
+
@return [false] if the score sheet is not completely filled and there are still legal moves to be made
|
40
|
+
=end
|
41
|
+
def filled?
|
42
|
+
@sheet.collect{|k,v| v[1]}.reduce{|r,e| r && e}
|
43
|
+
end
|
44
|
+
|
45
|
+
def raw_upper # @return [Fixnum]
|
46
|
+
@sheet.select{|x| UpperScores.include? x }.collect{|k,v| v[0]}.reduce :+
|
47
|
+
end
|
48
|
+
|
49
|
+
def upper_score_total # @return [Fixnum] the total score of the upper part of the ScoreSheet, including bonuses
|
50
|
+
raw_upper + upper_score_bonus
|
51
|
+
end
|
52
|
+
def lower_score_total # @return [Integer] The total score of the lower part of the ScoreSheet
|
53
|
+
@sheet.select{|x| LowerScores.include? x }.collect{|k,v| v[0]}.reduce :+
|
54
|
+
end
|
55
|
+
def total # @return [Integer] the grand total
|
56
|
+
lower_score_total + upper_score_total
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
=begin
|
62
|
+
Checks if upper score bonus can be awarded
|
63
|
+
@return [Fixnum] 0 if raw_upper < 63
|
64
|
+
@return [Fixnum] 35 if raw_upper >= 63
|
65
|
+
=end
|
66
|
+
def upper_score_bonus
|
67
|
+
if raw_upper >= 63 then 35
|
68
|
+
else
|
69
|
+
0
|
70
|
+
end
|
71
|
+
end
|
72
|
+
=begin
|
73
|
+
@return [Fixnum]
|
74
|
+
Checks to see if you have all the of the same dice
|
75
|
+
=end
|
76
|
+
def yahtzee
|
77
|
+
if dice.values.all? {|x| x == dice.values[0]}
|
78
|
+
@num_yahtzees += 1
|
79
|
+
return sheet[:yahtzee][0] + 50 * 2 ** (@num_yahtzees - 1)
|
80
|
+
else
|
81
|
+
return 0
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
=begin
|
86
|
+
@todo Find a less complex way to create final string
|
87
|
+
@return [String]
|
88
|
+
=end
|
89
|
+
def to_s
|
90
|
+
ss = String.new
|
91
|
+
ss += %Q( S C O R E S H E E T ).center(80, ?=) + "\n\n"
|
92
|
+
(0..(UpperScores.length - 1)).each { |i| ss += print_score_sheet_line(i) }
|
93
|
+
ss += bonus_yahtzee_line
|
94
|
+
ss += "\n\n"
|
95
|
+
ss += "Total Score: #{total}".center(80) + ?\n
|
96
|
+
ss += (?= * 80) + ?\n
|
97
|
+
return ss
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
private # Helper methods
|
102
|
+
|
103
|
+
def available (field)
|
104
|
+
@sheet[field][1] == false
|
105
|
+
end
|
106
|
+
|
107
|
+
def score_sheet_line(left_val, right_val)
|
108
|
+
(left_val + "\t\t" + right_val).center(68) + ?\n
|
109
|
+
end
|
110
|
+
alias ssl score_sheet_line
|
111
|
+
|
112
|
+
def print_score_sheet_line(i);
|
113
|
+
upper, lower = format_score(UpperScores, i), format_score(LowerScores, i)
|
114
|
+
ssl upper, lower
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
def bonus_yahtzee_line
|
119
|
+
bonus_string, yahtzee_string = justify_score("Bonus", upper_score_bonus.to_s), format_score(LowerScores, LowerScores.length - 1)
|
120
|
+
ssl bonus_string, yahtzee_string
|
121
|
+
end
|
122
|
+
alias byl bonus_yahtzee_line
|
123
|
+
=begin
|
124
|
+
@return [String] the formatted string
|
125
|
+
@param index [Fixnum]
|
126
|
+
@param score_region [String, Array<String>]
|
127
|
+
Replace underscores with spaces
|
128
|
+
=end
|
129
|
+
def format_score(score_region, index)
|
130
|
+
score_label = "#{score_region[index]}".tr(?_, " ")
|
131
|
+
cap_label score_label
|
132
|
+
score_field = @sheet[score_region[index]]
|
133
|
+
return justify_score(score_label, "#{score_field[1]? score_field[0]:?-}")
|
134
|
+
end
|
135
|
+
|
136
|
+
def justify_score(label, score)
|
137
|
+
label.ljust(20) + score.rjust(3)
|
138
|
+
end
|
139
|
+
|
140
|
+
=begin
|
141
|
+
@param score_label [String]
|
142
|
+
@return [String]
|
143
|
+
Capitalize each letter of each word only if the score label has two words
|
144
|
+
Else only capitalize the first letter of the score label
|
145
|
+
=end
|
146
|
+
def cap_label(score_label)
|
147
|
+
if score_label.split.length == 2
|
148
|
+
score_label = score_label.split.map(&:capitalize)*' '
|
149
|
+
else
|
150
|
+
score_label.capitalize!
|
151
|
+
end
|
152
|
+
end
|
153
|
+
public
|
154
|
+
alias display to_s
|
155
|
+
end
|
data/lib/scoring.rb
CHANGED
@@ -1,145 +1,145 @@
|
|
1
|
-
require_relative "dice.rb"
|
2
|
-
|
3
|
-
module Scoring # methods for calculating score
|
4
|
-
|
5
|
-
UpperScores = :ones, :twos, :threes, :fours, :fives, :sixes # The fields on the top section of the score sheet
|
6
|
-
|
7
|
-
LowerScores = :three_of_a_kind, :four_of_a_kind, :full_house, :small_straight, :large_straight, :chance, :yahtzee # The fields on the bottom section of the score sheet
|
8
|
-
|
9
|
-
=begin
|
10
|
-
Checks to see if you have 3 of one kind of dice and 2 of another
|
11
|
-
@return [Fixnum] 25 if @dice.dice contains 3 of one Fixnum and 2 of another
|
12
|
-
@return [Fixnum] 0 if @dice.dice does not contain 3 of one Fixnum and 2 of another
|
13
|
-
=end
|
14
|
-
def full_house(dice)
|
15
|
-
f_table = freq dice
|
16
|
-
if (f_table.length == 2 && f_table.has_value?(3)) || f_table.length == 1 then return 25
|
17
|
-
else; return 0
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
=begin
|
22
|
-
Checks to see if you have 4 of the same dice
|
23
|
-
@return [Fixnum] 0 if <= 4 indices have the same value
|
24
|
-
@return [Fixnum] dice.reduce(:+) if >= 4 indices have the same value
|
25
|
-
@see (#three_of_a_kind)
|
26
|
-
=end
|
27
|
-
def four_of_a_kind(dice)
|
28
|
-
of_a_kind dice, 4
|
29
|
-
end
|
30
|
-
|
31
|
-
=begin
|
32
|
-
@param d [Array<Fixnum>] the dice to be tested
|
33
|
-
@return [Fixnum] the score
|
34
|
-
=end
|
35
|
-
def ones(d)
|
36
|
-
single_face d, 1
|
37
|
-
end
|
38
|
-
|
39
|
-
def twos(d) # @see (#ones)
|
40
|
-
single_face d, 2
|
41
|
-
end
|
42
|
-
|
43
|
-
def threes(d) # @see (#ones)
|
44
|
-
single_face d, 3
|
45
|
-
end
|
46
|
-
|
47
|
-
def fours(d) # @see (#ones)
|
48
|
-
single_face d, 4
|
49
|
-
end
|
50
|
-
|
51
|
-
def fives(d) # @see (#ones)
|
52
|
-
single_face d, 5
|
53
|
-
end
|
54
|
-
|
55
|
-
def sixes(d) # @see (#ones)
|
56
|
-
single_face d, 6
|
57
|
-
end
|
58
|
-
|
59
|
-
=begin
|
60
|
-
@see (#four_of_a_kind)
|
61
|
-
Checks to see if you have 3 of the same dice
|
62
|
-
@return [Fixnum] dice.reduce(:+) if there is <= 3 of the same value
|
63
|
-
@return [Fixnum] 0 if you do not have a three of a kind
|
64
|
-
=end
|
65
|
-
def three_of_a_kind(dice)
|
66
|
-
of_a_kind dice, 3
|
67
|
-
end
|
68
|
-
|
69
|
-
=begin
|
70
|
-
@param dice [Array<Fixnum>] the dice to be evaluated
|
71
|
-
@return [Fixnum] the sum of all the dice
|
72
|
-
=end
|
73
|
-
def chance(dice)
|
74
|
-
dice.reduce :+
|
75
|
-
end
|
76
|
-
|
77
|
-
=begin
|
78
|
-
@param dice [Array<Fixnum>] the dice to be tested
|
79
|
-
@return [Fixnum] 30 if there are 3 consecutive Fixnums in dice
|
80
|
-
@return [Fixnum] 0 if there are not three conscecutive Fixnums in dice
|
81
|
-
@see (#large_straight)
|
82
|
-
=end
|
83
|
-
def small_straight(dice)
|
84
|
-
straight dice, 4, 30
|
85
|
-
end
|
86
|
-
alias SS small_straight
|
87
|
-
|
88
|
-
=begin
|
89
|
-
@param dice [Array<Fixnum>] the dice to be tested
|
90
|
-
@return [Fixnum] 40 if there are 4 consecutive Fixnums in dice
|
91
|
-
@return [Fixnum] 0 if there are not three conscecutive Fixnums in dice
|
92
|
-
@see (#small_straight)
|
93
|
-
=end
|
94
|
-
def large_straight(dice)
|
95
|
-
straight dice, 5, 40
|
96
|
-
end
|
97
|
-
alias LS large_straight
|
98
|
-
|
99
|
-
private # Helper methods for score calculation
|
100
|
-
|
101
|
-
def single_face(dice, value)
|
102
|
-
v = dice.select{|number| number == value}.reduce :+
|
103
|
-
unless v.nil?
|
104
|
-
return v
|
105
|
-
else
|
106
|
-
return 0
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def freq(dice)
|
111
|
-
dice.inject(Hash.new(0)) { |h,v| h[v] += 1; h }
|
112
|
-
end
|
113
|
-
|
114
|
-
def modal_frequency(dice)
|
115
|
-
freq(dice).max_by{|k,v| v}[1]
|
116
|
-
end
|
117
|
-
|
118
|
-
def of_a_kind(dice, limit)
|
119
|
-
if modal_frequency(dice) >= limit
|
120
|
-
dice.reduce :+
|
121
|
-
else
|
122
|
-
0
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
=begin
|
127
|
-
@param dice [Fixnum] the dice to be tested
|
128
|
-
@param limit [Fixnum] = 4 for small straight
|
129
|
-
@param limit [Fixnum] = 5 for large straight
|
130
|
-
common code for both small straight (SS) and large straight (LS)
|
131
|
-
@param score [Fixnum] is the score to return
|
132
|
-
@return [Fixnum] score
|
133
|
-
=end
|
134
|
-
def straight(dice, limit, score)
|
135
|
-
#each_cons is generating every possible value for a straight of length limit
|
136
|
-
(1..6).each_cons(limit).each do |i|
|
137
|
-
# Asking if i is a subset of dice
|
138
|
-
if (i - dice).empty?
|
139
|
-
return score if (i - dice)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
return 0
|
143
|
-
end
|
144
|
-
|
145
|
-
end
|
1
|
+
require_relative "dice.rb"
|
2
|
+
|
3
|
+
module Scoring # methods for calculating score
|
4
|
+
|
5
|
+
UpperScores = :ones, :twos, :threes, :fours, :fives, :sixes # The fields on the top section of the score sheet
|
6
|
+
|
7
|
+
LowerScores = :three_of_a_kind, :four_of_a_kind, :full_house, :small_straight, :large_straight, :chance, :yahtzee # The fields on the bottom section of the score sheet
|
8
|
+
|
9
|
+
=begin
|
10
|
+
Checks to see if you have 3 of one kind of dice and 2 of another
|
11
|
+
@return [Fixnum] 25 if @dice.dice contains 3 of one Fixnum and 2 of another
|
12
|
+
@return [Fixnum] 0 if @dice.dice does not contain 3 of one Fixnum and 2 of another
|
13
|
+
=end
|
14
|
+
def full_house(dice)
|
15
|
+
f_table = freq dice
|
16
|
+
if (f_table.length == 2 && f_table.has_value?(3)) || f_table.length == 1 then return 25
|
17
|
+
else; return 0
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
=begin
|
22
|
+
Checks to see if you have 4 of the same dice
|
23
|
+
@return [Fixnum] 0 if <= 4 indices have the same value
|
24
|
+
@return [Fixnum] dice.reduce(:+) if >= 4 indices have the same value
|
25
|
+
@see (#three_of_a_kind)
|
26
|
+
=end
|
27
|
+
def four_of_a_kind(dice)
|
28
|
+
of_a_kind dice, 4
|
29
|
+
end
|
30
|
+
|
31
|
+
=begin
|
32
|
+
@param d [Array<Fixnum>] the dice to be tested
|
33
|
+
@return [Fixnum] the score
|
34
|
+
=end
|
35
|
+
def ones(d)
|
36
|
+
single_face d, 1
|
37
|
+
end
|
38
|
+
|
39
|
+
def twos(d) # @see (#ones)
|
40
|
+
single_face d, 2
|
41
|
+
end
|
42
|
+
|
43
|
+
def threes(d) # @see (#ones)
|
44
|
+
single_face d, 3
|
45
|
+
end
|
46
|
+
|
47
|
+
def fours(d) # @see (#ones)
|
48
|
+
single_face d, 4
|
49
|
+
end
|
50
|
+
|
51
|
+
def fives(d) # @see (#ones)
|
52
|
+
single_face d, 5
|
53
|
+
end
|
54
|
+
|
55
|
+
def sixes(d) # @see (#ones)
|
56
|
+
single_face d, 6
|
57
|
+
end
|
58
|
+
|
59
|
+
=begin
|
60
|
+
@see (#four_of_a_kind)
|
61
|
+
Checks to see if you have 3 of the same dice
|
62
|
+
@return [Fixnum] dice.reduce(:+) if there is <= 3 of the same value
|
63
|
+
@return [Fixnum] 0 if you do not have a three of a kind
|
64
|
+
=end
|
65
|
+
def three_of_a_kind(dice)
|
66
|
+
of_a_kind dice, 3
|
67
|
+
end
|
68
|
+
|
69
|
+
=begin
|
70
|
+
@param dice [Array<Fixnum>] the dice to be evaluated
|
71
|
+
@return [Fixnum] the sum of all the dice
|
72
|
+
=end
|
73
|
+
def chance(dice)
|
74
|
+
dice.reduce :+
|
75
|
+
end
|
76
|
+
|
77
|
+
=begin
|
78
|
+
@param dice [Array<Fixnum>] the dice to be tested
|
79
|
+
@return [Fixnum] 30 if there are 3 consecutive Fixnums in dice
|
80
|
+
@return [Fixnum] 0 if there are not three conscecutive Fixnums in dice
|
81
|
+
@see (#large_straight)
|
82
|
+
=end
|
83
|
+
def small_straight(dice)
|
84
|
+
straight dice, 4, 30
|
85
|
+
end
|
86
|
+
alias SS small_straight
|
87
|
+
|
88
|
+
=begin
|
89
|
+
@param dice [Array<Fixnum>] the dice to be tested
|
90
|
+
@return [Fixnum] 40 if there are 4 consecutive Fixnums in dice
|
91
|
+
@return [Fixnum] 0 if there are not three conscecutive Fixnums in dice
|
92
|
+
@see (#small_straight)
|
93
|
+
=end
|
94
|
+
def large_straight(dice)
|
95
|
+
straight dice, 5, 40
|
96
|
+
end
|
97
|
+
alias LS large_straight
|
98
|
+
|
99
|
+
private # Helper methods for score calculation
|
100
|
+
|
101
|
+
def single_face(dice, value)
|
102
|
+
v = dice.select{|number| number == value}.reduce :+
|
103
|
+
unless v.nil?
|
104
|
+
return v
|
105
|
+
else
|
106
|
+
return 0
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def freq(dice)
|
111
|
+
dice.inject(Hash.new(0)) { |h,v| h[v] += 1; h }
|
112
|
+
end
|
113
|
+
|
114
|
+
def modal_frequency(dice)
|
115
|
+
freq(dice).max_by{|k,v| v}[1]
|
116
|
+
end
|
117
|
+
|
118
|
+
def of_a_kind(dice, limit)
|
119
|
+
if modal_frequency(dice) >= limit
|
120
|
+
dice.reduce :+
|
121
|
+
else
|
122
|
+
0
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
=begin
|
127
|
+
@param dice [Fixnum] the dice to be tested
|
128
|
+
@param limit [Fixnum] = 4 for small straight
|
129
|
+
@param limit [Fixnum] = 5 for large straight
|
130
|
+
common code for both small straight (SS) and large straight (LS)
|
131
|
+
@param score [Fixnum] is the score to return
|
132
|
+
@return [Fixnum] score
|
133
|
+
=end
|
134
|
+
def straight(dice, limit, score)
|
135
|
+
#each_cons is generating every possible value for a straight of length limit
|
136
|
+
(1..6).each_cons(limit).each do |i|
|
137
|
+
# Asking if i is a subset of dice
|
138
|
+
if (i - dice).empty?
|
139
|
+
return score if (i - dice)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
return 0
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Ruby_Dice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 1.0.0.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zachary Perlmutter
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-12-
|
12
|
+
date: 2014-12-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -61,7 +61,7 @@ files:
|
|
61
61
|
- lib/player.rb
|
62
62
|
- lib/scoresheet.rb
|
63
63
|
- lib/scoring.rb
|
64
|
-
homepage:
|
64
|
+
homepage: https://rubygems.org/gems/Ruby_Dice
|
65
65
|
licenses:
|
66
66
|
- MIT
|
67
67
|
metadata: {}
|
@@ -76,14 +76,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
76
76
|
version: '0'
|
77
77
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
|
-
- - "
|
79
|
+
- - ">"
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version:
|
81
|
+
version: 1.3.1
|
82
82
|
requirements:
|
83
|
-
-
|
83
|
+
- Terminal
|
84
84
|
rubyforge_project:
|
85
85
|
rubygems_version: 2.4.5
|
86
86
|
signing_key:
|
87
87
|
specification_version: 4
|
88
88
|
summary: A Yahtzee clone written in Ruby that runs in the terminal
|
89
89
|
test_files: []
|
90
|
+
has_rdoc:
|