GemCodebreaker 0.1.5 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +4 -6
  3. data/.fasterer.yml +2 -0
  4. data/.rubocop.yml +10 -3
  5. data/Gemfile.lock +5 -2
  6. data/bin/{console.rb → console} +3 -3
  7. data/{GemCodebreaker.gemspec → gem_codebreaker.gemspec} +3 -2
  8. data/lib/{GemCodebreaker/classes/codemaker.rb → gem_codebreaker/classes/code_maker.rb} +1 -2
  9. data/lib/gem_codebreaker/classes/game.rb +67 -0
  10. data/lib/gem_codebreaker/classes/game_config.rb +65 -0
  11. data/lib/{GemCodebreaker → gem_codebreaker}/classes/game_statistic.rb +2 -3
  12. data/lib/gem_codebreaker/classes/serializer_deserializer.rb +27 -0
  13. data/lib/{GemCodebreaker → gem_codebreaker}/classes/user.rb +3 -4
  14. data/lib/{GemCodebreaker → gem_codebreaker}/config/i18n_locales.rb +0 -0
  15. data/lib/{GemCodebreaker → gem_codebreaker}/errors/incorrect_length_error.rb +0 -0
  16. data/lib/{GemCodebreaker → gem_codebreaker}/errors/name_length_error.rb +0 -0
  17. data/lib/{GemCodebreaker → gem_codebreaker}/errors/no_attempts_error.rb +0 -0
  18. data/lib/{GemCodebreaker → gem_codebreaker}/errors/no_hints_error.rb +0 -0
  19. data/lib/{GemCodebreaker → gem_codebreaker}/errors/unknow_level_error.rb +0 -0
  20. data/lib/{GemCodebreaker → gem_codebreaker}/errors/value_range_error.rb +0 -0
  21. data/lib/{GemCodebreaker → gem_codebreaker}/errors/wrong_class_error.rb +0 -0
  22. data/lib/gem_codebreaker/gem_codebreaker.rb +18 -0
  23. data/lib/gem_codebreaker/modules/validator.rb +17 -0
  24. data/lib/{GemCodebreaker → gem_codebreaker}/version.rb +1 -1
  25. metadata +36 -23
  26. data/lib/GemCodebreaker/classes/game.rb +0 -85
  27. data/lib/GemCodebreaker/classes/game_config.rb +0 -19
  28. data/lib/GemCodebreaker/gem_codebreaker.rb +0 -24
  29. data/lib/GemCodebreaker/modules/game_configurations.rb +0 -18
  30. data/lib/GemCodebreaker/modules/serializer_deserializer.rb +0 -26
  31. data/lib/GemCodebreaker/modules/validator.rb +0 -35
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2f0aed222de26843d9e2628824cacab6d5828f5877023d53407c24147548954e
4
- data.tar.gz: 3027c48c3a319170f1ffd3790e55c3284b755cb19aebf6b72a07300282aa640a
3
+ metadata.gz: 12131d83b585528d4439fce06930e09a875e97670771f8af7431a8435f92abb3
4
+ data.tar.gz: 263297083f7e135928c7abaf7d6daefab5928b865269076634d8499d27cdfe50
5
5
  SHA512:
6
- metadata.gz: 4cb6ad1dae12a142330cae104a3cf06bb1413c64c07529d6fcf9930478f8c80e1aba3eadbfa517eca5dea4de44036288a16c329f79798ffd7d19278571038e62
7
- data.tar.gz: ca115498fb153ae9b884de1f61b24e2d64ef2557fbcc62124145ea7e594a0d9203aaa282846b55f4f0fc2474d3f4a3a3a6df0f1baf5506b26b99aa8f3deef87b
6
+ metadata.gz: 05eb5e3cdc70ef977f3e92da9ff638bbd4e2a07a8a11fc78c74c178191c8069d9e31f99375a38e31db3a8d0f1d70c785496cd0f3eb6541494d795a034bb083fd
7
+ data.tar.gz: eca18f4f867615dd5d0841c223c10b79cfe88b844ffeeaf29bc6d098ac96f77144210a5674d152332607151815b2c8e02fe48f72bbe7db33388efb6fb4eac677
@@ -30,17 +30,15 @@ commands:
30
30
  - run:
