alex_codebreaker 0.1.7 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
|