codebreaker_rg_game 1.2 → 1.3
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.
- checksums.yaml +4 -4
- data/.circleci/config.yml +18 -0
- data/.rubocop.yml +31 -0
- data/Gemfile.lock +4 -5
- data/codebreaker.gemspec +2 -3
- data/lib/codebreaker/version.rb +2 -2
- data/lib/codebreaker.rb +98 -1
- data/lib/dependency.rb +1 -1
- metadata +18 -3
- data/lib/codebreaker/codebreaker.rb +0 -102
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef959a0b8e4847a0239543461b671027b6331d07fdb2b5c0c56b228aa021b366
|
4
|
+
data.tar.gz: 9b4019595a92017f3ad551b6de60be1f473d87da49070943bacecf93ebe45f23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96518015a33d98a024316557461a67575fb4a5a3cf234b1b2ef65ff02ef70fe433edfc74f79cd5237720e43fb890616b80083a55814d8d808175b8277308bef3
|
7
|
+
data.tar.gz: c7029a685f536a261add46b7221b5275780adb523a63d761c05b0911d0fbf0df7c6957ae09d299e2b17ca07feffb1707e092bad827924f7e910129e4c9abd0dc
|
@@ -0,0 +1,18 @@
|
|
1
|
+
version: 2
|
2
|
+
jobs:
|
3
|
+
test:
|
4
|
+
docker:
|
5
|
+
- image: circleci/ruby:2.5.5
|
6
|
+
steps:
|
7
|
+
- checkout
|
8
|
+
- run: |
|
9
|
+
gem install bundler
|
10
|
+
bundle check || bundle install
|
11
|
+
bundle exec rubocop
|
12
|
+
bundle exec fasterer
|
13
|
+
bundle exec rspec
|
14
|
+
workflows:
|
15
|
+
version: 2
|
16
|
+
test:
|
17
|
+
jobs:
|
18
|
+
- test
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require: rubocop-rspec
|
2
|
+
|
3
|
+
RSpec/MessageChain:
|
4
|
+
Enabled: false
|
5
|
+
|
6
|
+
RSpec/NestedGroups:
|
7
|
+
Max: 5
|
8
|
+
|
9
|
+
RSpec/MultipleExpectations:
|
10
|
+
Max: 5
|
11
|
+
|
12
|
+
RSpec/ExampleLength:
|
13
|
+
Max: 10
|
14
|
+
|
15
|
+
RSpec/MessageSpies:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
Metrics/BlockLength:
|
19
|
+
Exclude:
|
20
|
+
- 'Gemfile'
|
21
|
+
- 'spec/**/*.rb'
|
22
|
+
- 'codebreaker.gemspec'
|
23
|
+
|
24
|
+
Metrics/LineLength:
|
25
|
+
Max: 120
|
26
|
+
|
27
|
+
Documentation:
|
28
|
+
Enabled: false
|
29
|
+
|
30
|
+
FrozenStringLiteralComment:
|
31
|
+
Enabled: false
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
codebreaker_rg_game (1.
|
4
|
+
codebreaker_rg_game (1.3)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
@@ -9,14 +9,11 @@ GEM
|
|
9
9
|
ast (2.4.0)
|
10
10
|
coderay (1.1.2)
|
11
11
|
colorize (0.8.1)
|
12
|
-
concurrent-ruby (1.1.5)
|
13
12
|
diff-lcs (1.3)
|
14
13
|
docile (1.3.2)
|
15
14
|
fasterer (0.5.1)
|
16
15
|
colorize (~> 0.7)
|
17
16
|
ruby_parser (>= 3.13.0)
|
18
|
-
i18n (1.6.0)
|
19
|
-
concurrent-ruby (~> 1.0)
|
20
17
|
jaro_winkler (1.5.3)
|
21
18
|
json (2.2.0)
|
22
19
|
method_source (0.9.2)
|
@@ -48,6 +45,8 @@ GEM
|
|
48
45
|
rainbow (>= 2.2.2, < 4.0)
|
49
46
|
ruby-progressbar (~> 1.7)
|
50
47
|
unicode-display_width (>= 1.4.0, < 1.7)
|
48
|
+
rubocop-rspec (1.35.0)
|
49
|
+
rubocop (>= 0.60.0)
|
51
50
|
ruby-progressbar (1.10.1)
|
52
51
|
ruby_parser (3.13.1)
|
53
52
|
sexp_processor (~> 4.9)
|
@@ -66,11 +65,11 @@ DEPENDENCIES
|
|
66
65
|
bundler (~> 2.0)
|
67
66
|
codebreaker_rg_game!
|
68
67
|
fasterer (~> 0.5.1)
|
69
|
-
i18n (~> 1.6)
|
70
68
|
pry (~> 0.12.2)
|
71
69
|
rake (~> 10.0)
|
72
70
|
rspec (~> 3.8)
|
73
71
|
rubocop (~> 0.69.0)
|
72
|
+
rubocop-rspec (~> 1.33)
|
74
73
|
simplecov (~> 0.16.1)
|
75
74
|
|
76
75
|
BUNDLED WITH
|
data/codebreaker.gemspec
CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
11
11
|
spec.email = ['zahoruiko.yaroslav@gmail.com']
|
12
12
|
|
13
13
|
spec.summary = 'Codebreaker'
|
14
|
-
spec.description = '
|
14
|
+
spec.description = 'codebreaker'
|
15
15
|
spec.homepage = 'https://github.com/YaroslavZahoruiko/codebreaker-gem'
|
16
16
|
spec.license = 'MIT'
|
17
17
|
|
@@ -21,8 +21,6 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.metadata['source_code_uri'] = 'https://github.com/YaroslavZahoruiko/codebreaker-gem'
|
22
22
|
spec.metadata['changelog_uri'] = 'https://github.com/YaroslavZahoruiko/codebreaker-gem/tree/devCHANGELOG.md'
|
23
23
|
|
24
|
-
# Specify which files should be added to the gem when it is released.
|
25
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
26
24
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
27
25
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
28
26
|
end
|
@@ -36,5 +34,6 @@ Gem::Specification.new do |spec|
|
|
36
34
|
spec.add_development_dependency 'rake', '~> 10.0'
|
37
35
|
spec.add_development_dependency 'rspec', '~> 3.8'
|
38
36
|
spec.add_development_dependency 'rubocop', '~> 0.69.0'
|
37
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 1.33'
|
39
38
|
spec.add_development_dependency 'simplecov', '~> 0.16.1'
|
40
39
|
end
|
data/lib/codebreaker/version.rb
CHANGED
data/lib/codebreaker.rb
CHANGED
@@ -4,5 +4,102 @@ require 'codebreaker/version'
|
|
4
4
|
require_relative 'dependency'
|
5
5
|
|
6
6
|
module Codebreaker
|
7
|
-
class
|
7
|
+
class Game
|
8
|
+
STATE = {
|
9
|
+
continue: 'continue',
|
10
|
+
win: 'win',
|
11
|
+
lose: 'lose'
|
12
|
+
}.freeze
|
13
|
+
VALID_NUMBERS = (1..6).freeze
|
14
|
+
LENGTH_CODE = 4
|
15
|
+
CORRECT_SYMBOL = '+'
|
16
|
+
INCORRECT_SYMBOL = '-'
|
17
|
+
attr_reader :hints, :attempts, :state, :number
|
18
|
+
def initialize(player, difficulties)
|
19
|
+
@player = player
|
20
|
+
@difficulties = difficulties
|
21
|
+
@attempts = @difficulties.attempts
|
22
|
+
@hints = @difficulties.hints
|
23
|
+
@number = generator_secret_code
|
24
|
+
@available_hints = @number.clone
|
25
|
+
@state = STATE[:continue]
|
26
|
+
end
|
27
|
+
|
28
|
+
def hint
|
29
|
+
@hints -= 1
|
30
|
+
@available_hints.delete_at(rand(@available_hints.size))
|
31
|
+
end
|
32
|
+
|
33
|
+
def check_code(code)
|
34
|
+
return nil unless valid_code?(code)
|
35
|
+
|
36
|
+
@attempts -= 1
|
37
|
+
temp_code = code.chars
|
38
|
+
guess_number = Array.new(LENGTH_CODE) { 0 }
|
39
|
+
calc_and_mark_correct(temp_code, guess_number) + calc_and_mark_incorrect(temp_code, guess_number)
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_h
|
43
|
+
{
|
44
|
+
player: @player.name,
|
45
|
+
difficulties: @difficulties.level,
|
46
|
+
attempts_total: @difficulties.attempts,
|
47
|
+
hints_total: @difficulties.hints,
|
48
|
+
attempts_used: @difficulties.attempts - @attempts,
|
49
|
+
hints_used: @difficulties.hints - @hints,
|
50
|
+
state: @state
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
def win?(code)
|
55
|
+
return false unless code == @number.join
|
56
|
+
|
57
|
+
@state = STATE[:win]
|
58
|
+
true
|
59
|
+
end
|
60
|
+
|
61
|
+
def hints?
|
62
|
+
!@hints.zero?
|
63
|
+
end
|
64
|
+
|
65
|
+
def lose?
|
66
|
+
return false unless @attempts.zero?
|
67
|
+
|
68
|
+
@state = STATE[:lose]
|
69
|
+
true
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def calc_and_mark_correct(code, used)
|
75
|
+
result = ''
|
76
|
+
code.each_index do |index|
|
77
|
+
next unless number[index] == code[index]
|
78
|
+
|
79
|
+
result += CORRECT_SYMBOL
|
80
|
+
code[index], used[index] = nil
|
81
|
+
end
|
82
|
+
result
|
83
|
+
end
|
84
|
+
|
85
|
+
def calc_and_mark_incorrect(code, used)
|
86
|
+
result = ''
|
87
|
+
number.each_index do |number_index|
|
88
|
+
code_index = code.index(number[number_index])
|
89
|
+
next if code_index.nil? || used[number_index].nil?
|
90
|
+
|
91
|
+
result += INCORRECT_SYMBOL
|
92
|
+
code[code_index], used[number_index] = nil
|
93
|
+
end
|
94
|
+
result
|
95
|
+
end
|
96
|
+
|
97
|
+
def generator_secret_code
|
98
|
+
Array.new(4) { rand(VALID_NUMBERS).to_s }
|
99
|
+
end
|
100
|
+
|
101
|
+
def valid_code?(code)
|
102
|
+
Verifier.verify_valid_code(code)
|
103
|
+
end
|
104
|
+
end
|
8
105
|
end
|
data/lib/dependency.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: codebreaker_rg_game
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.3'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yaroslav Zahoruiko
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: 0.69.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop-rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.33'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.33'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: simplecov
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,13 +122,15 @@ dependencies:
|
|
108
122
|
- - "~>"
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: 0.16.1
|
111
|
-
description:
|
125
|
+
description: codebreaker
|
112
126
|
email:
|
113
127
|
- zahoruiko.yaroslav@gmail.com
|
114
128
|
executables: []
|
115
129
|
extensions: []
|
116
130
|
extra_rdoc_files: []
|
117
131
|
files:
|
132
|
+
- ".circleci/config.yml"
|
133
|
+
- ".rubocop.yml"
|
118
134
|
- CHANGELOG.mb
|
119
135
|
- CODE_OF_CONDUCT.md
|
120
136
|
- Gemfile
|
@@ -126,7 +142,6 @@ files:
|
|
126
142
|
- bin/setup
|
127
143
|
- codebreaker.gemspec
|
128
144
|
- lib/codebreaker.rb
|
129
|
-
- lib/codebreaker/codebreaker.rb
|
130
145
|
- lib/codebreaker/entities/difficulties.rb
|
131
146
|
- lib/codebreaker/entities/player.rb
|
132
147
|
- lib/codebreaker/utils/verifier.rb
|
@@ -1,102 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Codebreaker
|
4
|
-
class Game
|
5
|
-
STATE = {
|
6
|
-
continue: 'continue',
|
7
|
-
win: 'win',
|
8
|
-
lose: 'lose'
|
9
|
-
}.freeze
|
10
|
-
VALID_NUMBERS = (1..6).freeze
|
11
|
-
LENGTH_CODE = 4
|
12
|
-
CORRECT_SYMBOL = '+'
|
13
|
-
INCORRECT_SYMBOL = '-'
|
14
|
-
attr_reader :hints, :attempts, :state, :number
|
15
|
-
def initialize(player, difficulties)
|
16
|
-
@player = player
|
17
|
-
@difficulties = difficulties
|
18
|
-
@attempts = @difficulties.attempts
|
19
|
-
@hints = @difficulties.hints
|
20
|
-
@number = generator_secret_code
|
21
|
-
@available_hints = @number.clone
|
22
|
-
@state = STATE[:continue]
|
23
|
-
end
|
24
|
-
|
25
|
-
def hint
|
26
|
-
@hints -= 1
|
27
|
-
@available_hints.delete_at(rand(@available_hints.size))
|
28
|
-
end
|
29
|
-
|
30
|
-
def check_code(code)
|
31
|
-
return nil unless valid_code?(code)
|
32
|
-
|
33
|
-
@attempts -= 1
|
34
|
-
temp_code = code.chars
|
35
|
-
guess_number = Array.new(LENGTH_CODE) { 0 }
|
36
|
-
calc_and_mark_correct(temp_code, guess_number) + calc_and_mark_incorrect(temp_code, guess_number)
|
37
|
-
end
|
38
|
-
|
39
|
-
def to_h
|
40
|
-
{
|
41
|
-
player: @player.name,
|
42
|
-
difficulties: @difficulties.level,
|
43
|
-
attempts_total: @difficulties.attempts,
|
44
|
-
hints_total: @difficulties.hints,
|
45
|
-
attempts_used: @difficulties.attempts - @attempts,
|
46
|
-
hints_used: @difficulties.hints - @hints,
|
47
|
-
state: @state
|
48
|
-
}
|
49
|
-
end
|
50
|
-
|
51
|
-
def win?(code)
|
52
|
-
return false unless code == @number.join
|
53
|
-
|
54
|
-
@state = STATE[:win]
|
55
|
-
true
|
56
|
-
end
|
57
|
-
|
58
|
-
def hints?
|
59
|
-
!@hints.zero?
|
60
|
-
end
|
61
|
-
|
62
|
-
def lose?
|
63
|
-
return false unless @attempts.zero?
|
64
|
-
|
65
|
-
@state = STATE[:lose]
|
66
|
-
true
|
67
|
-
end
|
68
|
-
|
69
|
-
private
|
70
|
-
|
71
|
-
def calc_and_mark_correct(code, used)
|
72
|
-
result = ''
|
73
|
-
code.each_index do |index|
|
74
|
-
next unless number[index] == code[index]
|
75
|
-
|
76
|
-
result += CORRECT_SYMBOL
|
77
|
-
code[index], used[index] = nil
|
78
|
-
end
|
79
|
-
result
|
80
|
-
end
|
81
|
-
|
82
|
-
def calc_and_mark_incorrect(code, used)
|
83
|
-
result = ''
|
84
|
-
number.each_index do |number_index|
|
85
|
-
code_index = code.index(number[number_index])
|
86
|
-
next if code_index.nil? || used[number_index].nil?
|
87
|
-
|
88
|
-
result += INCORRECT_SYMBOL
|
89
|
-
code[code_index], used[number_index] = nil
|
90
|
-
end
|
91
|
-
result
|
92
|
-
end
|
93
|
-
|
94
|
-
def generator_secret_code
|
95
|
-
Array.new(4) { rand(VALID_NUMBERS).to_s }
|
96
|
-
end
|
97
|
-
|
98
|
-
def valid_code?(code)
|
99
|
-
Verifier.verify_valid_code(code)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|