alex_codebreaker 0.1.7 → 0.1.8
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/lib/alex_codebreaker.rb +1 -0
- data/lib/alex_codebreaker/comparison.rb +41 -0
- data/lib/alex_codebreaker/game.rb +10 -39
- data/lib/alex_codebreaker/modules/difficulty_levels.rb +6 -6
- data/lib/alex_codebreaker/modules/settings.rb +1 -1
- data/lib/alex_codebreaker/players_rating.rb +5 -5
- data/lib/alex_codebreaker/session.rb +6 -11
- data/lib/alex_codebreaker/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e2eafa2c0be75cf61d237253aabc6ef2aeebf618454212a6e334f28904206a99
|
4
|
+
data.tar.gz: de56ea76a924a1aa0e720a5a34ba74ecefc31a370910daa685afb1bf5c0af38a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 892cd158961a99924ea7f5ecf7a1d2f805b13babe3853b70d03bc8c8bb050ab0067d0134cc3353f22945212170c36ea981ee47efdcf1b8a1ebcf77982a3ab90b
|
7
|
+
data.tar.gz: b67d9f9d6b214692617a422ea03ab9561b86607accbf1944e34fd11ae2b4aa3df76b1bed0bf3cdfce136c3e34a86850f257ad9e508410058198bc31e8671e4b0
|
data/lib/alex_codebreaker.rb
CHANGED
@@ -7,6 +7,7 @@ require_relative 'alex_codebreaker/modules/difficulty_levels'
|
|
7
7
|
require_relative 'alex_codebreaker/modules/validators'
|
8
8
|
require_relative 'alex_codebreaker/modules/arguments_validation'
|
9
9
|
require_relative 'alex_codebreaker/secret_code_generator'
|
10
|
+
require_relative 'alex_codebreaker/comparison'
|
10
11
|
require_relative 'alex_codebreaker/players_rating'
|
11
12
|
require_relative 'alex_codebreaker/session'
|
12
13
|
require_relative 'alex_codebreaker/game'
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module AlexCodebreaker
|
2
|
+
class Comparison
|
3
|
+
def initialize(user_input, secret_code_for_comparison)
|
4
|
+
@user_input = user_input
|
5
|
+
@secret_code_for_comparison = secret_code_for_comparison
|
6
|
+
@matching = { place: 0, presence: 0 }
|
7
|
+
end
|
8
|
+
|
9
|
+
def response
|
10
|
+
place_matches
|
11
|
+
presence_matches
|
12
|
+
format_response
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def place_matches
|
18
|
+
@user_input.each_with_index do |value, index|
|
19
|
+
next unless value == @secret_code_for_comparison[index]
|
20
|
+
|
21
|
+
@secret_code_for_comparison[index] = nil
|
22
|
+
@user_input[index] = nil
|
23
|
+
@matching[:place] += 1
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def presence_matches
|
28
|
+
@user_input.compact.each do |value|
|
29
|
+
if @secret_code_for_comparison.include?(value)
|
30
|
+
@matching[:presence] += 1
|
31
|
+
@secret_code_for_comparison.delete_at(@secret_code_for_comparison.index(value))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def format_response
|
37
|
+
AlexCodebreaker::Modules::Settings::MATCHING[:place] * @matching[:place] +
|
38
|
+
AlexCodebreaker::Modules::Settings::MATCHING[:presence] * @matching[:presence]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -2,7 +2,7 @@ module AlexCodebreaker
|
|
2
2
|
class Game
|
3
3
|
include AlexCodebreaker::Modules::ArgumentsValidation
|
4
4
|
|
5
|
-
attr_reader :secret_code, :session
|
5
|
+
attr_reader :secret_code, :session
|
6
6
|
|
7
7
|
def initialize
|
8
8
|
@secret_code = AlexCodebreaker::SecretCodeGenerator.new.secret_code
|
@@ -13,60 +13,31 @@ module AlexCodebreaker
|
|
13
13
|
def hint
|
14
14
|
return unless @session.check_hints
|
15
15
|
|
16
|
-
|
16
|
+
process_hint
|
17
17
|
end
|
18
18
|
|
19
19
|
def guess(user_input)
|
20
20
|
return unless guess_validation(user_input) && @session.check_attempts
|
21
21
|
|
22
|
-
|
22
|
+
compare_codes(user_input)
|
23
23
|
end
|
24
24
|
|
25
25
|
private
|
26
26
|
|
27
|
-
def
|
27
|
+
def process_hint
|
28
28
|
return @secret_code_for_hint.first if @secret_code_for_hint.one?
|
29
29
|
|
30
30
|
@secret_code_for_hint.delete(@secret_code_for_hint.sample)
|
31
31
|
end
|
32
32
|
|
33
|
-
def
|
34
|
-
user_input = user_input
|
35
|
-
|
36
|
-
|
37
|
-
user_input = matching_only_numbers(user_input, secret_code_for_comparison).compact
|
38
|
-
matching_absent(user_input)
|
33
|
+
def compare_codes(user_input)
|
34
|
+
user_input = format_user_input(user_input)
|
35
|
+
comparison = Comparison.new(user_input, @secret_code.clone)
|
36
|
+
comparison.response
|
39
37
|
end
|
40
38
|
|
41
|
-
def
|
42
|
-
user_input.map
|
43
|
-
if value == secret_code_for_comparison[index]
|
44
|
-
secret_code_for_comparison[index] = nil
|
45
|
-
AlexCodebreaker::Modules::Settings::MATCHING[:place]
|
46
|
-
else
|
47
|
-
value
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def matching_only_numbers(user_input, secret_code_for_comparison)
|
53
|
-
user_input.map do |value|
|
54
|
-
if secret_code_for_comparison.include?(value)
|
55
|
-
secret_code_for_comparison.delete_at(secret_code_for_comparison.index(value))
|
56
|
-
AlexCodebreaker::Modules::Settings::MATCHING[:presence]
|
57
|
-
elsif value == AlexCodebreaker::Modules::Settings::MATCHING[:place]
|
58
|
-
value
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def matching_absent(user_input)
|
64
|
-
AlexCodebreaker::Modules::Settings::MATCHING[:place] *
|
65
|
-
user_input.count(AlexCodebreaker::Modules::Settings::MATCHING[:place]) +
|
66
|
-
AlexCodebreaker::Modules::Settings::MATCHING[:presence] *
|
67
|
-
user_input.count(AlexCodebreaker::Modules::Settings::MATCHING[:presence]) +
|
68
|
-
AlexCodebreaker::Modules::Settings::MATCHING[:absent] *
|
69
|
-
(AlexCodebreaker::Modules::Settings::CODE_LENGTH - user_input.length)
|
39
|
+
def format_user_input(user_input)
|
40
|
+
user_input.chars.map(&:to_i)
|
70
41
|
end
|
71
42
|
end
|
72
43
|
end
|
@@ -3,23 +3,23 @@ module AlexCodebreaker
|
|
3
3
|
module DifficultyLevels
|
4
4
|
DIFFICULTY_LEVELS = {
|
5
5
|
easy: {
|
6
|
-
name:
|
6
|
+
name: :easy,
|
7
7
|
level: 0,
|
8
8
|
attempts_total: 15,
|
9
9
|
hints_total: 2
|
10
|
-
},
|
10
|
+
}.freeze,
|
11
11
|
medium: {
|
12
|
-
name:
|
12
|
+
name: :medium,
|
13
13
|
level: 1,
|
14
14
|
attempts_total: 10,
|
15
15
|
hints_total: 1
|
16
|
-
},
|
16
|
+
}.freeze,
|
17
17
|
hell: {
|
18
|
-
name:
|
18
|
+
name: :hell,
|
19
19
|
level: 2,
|
20
20
|
attempts_total: 5,
|
21
21
|
hints_total: 1
|
22
|
-
}
|
22
|
+
}.freeze
|
23
23
|
}.freeze
|
24
24
|
end
|
25
25
|
end
|
@@ -4,25 +4,25 @@ module AlexCodebreaker
|
|
4
4
|
|
5
5
|
def initialize
|
6
6
|
@stats = []
|
7
|
-
|
7
|
+
load_and_sort_stats
|
8
8
|
end
|
9
9
|
|
10
10
|
private
|
11
11
|
|
12
|
-
def
|
12
|
+
def load_and_sort_stats
|
13
13
|
return unless File.exist?(AlexCodebreaker::Modules::Files::STATS_FILE)
|
14
14
|
|
15
15
|
load_stats
|
16
|
-
|
16
|
+
sort_stats
|
17
17
|
end
|
18
18
|
|
19
19
|
def load_stats
|
20
20
|
File.open(AlexCodebreaker::Modules::Files::STATS_FILE) do |file|
|
21
|
-
@stats = Array.new(
|
21
|
+
@stats = Array.new(YAML.load_stream(file))
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
25
|
+
def sort_stats
|
26
26
|
@stats.sort_by! { |value| [-value.difficulty_level, value.attempts_used, value.hints_used] }
|
27
27
|
end
|
28
28
|
end
|
@@ -18,9 +18,13 @@ module AlexCodebreaker
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def add_difficulty(difficulty)
|
21
|
-
|
21
|
+
difficulty_level = AlexCodebreaker::Modules::DifficultyLevels::DIFFICULTY_LEVELS[difficulty.downcase.to_sym]
|
22
|
+
return unless difficulty_level
|
22
23
|
|
23
|
-
|
24
|
+
@difficulty_name = difficulty_level[:name]
|
25
|
+
@difficulty_level = difficulty_level[:level]
|
26
|
+
@attempts_total = difficulty_level[:attempts_total]
|
27
|
+
@hints_total = difficulty_level[:hints_total]
|
24
28
|
end
|
25
29
|
|
26
30
|
def check_hints
|
@@ -34,14 +38,5 @@ module AlexCodebreaker
|
|
34
38
|
def save_statistic
|
35
39
|
File.open(AlexCodebreaker::Modules::Files::STATS_FILE, 'a') { |file| file.write(to_yaml) }
|
36
40
|
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def difficulty(difficulty)
|
41
|
-
@difficulty_name = difficulty[:name]
|
42
|
-
@difficulty_level = difficulty[:level]
|
43
|
-
@attempts_total = difficulty[:attempts_total]
|
44
|
-
@hints_total = difficulty[:hints_total]
|
45
|
-
end
|
46
41
|
end
|
47
42
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alex_codebreaker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oleksandr Loza
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -160,6 +160,7 @@ files:
|
|
160
160
|
- LICENSE.txt
|
161
161
|
- README.md
|
162
162
|
- lib/alex_codebreaker.rb
|
163
|
+
- lib/alex_codebreaker/comparison.rb
|
163
164
|
- lib/alex_codebreaker/game.rb
|
164
165
|
- lib/alex_codebreaker/modules/arguments_validation.rb
|
165
166
|
- lib/alex_codebreaker/modules/difficulty_levels.rb
|