31
31
  name: rubocop
32
32
  command: bundle exec rubocop
33
+ - run:
34
+ name: fasterer
35
+ command: bundle exec fasterer
33
36
  run_specs:
34
37
  description: Run specs
35
38
  steps:
36
39
  - run:
37
40
  name: run spec
38
- command: |
39
- mkdir /tmp/test-results
40
- TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"
41
- bundle exec rspec --format progress \
42
- --out /tmp/test-results/rspec.xml \
43
- $TEST_FILES
41
+ command: bundle exec rspec --format progress spec
44
42
 
45
43
  jobs:
46
44
  lintering:
@@ -17,3 +17,5 @@ speedups:
17
17
  select_last_vs_reverse_detect: true
18
18
  getter_vs_attr_reader: true
19
19
  setter_vs_attr_writer: true
20
+ exclude_paths:
21
+ - 'vendor/**/*.rb'
@@ -1,15 +1,22 @@
1
1
  require:
2
+ - rubocop-performance
2
3
  - rubocop-rspec
3
4
 
4
5
  AllCops:
5
6
  TargetRubyVersion: 2.7.1
6
7
  NewCops: enable
7
8
 
9
+ Style/Documentation:
10
+ Enabled: false
11
+
8
12
  Layout/LineLength:
9
13
  Max: 120
10
- Metrics/ModuleLength:
11
- Max: 270
14
+
12
15
  RSpec/MessageSpies:
13
16
  EnforcedStyle: receive
17
+
18
+ RSpec/NestedGroups:
19
+ Max: 6
20
+
14
21
  Metrics/BlockLength:
15
- ExcludedMethods: ['describe', 'context']
22
+ ExcludedMethods: ['describe', 'context']
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- GemCodebreaker (0.1.5)
4
+ GemCodebreaker (0.1.9)
5
+ i18n (~> 1.8.3)
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
@@ -45,6 +46,8 @@ GEM
45
46
  unicode-display_width (>= 1.4.0, < 2.0)
46
47
  rubocop-ast (0.0.3)
47
48
  parser (>= 2.7.0.1)
49
+ rubocop-performance (1.6.1)
50
+ rubocop (>= 0.71.0)
48
51
  rubocop-rspec (1.41.0)
49
52
  rubocop (>= 0.68.1)
50
53
  ruby-progressbar (1.10.1)
@@ -63,10 +66,10 @@ PLATFORMS
63
66
  DEPENDENCIES
64
67
  GemCodebreaker!
65
68
  fasterer (~> 0.8.3)
66
- i18n (~> 1.8.3)
67
69
  rake (~> 13.0.1)
68
70
  rspec (~> 3.7.0)
69
71
  rubocop (~> 0.84.0)
72
+ rubocop-performance (~> 1.6.1)
70
73
  rubocop-rspec (~> 1.41.0)
71
74
  simplecov (~> 0.18.5)
72
75
 
@@ -1,9 +1,9 @@
1
- # frozen_string_literal: true
1
+ #!/usr/bin/env ruby
2
2
 
3
- # !/usr/bin/env ruby
3
+ # frozen_string_literal: true
4
4
 
5
5
  require 'bundler/setup'
6
- require 'GemCodebreaker'
6
+ require 'GemCodebreaker/gem_codebreaker'
7
7
 
8
8
  # You can add fixtures and/or initialization code here to make experimenting
9
9
  # with your gem easier. You can also use a different console, if you like.
@@ -2,7 +2,7 @@
2
2
 
3
3
  lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require_relative 'lib/GemCodebreaker/version'
