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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7abda3870f0cd213a68d6e2ca1c0f438ec6c0e574dfac2971220ffed81fa792f
4
- data.tar.gz: bfa7b539d33a4c3568c710062cbe281788b1a5de19c21e86026a6f05aa3f597f
3
+ metadata.gz: ef959a0b8e4847a0239543461b671027b6331d07fdb2b5c0c56b228aa021b366
4
+ data.tar.gz: 9b4019595a92017f3ad551b6de60be1f473d87da49070943bacecf93ebe45f23
5
5
  SHA512:
6
- metadata.gz: 225e4530897b8eec606febd43f6a277aed07724168dddc327ab0ceb8f03e2157d50c2db596e931d7fb10812575733b1483356c08086ab5a4333faebfad795f10
7
- data.tar.gz: 2a734ff1671f4d3ffb45f28a08169b8c5426027c21e1cdae9fb27600da08df2b2ef50e61feb3606146635f7e8e7cfb90995f288bbbe9a2e108102b4c2f397b79
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.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 = 'game'
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Codebreaker
4
- VERSION = '1.2'
5
- end
4
+ VERSION = '1.3'
5
+ end
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 Error < StandardError; end
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
@@ -3,5 +3,5 @@
3
3
  require 'pry'
4
4
  require_relative 'codebreaker/utils/verifier'
5
5
  require_relative 'codebreaker/entities/player'
6
- require_relative 'codebreaker/codebreaker'
6
+ require_relative 'codebreaker'
7
7
  require_relative 'codebreaker/entities/difficulties'
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.2'
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: game
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