mastermind-scott 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/mastermind-scott +7 -0
- data/lib/cli.rb +55 -0
- data/lib/colors.rb +25 -0
- data/lib/game.rb +133 -0
- data/lib/game_prompts.rb +78 -0
- data/lib/table.rb +41 -0
- data/lib/validate.rb +48 -0
- data/mastermind-scott.gemspec +20 -0
- data/mastermind.rb +5 -0
- metadata +53 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 54f48223242e2c5c2c3ad37bf66c1f21b9d1263f
|
4
|
+
data.tar.gz: 2c07c5c92922212b91b4139d7077843b304e9646
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 80abb136e8c64473a6f9481651070043f44b95acbcfc821c51cf49f5b69c2a49642e94aa6f0c5317da3c8a84f32b3c02297c58fa623f81599b36663b4c9e0c5b
|
7
|
+
data.tar.gz: b137c5ad1f7784c767ff0b858d5a55975fb079472e4e07829772953c568f54efc5ca60a475d71bf171c26de7cab8315e54723f2dce39dcad88dac422c9fba030
|
data/lib/cli.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require "game_prompts"
|
2
|
+
require "game"
|
3
|
+
|
4
|
+
class CLI
|
5
|
+
attr_reader :input,
|
6
|
+
:output,
|
7
|
+
:messages,
|
8
|
+
:command
|
9
|
+
|
10
|
+
def initialize(input, output)
|
11
|
+
@input = input
|
12
|
+
@output = output
|
13
|
+
@messages = GamePrompts.new
|
14
|
+
@command = ""
|
15
|
+
end
|
16
|
+
|
17
|
+
def call
|
18
|
+
output.puts @messages.mastermind_logo
|
19
|
+
output.puts @messages.intro_message
|
20
|
+
until quit?
|
21
|
+
output.puts @messages.player_input
|
22
|
+
@command = input.gets.strip.downcase
|
23
|
+
welcome_options
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
|
31
|
+
def welcome_options
|
32
|
+
case
|
33
|
+
when play?
|
34
|
+
game = Game.new(input, output, messages)
|
35
|
+
game.play
|
36
|
+
when instructions?
|
37
|
+
output.puts @messages.instructions
|
38
|
+
when quit?
|
39
|
+
output.puts @messages.quit
|
40
|
+
else
|
41
|
+
output.puts @messages.invalid
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def play?
|
46
|
+
command == "p" || command == "play"
|
47
|
+
end
|
48
|
+
|
49
|
+
def instructions?
|
50
|
+
command == "i" || command == "instructions"
|
51
|
+
end
|
52
|
+
|
53
|
+
def quit?
|
54
|
+
command == "q" || command == "quit"
|
55
|
+
end
|
data/lib/colors.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
class Colors
|
2
|
+
attr_reader :answer
|
3
|
+
def initialize
|
4
|
+
@answer = ['r','r','r','r']
|
5
|
+
end
|
6
|
+
|
7
|
+
def secret_answer
|
8
|
+
@answer = []
|
9
|
+
4.times do
|
10
|
+
answer << shuffle.pop
|
11
|
+
end
|
12
|
+
answer
|
13
|
+
end
|
14
|
+
|
15
|
+
def answer_options
|
16
|
+
["r","g","b","y"]
|
17
|
+
end
|
18
|
+
|
19
|
+
def shuffle
|
20
|
+
answer_options.shuffle
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
color = Colors.new
|
data/lib/game.rb
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
require_relative '../lib/colors'
|
2
|
+
require_relative '../lib/game_prompts'
|
3
|
+
require_relative "../lib/validate"
|
4
|
+
require_relative '../lib/table'
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
class Game
|
9
|
+
attr_reader :input,
|
10
|
+
:output,
|
11
|
+
:messages,
|
12
|
+
:answer,
|
13
|
+
:judge,
|
14
|
+
:command,
|
15
|
+
:guess_count,
|
16
|
+
:table,
|
17
|
+
:start_time
|
18
|
+
|
19
|
+
def initialize(input, output, messages)
|
20
|
+
@answer = Colors.new.secret_answer
|
21
|
+
@judge = Validate.new(@answer)
|
22
|
+
@start_time = Time.now
|
23
|
+
@table = Table.new
|
24
|
+
@input = input
|
25
|
+
@output = output
|
26
|
+
@messages = messages
|
27
|
+
@command = ""
|
28
|
+
@guess_count = 0
|
29
|
+
@old_guess = []
|
30
|
+
end
|
31
|
+
|
32
|
+
def play
|
33
|
+
output.puts messages.game_start
|
34
|
+
output.puts table.show
|
35
|
+
until win? || lose?
|
36
|
+
output.print messages.guess_prompt
|
37
|
+
@command = input.gets.chomp.downcase
|
38
|
+
guess_counter
|
39
|
+
turn_evaluation
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def turn_evaluation
|
47
|
+
output.puts messages.mastermind_logo
|
48
|
+
table_update
|
49
|
+
output.puts table.show
|
50
|
+
case
|
51
|
+
when quit?
|
52
|
+
abort(messages.quit)
|
53
|
+
when win?
|
54
|
+
output.puts messages.winner(answer, guess_count, minutes, seconds)
|
55
|
+
when !valid_size? || !valid_letters?
|
56
|
+
output.puts messages.guess_again
|
57
|
+
@guess_count -= 1
|
58
|
+
when lose?
|
59
|
+
output.puts messages.lose
|
60
|
+
else validator
|
61
|
+
output.puts messages.after_guess(command, number_correct, position_right)
|
62
|
+
output.puts messages.guess_count(guess_count)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def guess_counter
|
67
|
+
@guess_count += 1
|
68
|
+
end
|
69
|
+
|
70
|
+
def table_update
|
71
|
+
table.update(guess_count, command, number_correct, position_right, answer) if valid_size? && valid_letters?
|
72
|
+
end
|
73
|
+
|
74
|
+
def seconds
|
75
|
+
total_time % 60
|
76
|
+
end
|
77
|
+
|
78
|
+
def minutes
|
79
|
+
total_time / 60
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
def total_time
|
84
|
+
(end_time - @start_time).to_i
|
85
|
+
end
|
86
|
+
|
87
|
+
def end_time
|
88
|
+
Time.now
|
89
|
+
end
|
90
|
+
|
91
|
+
def win?
|
92
|
+
judge.correct?(parsed_guess)
|
93
|
+
end
|
94
|
+
|
95
|
+
def valid_size?
|
96
|
+
judge.size?(command)
|
97
|
+
# command.length == 4
|
98
|
+
end
|
99
|
+
|
100
|
+
def valid_letters?
|
101
|
+
judge.letters?(command)
|
102
|
+
end
|
103
|
+
|
104
|
+
def lose?
|
105
|
+
@guess_count >= 10
|
106
|
+
end
|
107
|
+
|
108
|
+
def quit?
|
109
|
+
command == "q" || command == "quit"
|
110
|
+
end
|
111
|
+
|
112
|
+
def validator
|
113
|
+
number_correct
|
114
|
+
position_right
|
115
|
+
end
|
116
|
+
|
117
|
+
def parsed_guess
|
118
|
+
@command.chars
|
119
|
+
end
|
120
|
+
|
121
|
+
def number_correct
|
122
|
+
judge.number_correct(parsed_guess)
|
123
|
+
end
|
124
|
+
|
125
|
+
def position_right
|
126
|
+
judge.position_check(parsed_guess)
|
127
|
+
end
|
128
|
+
|
129
|
+
def save_guess
|
130
|
+
@old_guess << @command
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
data/lib/game_prompts.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
class GamePrompts
|
2
|
+
attr_reader :intro_message # => nil
|
3
|
+
|
4
|
+
def intro_message
|
5
|
+
%x( say "so check me out")
|
6
|
+
"Welcome to MASTERMIND\n"+
|
7
|
+
"Would you like to (p)lay, read the (i)nstructions, or (q)uit?"
|
8
|
+
end
|
9
|
+
|
10
|
+
def lose
|
11
|
+
"Nice try you dummy." + play_again
|
12
|
+
end
|
13
|
+
|
14
|
+
def winner(answer, guess_count, minutes, seconds)
|
15
|
+
"WINNER! You guessed the sequence '#{answer.join('').upcase}' with #{guess_count} guesses in #{minutes} minutes and #{seconds} seconds.\n(p)lay again or (q)uit?"
|
16
|
+
end
|
17
|
+
|
18
|
+
def game_start
|
19
|
+
"I have generated a beginner sequence with four elements made up of: (r)ed, (g)reen, (b)lue, and (y)ellow. Use (q)uit at any time to end the game."
|
20
|
+
end
|
21
|
+
|
22
|
+
def mastermind_logo
|
23
|
+
puts
|
24
|
+
%q{
|
25
|
+
_ _ _
|
26
|
+
| | (_) | |
|
27
|
+
_ __ ___ __ _ ___| |_ ___ _ __ _ __ ___ _ _ __ __| |
|
28
|
+
| '_ ` _ \ / _` / __| __/ _ \ '__| '_ ` _ \| | '_ \ / _` |
|
29
|
+
| | | | | | (_| \__ \ || __/ | | | | | | | | | | | (_| |
|
30
|
+
|_| |_| |_|\__,_|___/\__\___|_| |_| |_| |_|_|_| |_|\__,_|
|
31
|
+
}
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
def play
|
36
|
+
"begin the game."
|
37
|
+
end
|
38
|
+
|
39
|
+
def player_input
|
40
|
+
"Enter Choice: "
|
41
|
+
end
|
42
|
+
|
43
|
+
def instructions
|
44
|
+
"A secret combination of colors has been chosen at random.\n\nYour job is to guess the correct sequence in 10 tries or less.\n\nIf you manage to win, you'll join the elite as a mastermind.\n\nIf you lose, the shambolic state of your life will be confirmed.\n\nGood luck!...you'll need it.\n\nPress (p) to play."
|
45
|
+
end
|
46
|
+
|
47
|
+
def quit
|
48
|
+
"Your father was right about you, you are a quitter."
|
49
|
+
end
|
50
|
+
|
51
|
+
def invalid
|
52
|
+
"Your argument is invalid. Try again."
|
53
|
+
end
|
54
|
+
|
55
|
+
def guess_prompt
|
56
|
+
"Take your guess: "
|
57
|
+
end
|
58
|
+
|
59
|
+
def guess_again
|
60
|
+
"The guess must only be 4 colors and either r, g, b, or y."
|
61
|
+
end
|
62
|
+
|
63
|
+
def guess_count(guess_count)
|
64
|
+
if guess_count == 1
|
65
|
+
"You have taken #{guess_count} guess."
|
66
|
+
else
|
67
|
+
"You have taken #{guess_count} guesses."
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def after_guess(guess,number_correct, position_right)
|
72
|
+
"Your guess '#{guess.upcase}' has #{number_correct} correct colors with #{position_right} in the correct position."
|
73
|
+
end
|
74
|
+
|
75
|
+
def play_again
|
76
|
+
"(p)lay again or (q)uit?"
|
77
|
+
end
|
78
|
+
end
|
data/lib/table.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'terminal-table'
|
2
|
+
|
3
|
+
class Table
|
4
|
+
attr_reader :table,
|
5
|
+
:rows
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@rows = []
|
9
|
+
@rows << ['Answer', '????', 'XX','XX']
|
10
|
+
@table = create_table
|
11
|
+
table_style
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
def table_style
|
16
|
+
table.style = {:width => 40, :padding_left => 3, :border_x => "=", :border_i => "X"}
|
17
|
+
end
|
18
|
+
|
19
|
+
def show
|
20
|
+
table
|
21
|
+
end
|
22
|
+
|
23
|
+
def hidden_answer(answer)
|
24
|
+
@rows[0] = ['Answer', answer.join(''), 'XX','XX']
|
25
|
+
end
|
26
|
+
|
27
|
+
def update(guess_number, guess,number_correct, position, answer)
|
28
|
+
if guess_number < 10
|
29
|
+
@rows << [guess_number, guess, number_correct ,position]
|
30
|
+
else
|
31
|
+
hidden_answer(answer)
|
32
|
+
end
|
33
|
+
@table = create_table
|
34
|
+
table_style
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_table
|
38
|
+
Terminal::Table.new :headings => ['Round', 'G', 'C', 'P'],
|
39
|
+
:rows => rows
|
40
|
+
end
|
41
|
+
end
|
data/lib/validate.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# determine how many colors correct
|
2
|
+
# determine how many positions correct
|
3
|
+
# verify user guess with answer array
|
4
|
+
# track number of guesses - guess 1, guess 2, etc. && "you have X number of guess left"
|
5
|
+
require_relative '../lib/colors'
|
6
|
+
|
7
|
+
|
8
|
+
class Validate
|
9
|
+
attr_reader :answer,
|
10
|
+
:guess
|
11
|
+
|
12
|
+
def initialize(answer)
|
13
|
+
@answer = answer
|
14
|
+
end
|
15
|
+
|
16
|
+
def position_check(guess)
|
17
|
+
difference = 0
|
18
|
+
4.times do |index|
|
19
|
+
difference += 1 if guess[index] == @answer[index]
|
20
|
+
end
|
21
|
+
difference
|
22
|
+
end
|
23
|
+
|
24
|
+
def number_correct(guess)
|
25
|
+
number_correct = 0
|
26
|
+
new_answer = @answer
|
27
|
+
new_answer.each do |letter|
|
28
|
+
if guess.include?(letter)
|
29
|
+
guess.delete_at(guess.index(letter))
|
30
|
+
number_correct += 1
|
31
|
+
end
|
32
|
+
end
|
33
|
+
number_correct
|
34
|
+
end
|
35
|
+
|
36
|
+
def correct?(user_guess)
|
37
|
+
user_guess == @answer
|
38
|
+
end
|
39
|
+
|
40
|
+
def letters?(guess)
|
41
|
+
valid_letters = ['r', 'g', 'b', 'y']
|
42
|
+
guess.chars.all? { |letter| valid_letters.include?(letter) }
|
43
|
+
end
|
44
|
+
|
45
|
+
def size?(guess)
|
46
|
+
guess.length == 4
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'mastermind-scott'
|
3
|
+
s.version = '1.0.0'
|
4
|
+
s.date = '2014-11-12'
|
5
|
+
s.summary = "Try to guess the secret code."
|
6
|
+
s.description = "The Mastermind Game"
|
7
|
+
s.authors = ["Scott Crawford"]
|
8
|
+
s.email = 'scottcrawford03@gmail.com'
|
9
|
+
s.files = %w[mastermind-scott.gemspec
|
10
|
+
mastermind.rb
|
11
|
+
lib/cli.rb
|
12
|
+
lib/colors.rb
|
13
|
+
lib/game_prompts.rb
|
14
|
+
lib/table.rb
|
15
|
+
lib/validate.rb
|
16
|
+
lib/game.rb ]
|
17
|
+
s.homepage = 'http://rubygems.org/gems/mastermind-scott'
|
18
|
+
s.license = 'SMC'
|
19
|
+
s.executables << 'mastermind-scott'
|
20
|
+
end
|
data/mastermind.rb
ADDED
metadata
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mastermind-scott
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Scott Crawford
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-11-12 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: The Mastermind Game
|
14
|
+
email: scottcrawford03@gmail.com
|
15
|
+
executables:
|
16
|
+
- mastermind-scott
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- bin/mastermind-scott
|
21
|
+
- lib/cli.rb
|
22
|
+
- lib/colors.rb
|
23
|
+
- lib/game.rb
|
24
|
+
- lib/game_prompts.rb
|
25
|
+
- lib/table.rb
|
26
|
+
- lib/validate.rb
|
27
|
+
- mastermind-scott.gemspec
|
28
|
+
- mastermind.rb
|
29
|
+
homepage: http://rubygems.org/gems/mastermind-scott
|
30
|
+
licenses:
|
31
|
+
- SMC
|
32
|
+
metadata: {}
|
33
|
+
post_install_message:
|
34
|
+
rdoc_options: []
|
35
|
+
require_paths:
|
36
|
+
- lib
|
37
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
requirements: []
|
48
|
+
rubyforge_project:
|
49
|
+
rubygems_version: 2.4.3
|
50
|
+
signing_key:
|
51
|
+
specification_version: 4
|
52
|
+
summary: Try to guess the secret code.
|
53
|
+
test_files: []
|