5
+ require_relative 'lib/gem_codebreaker/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = 'GemCodebreaker'
@@ -28,10 +28,11 @@ Gem::Specification.new do |spec|
28
28
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
29
  spec.require_paths = ['lib']
30
30
  spec.add_development_dependency 'fasterer', '~> 0.8.3'
31
- spec.add_development_dependency 'i18n', '~> 1.8.3'
31
+ spec.add_dependency 'i18n', '~> 1.8.3'
32
32
  spec.add_development_dependency 'rake', '~> 13.0.1'
33
33
  spec.add_development_dependency 'rspec', '~> 3.7.0'
34
34
  spec.add_development_dependency 'rubocop', '~> 0.84.0'
35
+ spec.add_development_dependency 'rubocop-performance', '~> 1.6.1'
35
36
  spec.add_development_dependency 'rubocop-rspec', '~> 1.41.0'
36
37
  spec.add_development_dependency 'simplecov', '~> 0.18.5'
37
38
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GemCodebreaker
4
- # Marker class for game
5
4
  class CodeMaker
6
5
  attr_reader :plus_match, :minus_match, :empty_match
7
6
 
@@ -32,7 +31,7 @@ module GemCodebreaker
32
31
  @game_code.each do |secret_code_item|
33
32
  if @user_code.include?(secret_code_item)
34
33
  @minus_match += 1
35
- @user_code.delete(secret_code_item)
34
+ @user_code.delete_at(@user_code.index(secret_code_item))
36
35
  else
37
36
  @empty_match += 1
38
37
  end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GemCodebreaker
4
+ class Game
5
+ LENGTH_OF_SECRET_CODE = 4
6
+ DIGIT_RANGE = (1..6).freeze
7
+
8
+ include Validator
9
+ attr_reader :statistic, :matcher_hash, :config
10
+
11
+ def initialize(user, level)
12
+ @config = GameConfig.new(user, level)
13
+ @statistic = []
14
+ end
15
+
16
+ def secrete_code
17
+ @secrete_code ||= (1..LENGTH_OF_SECRET_CODE).map { rand DIGIT_RANGE }
18
+ end
19
+
20
+ def guess_start(input_code)
21
+ guess_valid?(input_code)
22
+ raise GemCodebreaker::NoAttemptsError if @config.attempts_used?
23
+
24
+ @config.increase_user_attempts
25
+ user_code = input_code.chars.map(&:to_i)
26
+ code_marker = CodeMaker.new(@secrete_code, user_code)
27
+ code_marker.calculate_result_code
28
+ @matcher_hash = { plus: code_marker.plus_match, minus: code_marker.minus_match, empty: code_marker.empty_match }
29
+ end
30
+
31
+ def win_game?
32
+ @matcher_hash[:plus] == LENGTH_OF_SECRET_CODE
33
+ end
34
+
35
+ def game_over?
36
+ @config.attempts_used? && win_game? == false
37
+ end
38
+
39
+ def hint
40
+ raise GemCodebreaker::NoHintsError if @config.hints_used?
41
+
42
+ @config.increase_user_hints
43
+ @secrete_code.sample
44
+ end
45
+
46
+ def restart_game
47
+ @config.reset_user_attempts_hints
48
+ secrete_code
49
+ end
50
+
51
+ def save_user_statistic
52
+ @statistic << GameStatistic.new(self)
53
+ end
54
+
55
+ private
56
+
57
+ def guess_valid?(user_code)
58
+ validate_class(user_code, String)
59
+ raise GemCodebreaker::IncorrectLengthError if user_code.length != LENGTH_OF_SECRET_CODE
60
+ unless user_code[/\A[#{DIGIT_RANGE.first}-#{DIGIT_RANGE.last}]{#{LENGTH_OF_SECRET_CODE}}\z/]
61
+ raise GemCodebreaker::ValueRangeError
62
+ end
63
+
64
+ true
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GemCodebreaker
4
+ class GameConfig
5
+ GAME_LEVEL = {
6
+ easy: {
7
+ attempts: 15,
8
+ hints: 2
9
+ },
10
+ medium: {
11
+ attempts: 10,
12
+ hints: 1
13
+ },
14
+ hell: {
15
+ attempts: 5,
16
+ hints: 1
17
+ },
18
+ strong_hell: {
19
+ attempts: 1,
20
+ hints: 0
21
+ }
22
+ }.freeze
23
+
24
+ include Validator
25
+
26
+ attr_reader :user_nick_name, :difficulty, :max_attempts, :max_hints, :user_attempts, :user_hints
27
+
28
+ def initialize(user, level)
29
+ check_difficulty(level)
30
+ @user_nick_name = user.nick_name
31
+ @difficulty = level
32
+ @max_attempts = GAME_LEVEL[level][:attempts]
33
+ @max_hints = GAME_LEVEL[level][:hints]
34
+ @user_attempts = 0
35
+ @user_hints = 0
36
+ end
37
+
38
+ def increase_user_attempts
39
+ @user_attempts += 1
40
+ end
41
+
42
+ def increase_user_hints
43
+ @user_hints += 1
44
+ end
45
+
46
+ def attempts_used?
47
+ @user_attempts >= @max_attempts
48
+ end
49
+
50
+ def hints_used?
51
+ @user_hints >= @max_hints
52
+ end
53
+
54
+ def reset_user_attempts_hints
55
+ @user_attempts = 0
56
+ @user_hints = 0
57
+ end
58
+
59
+ private
60
+
61
+ def check_difficulty(difficulty)
62
+ validate_inclusion(GAME_LEVEL.keys, difficulty)
63
+ end
64
+ end
65
+ end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GemCodebreaker
4
- # Game statistic class
5
4
  class GameStatistic
6
5
  attr_reader :user_nickname, :difficulty, :attempts_total, :attempts_used, :hints_total, :hints_used
7
6
 
@@ -9,9 +8,9 @@ module GemCodebreaker
9
8
  @user_nickname = game.config.user_nick_name
10
9
  @difficulty = game.config.difficulty
11
10
  @attempts_total = game.config.max_attempts
12
- @attempts_used = game.attempts
11
+ @attempts_used = game.config.user_attempts
13
12
  @hints_total = game.config.max_hints
14
- @hints_used = game.hints
13
+ @hints_used = game.config.user_hints
15
14
  end
16
15
  end
17
16
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GemCodebreaker
4
+ class SerializerDeserializer
5
+ def initialize
6
+ @file_name = 'game_statistic.yml'
7
+ @statistic_dir = 'data'
8
+ @storage_path = File.expand_path("./#{@statistic_dir}/#{@file_name}")
9
+ end
10
+
11
+ def data_dir_get
12
+ data_directory = File.dirname(@storage_path)
13
+ Dir.mkdir(data_directory) unless File.directory?(data_directory)
14
+ end
15
+
16
+ def load_game_statistic
17
+ File.exist?(@storage_path) ? YAML.load_file(@storage_path) : []
18
+ end
19
+
20
+ def save_game_statistic(game_statistic)
21
+ save_game_stat = game_statistic | load_game_statistic
22
+ File.open(@storage_path, 'w') do |file|
23
+ YAML.dump(save_game_stat, file)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,18 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GemCodebreaker
4
- # User class for game
5
4
  class User
6
5
  include Validator
7
- attr_accessor :nick_name
6
+ attr_reader :nick_name
8
7
 
9
8
  def initialize(nick_name)
10
9
  @nick_name = nick_name
11
10
  end
12
11
 
13
12
  def nickname_valid?
14
- validate_string(@nick_name)
15
- validate_nickname_length(@nick_name)
13
+ validate_class(@nick_name, String)
14
+ validate_length(@nick_name, (3..20))
16
15
  true
17
16
  end
18
17
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'gem_codebreaker/config/i18n_locales'
4
+ require 'gem_codebreaker/version'
5
+ require 'gem_codebreaker/errors/incorrect_length_error'
6
+ require 'gem_codebreaker/errors/name_length_error'
7
+ require 'gem_codebreaker/errors/no_attempts_error'
8
+ require 'gem_codebreaker/errors/no_hints_error'
9
+ require 'gem_codebreaker/errors/unknow_level_error'
10
+ require 'gem_codebreaker/errors/value_range_error'
11
+ require 'gem_codebreaker/errors/wrong_class_error'
12
+ require 'gem_codebreaker/modules/validator'
13
+ require 'gem_codebreaker/classes/serializer_deserializer'
14
+ require 'gem_codebreaker/classes/user'
15
+ require 'gem_codebreaker/classes/code_maker'
16
+ require 'gem_codebreaker/classes/game_config'
17
+ require 'gem_codebreaker/classes/game_statistic'
18
+ require 'gem_codebreaker/classes/game'
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GemCodebreaker
4
+ module Validator
5
+ def validate_inclusion(difficulty, game_level)
6
+ raise GemCodebreaker::UnknowLevelError unless difficulty.include?(game_level)
7
+ end
8
+
9
+ def validate_class(user_code, klass)
10
+ raise GemCodebreaker::WrongClassError unless user_code.is_a?(klass)
11
+ end
12
+
13
+ def validate_length(nickname, ranges)
14
+ raise GemCodebreaker::NameLengthError unless ranges.member?(nickname.length)
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GemCodebreaker
4
- VERSION = '0.1.5'
4
+ VERSION = '0.1.9'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: GemCodebreaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vasyl
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-10 00:00:00.000000000 Z
11
+ date: 2020-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fasterer
@@ -31,7 +31,7 @@ dependencies:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.8.3
34
- type: :development
34
+ type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.84.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-performance
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.6.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.6.1
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: rubocop-rspec
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -120,31 +134,30 @@ files:
120
134
  - ".gitignore"
121
135
  - ".rspec"
122
136
  - ".rubocop.yml"
123
- - GemCodebreaker.gemspec
124
137
  - Gemfile
125
138
  - Gemfile.lock
126
139
  - LICENSE.txt
127
140
  - README.md
128
- - bin/console.rb
141
+ - bin/console
129
142
  - bin/setup
130
- - lib/GemCodebreaker/classes/codemaker.rb
131
- - lib/GemCodebreaker/classes/game.rb
132
- - lib/GemCodebreaker/classes/game_config.rb
133
- - lib/GemCodebreaker/classes/game_statistic.rb
134
- - lib/GemCodebreaker/classes/user.rb
135
- - lib/GemCodebreaker/config/i18n_locales.rb
136
- - lib/GemCodebreaker/errors/incorrect_length_error.rb
137
- - lib/GemCodebreaker/errors/name_length_error.rb
138
- - lib/GemCodebreaker/errors/no_attempts_error.rb
139
- - lib/GemCodebreaker/errors/no_hints_error.rb
140
- - lib/GemCodebreaker/errors/unknow_level_error.rb
141
- - lib/GemCodebreaker/errors/value_range_error.rb
142
- - lib/GemCodebreaker/errors/wrong_class_error.rb
143
- - lib/GemCodebreaker/gem_codebreaker.rb
144
- - lib/GemCodebreaker/modules/game_configurations.rb
145
- - lib/GemCodebreaker/modules/serializer_deserializer.rb
146
- - lib/GemCodebreaker/modules/validator.rb
147
- - lib/GemCodebreaker/version.rb
143
+ - gem_codebreaker.gemspec
144
+ - lib/gem_codebreaker/classes/code_maker.rb
145
+ - lib/gem_codebreaker/classes/game.rb
146
+ - lib/gem_codebreaker/classes/game_config.rb
147
+ - lib/gem_codebreaker/classes/game_statistic.rb
148
+ - lib/gem_codebreaker/classes/serializer_deserializer.rb
149
+ - lib/gem_codebreaker/classes/user.rb
150
+ - lib/gem_codebreaker/config/i18n_locales.rb
151
+ - lib/gem_codebreaker/errors/incorrect_length_error.rb
152
+ - lib/gem_codebreaker/errors/name_length_error.rb
153
+ - lib/gem_codebreaker/errors/no_attempts_error.rb
154
+ - lib/gem_codebreaker/errors/no_hints_error.rb
155
+ - lib/gem_codebreaker/errors/unknow_level_error.rb
156
+ - lib/gem_codebreaker/errors/value_range_error.rb
157
+ - lib/gem_codebreaker/errors/wrong_class_error.rb
158
+ - lib/gem_codebreaker/gem_codebreaker.rb
159
+ - lib/gem_codebreaker/modules/validator.rb
160
+ - lib/gem_codebreaker/version.rb
148
161
  homepage: https://github.com/vasivaas/GemCodebreaker
149
162
  licenses:
150
163
  - MIT
@@ -1,85 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GemCodebreaker
4
- # Game class
5
- class Game
6
- LENGTH_OF_SECRET_CODE = (1..4).freeze
7
- DIGIT_RANGE = (1..6).freeze
8
-
9
- include GameConfigurations
10
- include Validator
11
- attr_reader :attempts, :hints, :secrete_code, :statistic, :matcher_hash
12
- attr_accessor :config
13
-
14
- def initialize(user, level)
15
- @config = GameConfig.new(user, level.to_sym)
16
- @attempts = @config.user_attempts
17
- @hints = @config.user_hints
18
- @statistic = []
19
- end
20
-
21
- def check_configuration
22
- validate_game_level(@config.difficulty)
23
- end
24
-
25
- def generate_secret_code
26
- @secrete_code = LENGTH_OF_SECRET_CODE.map { rand DIGIT_RANGE }
27
- end
28
-
29
- def guess_valid?(user_code)
30
- validate_string(user_code)
31
- validate_guess_length if user_code.length != LENGTH_OF_SECRET_CODE.to_a.length
32
- validate_chars_range unless user_code[/\A[1-6]{4}\z/]
33
- true
34
- end
35
-
36
- def guess_start(input_code)
37
- validate_number_of_attempts if @attempts >= @config.max_attempts
38
-
39
- @attempts += 1
40
- user_code = convert_string_to_array(input_code)
41
- code_marker = CodeMaker.new(@secrete_code, user_code)
42
- code_marker.calculate_result_code
43
- @matcher_hash = { plus: code_marker.plus_match, minus: code_marker.minus_match, empty: code_marker.empty_match }
44
- end
45
-
46
- def win_game?
47
- @matcher_hash[:plus] == LENGTH_OF_SECRET_CODE.to_a.last
48
- end
49
-
50
- def game_over?
51
- (@attempts >= @config.max_attempts) && win_game? == false
52
- end
53
-
54
- def hints_used?
55
- @hints >= @config.max_hints
56
- end
57
-
58
- def hint
59
- validate_number_of_hints if hints_used?
60
-
61
- @hints += 1
62
- @secrete_code.sample
63
- end
64
-
65
- def reset
66
- @attempts = 0
67
- @hints = 0
68
- generate_secret_code
69
- end
70
-
71
- def save_user_statistic
72
- @statistic << current_user_statistic
73
- end
74
-
75
- private
76
-
77
- def current_user_statistic
78
- GameStatistic.new(self)
79
- end
80
-
81
- def convert_string_to_array(user_code)
82
- user_code.chars.map(&:to_i)
83
- end
84
- end
85
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GemCodebreaker
4
- # Configuration class for game
5
- class GameConfig
6
- include GameConfigurations
7
- attr_reader :user_attempts, :user_hints
8
- attr_accessor :user_nick_name, :difficulty, :max_attempts, :max_hints
9
-
10
- def initialize(user, level)
11
- @user_nick_name = user.nick_name
12
- @difficulty = level
13
- @max_attempts = GAME_LEVEL[level][:attempts]
14
- @max_hints = GAME_LEVEL[level][:hints]
15
- @user_attempts = 0
16
- @user_hints = 0
17
- end
18
- end
19
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'GemCodebreaker/config/i18n_locales'
4
- require 'GemCodebreaker/version'
5
- require 'GemCodebreaker/errors/incorrect_length_error'
6
- require 'GemCodebreaker/errors/name_length_error'
7
- require 'GemCodebreaker/errors/no_attempts_error'
8
- require 'GemCodebreaker/errors/no_hints_error'
9
- require 'GemCodebreaker/errors/unknow_level_error'
10
- require 'GemCodebreaker/errors/value_range_error'
11
- require 'GemCodebreaker/errors/wrong_class_error'
12
- require 'GemCodebreaker/modules/validator'
13
- require 'GemCodebreaker/modules/serializer_deserializer'
14
- require 'GemCodebreaker/modules/game_configurations'
15
- require 'GemCodebreaker/classes/user'
16
- require 'GemCodebreaker/classes/codemaker'
17
- require 'GemCodebreaker/classes/game_config'
18
- require 'GemCodebreaker/classes/game_statistic'
19
- require 'GemCodebreaker/classes/game'
20
-
21
- module GemCodebreaker
22
- class Error < StandardError; end
23
- # Your code goes here...
24
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GemCodebreaker
4
- module GameConfigurations
5
- GAME_LEVEL = { easy:
6
- { attempts: 15,
7
- hints: 2 },
8
- medium:
9
- { attempts: 10,
10
- hints: 1 },
11
- hell:
12
- { attempts: 5,
13
- hints: 1 },
14
- strong_hell:
15
- { attempts: 1,
16
- hints: 0 } }.freeze
17
- end
18
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GemCodebreaker
4
- # Serialize and Deserialize data for game statistic
5
- module SerializerDeserializer
6
- FILE_NAME = 'game_statistic.yml'
7
- STATISTIC_DIR = 'data'
8
- STORAGE_PATH = File.expand_path("./#{STATISTIC_DIR}/#{FILE_NAME}")
9
-
10
- def data_dir_get
11
- data_directory = File.dirname(STORAGE_PATH)
12
- Dir.mkdir(data_directory) unless File.directory?(data_directory)
13
- end
14
-
15
- def load_game_statistic
16
- File.exist?(STORAGE_PATH) ? YAML.load_file(STORAGE_PATH) : []
17
- end
18
-
19
- def save_game_statistic(game_statistic)
20
- save_game_stat = game_statistic | load_game_statistic
21
- File.open(STORAGE_PATH, 'w') do |file|
22
- YAML.dump(save_game_stat, file)
23
- end
24
- end
25
- end
26
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GemCodebreaker
4
- # Validator
5
- module Validator
6
- def validate_game_level(game_level)
7
- level = %i[easy medium hell strong_hell]
8
- raise GemCodebreaker::UnknowLevelError unless level.include?(game_level)
9
- end
10
-
11
- def validate_number_of_hints
12
- raise GemCodebreaker::NoHintsError
13
- end
14
-
15
- def validate_number_of_attempts
16
- raise GemCodebreaker::NoAttemptsError
17
- end
18
-
19
- def validate_string(object)
20
- raise GemCodebreaker::WrongClassError unless object.is_a?(String)
21
- end
22
-
23
- def validate_guess_length
24
- raise GemCodebreaker::IncorrectLengthError
25
- end
26
-
27
- def validate_chars_range
28
- raise GemCodebreaker::ValueRangeError
29
- end
30
-
31
- def validate_nickname_length(nickname)
32
- raise GemCodebreaker::NameLengthError if nickname.length < 3 || nickname.length > 20
33
- end
34
- end
35
- end