new_super_codebreaker_2021 0.3.3 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fd386dbc10a479c2ef3009c011023e62302ddca4e3acff8673582ba96b73e508
4
- data.tar.gz: 3a597039a82a4e78bc29b8bb41c01133a785bbf958bf208cb2be4707ae86d3d7
3
+ metadata.gz: 75669bd5b9508401f9d4392343606ee771717cec9e5a9d1549bc961640807e61
4
+ data.tar.gz: 6b805d7ada72e527238e0855753b173e73bf2c3da90ece4dea51e81b07617467
5
5
  SHA512:
6
- metadata.gz: a8222847fefd1c56e9b0de5d945c0a18af5ee1f02fa33583b5c3ff1ccdaa17aa4314e38dc501a6a0d57425224cd9512c686b014056e08ec6e31f541ed424c2b6
7
- data.tar.gz: 33b13a1bf320dc6b9c5a349365246ebb1a17c647c1ecca6887aa836588a5cd8d1a8a7e94f7b33f83e140703f803a080d644940178c9b2d8e36cd9a8126864618
6
+ metadata.gz: fc7468aad2c2075fe1fc48819cfe1c01235f452e9ae564e272d5ca8bef53fad71566f229d7c84a5d114ab9b04121af05263a96ae042ae522ea8f442d9d593551
7
+ data.tar.gz: 0dbfc3426a92d5d0502b047f9a2d86300a19a171221e584a6b2579fca532ce5dd64a31f2162da91b3ce6459b0a9db60b9a709c5e6d7637abcf503551d84a3ae1
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source "https://rubygems.org"
3
+ source 'https://rubygems.org'
4
4
 
5
5
  # Specify your gem's dependencies in new_super_codebreaker_2021.gemspec
6
6
  gemspec
data/Rakefile CHANGED
@@ -1,10 +1,8 @@
1
- # frozen_string_literal: true
2
-
3
- require "bundler/gem_tasks"
4
- require "rubocop/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rubocop/rake_task'
5
3
 
6
4
  begin
7
- require "rspec/core/rake_task"
5
+ require 'rspec/core/rake_task'
8
6
  RSpec::Core::RakeTask.new(:spec)
9
7
  rescue LoadError
10
8
  # Ignored
data/bin/console CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require "bundler/setup"
5
- require "new_super_codebreaker_2021"
4
+ require 'bundler/setup'
5
+ require 'new_super_codebreaker_2021'
6
6
 
7
7
  # You can add fixtures and/or initialization code here to make experimenting
8
8
  # with your gem easier. You can also use a different console, if you like.
@@ -11,5 +11,5 @@ require "new_super_codebreaker_2021"
11
11
  # require "pry"
12
12
  # Pry.start
13
13
 
14
- require "irb"
14
+ require 'irb'
15
15
  IRB.start(__FILE__)
data/lib/db_methods.rb CHANGED
@@ -1,16 +1,14 @@
1
- # frozen_string_literal: true
2
-
3
1
  module DBMethods
4
2
  def save(user, file)
5
3
  rating = load_file(file)
6
4
  rating.push(user)
7
- File.open(file, "w") do |filename|
5
+ File.open(file, 'w') do |filename|
8
6
  YAML.dump(rating, filename)
9
7
  end
10
8
  end
11
9
 
12
10
  def load_file(file)
13
- YAML.load_file(file) || []
11
+ YAML.load_file(file)
14
12
  rescue Errno::ENOENT
15
13
  []
16
14
  end
data/lib/game.rb ADDED
@@ -0,0 +1,95 @@
1
+ require 'yaml'
2
+ require_relative 'validate'
3
+ require_relative 'show_content'
4
+ require_relative 'db_methods'
5
+ require_relative 'user'
6
+ module NewSuperCodebreaker2021
7
+ class Game
8
+ include Validate
9
+ include ShowContent
10
+ include DBMethods
11
+
12
+ def initialize
13
+ @code = generate_code
14
+ end
15
+
16
+ GUESS_COMMANDS = %i[hint rules exit].freeze
17
+ START_COMMANDS = %i[start rules stats exit].freeze
18
+ DIFFICULTY_COMMANDS = %i[easy medium hell exit].freeze
19
+ AFTER_GAME_COMMANDS = %i[start save exit].freeze
20
+ YES_NO_COMMANDS = %i[yes no].freeze
21
+
22
+ def chose_command(command)
23
+ check_input(command, START_COMMANDS)
24
+ end
25
+
26
+ def take_name(input_name)
27
+ if input_name == 'exit'
28
+ :exit
29
+ else
30
+ validate_name(input_name)
31
+ end
32
+ end
33
+
34
+ def chose_difficulty(difficulty)
35
+ check_input(difficulty, DIFFICULTY_COMMANDS)
36
+ end
37
+
38
+ def user_guess(code)
39
+ if code.to_i != 0
40
+ validate_user_code(code)
41
+ elsif GUESS_COMMANDS.include?(code.to_sym)
42
+ code.to_sym
43
+ else false
44
+ end
45
+ end
46
+
47
+ def take_hint(user, code, used_hints)
48
+ if user.hints_total > user.hints_used
49
+ user.hints_used += 1
50
+ used_hints.each { |hint| code.delete(hint) }
51
+ code.sample
52
+ else
53
+ false
54
+ end
55
+ end
56
+
57
+ def after_game_commands(command)
58
+ check_input(command, AFTER_GAME_COMMANDS)
59
+ end
60
+
61
+ def attempt_to_start(command)
62
+ check_input(command, YES_NO_COMMANDS)
63
+ end
64
+
65
+ def compare_codes(user_code)
66
+ matches, u_char = number_on_right_place(user_code)
67
+ number_in_secret_code(user_code, matches, u_char)
68
+ end
69
+
70
+ private
71
+
72
+ def number_on_right_place(user_code)
73
+ matches = []
74
+ u_char = []
75
+ user_code.each_index do |i|
76
+ if @code[i] == user_code[i]
77
+ matches.unshift('+')
78
+ u_char << user_code[i]
79
+ end
80
+ end
81
+ [matches, u_char]
82
+ end
83
+
84
+ def number_in_secret_code(user_code, matches, u_char)
85
+ user_code.each do |element|
86
+ matches.push('-') if @code.include?(element) && !u_char.include?(element)
87
+ end
88
+ matches
89
+ end
90
+
91
+ def generate_code
92
+ Array.new(4) { rand(1..6) }
93
+ end
94
+ end
95
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NewSuperCodebreaker2021
4
- VERSION = "0.3.3"
4
+ VERSION = '0.4.1'
5
5
  end
@@ -1,112 +1,6 @@
1
- # frozen_string_literal: true
2
-
3
- require "yaml"
4
- require_relative "new_super_codebreaker_2021/version"
5
- require_relative "validate"
6
- require_relative "show_content"
7
- require_relative "db_methods"
8
- require_relative "user"
1
+ require_relative 'new_super_codebreaker_2021/version'
2
+ require 'game'
9
3
 
10
4
  module NewSuperCodebreaker2021
11
5
  class Error < StandardError; end
12
-
13
- class Game
14
- include Validate
15
- include ShowContent
16
- include DBMethods
17
- def chose_com(command)
18
- case command
19
- when "start" then :start
20
- when "rules" then :rules
21
- when "stats" then :stats
22
- when "exit" then :exit
23
- else false
24
- end
25
- end
26
-
27
- def take_name(input_name)
28
- if input_name == "exit"
29
- :exit
30
- else
31
- validate_name(input_name)
32
- end
33
- end
34
-
35
- def chose_difficulty(difficulty)
36
- case difficulty
37
- when "easy" then :easy
38
- when "medium" then :medium
39
- when "hell" then :hell
40
- when "exit" then :exit
41
- else
42
- false
43
- end
44
- end
45
-
46
- def generate_code
47
- Array.new(4) { rand(1..6) }
48
- end
49
-
50
- def user_guess(code)
51
- case code
52
- when "exit" then :exit
53
- when "hint" then :hint
54
- when "rules" then :rules
55
- else validate_user_code(code)
56
- end
57
- end
58
-
59
- def take_hint(user, code, used_hints)
60
- if user.hints_total > user.hints_used
61
- user.hints_used += 1
62
- used_hints.each { |hint| code.delete(hint) }
63
- code.sample
64
- else
65
- false
66
- end
67
- end
68
-
69
- def after_game_commands(command)
70
- case command
71
- when "start" then :start
72
- when "save" then :save
73
- when "exit" then :exit
74
- else false
75
- end
76
- end
77
-
78
- def attempt_to_start(command)
79
- case command
80
- when "yes" then :yes
81
- when "no" then :no
82
- else false
83
- end
84
- end
85
-
86
- def compare_codes(secret_code, user_code)
87
- matches, u_char = number_on_right_place(secret_code, user_code)
88
- number_in_secret_code(secret_code, user_code, matches, u_char)
89
- end
90
-
91
- private
92
-
93
- def number_on_right_place(secret_code, user_code)
94
- matches = []
95
- u_char = []
96
- user_code.each_index do |i|
97
- if secret_code[i] == user_code[i]
98
- matches.unshift("+")
99
- u_char << user_code[i]
100
- end
101
- end
102
- [matches, u_char]
103
- end
104
-
105
- def number_in_secret_code(secret_code, user_code, matches, u_char)
106
- user_code.each do |element|
107
- matches.push("-") if secret_code.include?(element) && !u_char.include?(element)
108
- end
109
- matches
110
- end
111
- end
112
6
  end
data/lib/show_content.rb CHANGED
@@ -1,20 +1,32 @@
1
+ require 'terminal-table'
2
+
1
3
  module ShowContent
2
- def show_rules(rules)
3
- rules
4
- end
4
+ DIFFICULTY = {
5
+ easy: { attempts: 15, hints: 2 },
6
+ medium: { attempts: 10, hints: 1 },
7
+ hell: { attempts: 5, hints: 1 }
8
+ }.freeze
5
9
 
6
10
  def show_stats(file)
7
11
  data = YAML.load_file(file) || []
8
12
  data.sort_by(&:hints_used).sort_by(&:attempts_used).sort_by { |game| -game.difficulty }
13
+ create_table(data)
9
14
  rescue Errno::ENOENT
10
15
  []
11
16
  end
12
17
 
13
- def show_goodbye(goodbye)
14
- goodbye
15
- end
18
+ private
19
+
20
+ def create_table(users)
21
+ table = Terminal::Table.new(headings: ['Rating', 'Name', 'Difficulty', 'Attempts Total',
22
+ 'Attempts Used', 'Hints Total', 'Hints Used'])
23
+ rate = 1
16
24
 
17
- def show_error(error)
18
- error
25
+ users.each do |user|
26
+ table.add_row([rate, user.name, DIFFICULTY.keys[user.difficulty],
27
+ user.attempts_total, user.attempts_used, user.hints_used, user.hints_total])
28
+ rate += 1
29
+ end
30
+ table
19
31
  end
20
32
  end
data/lib/validate.rb CHANGED
@@ -9,15 +9,26 @@ module Validate
9
9
 
10
10
  def validate_user_code(us_code)
11
11
  arr_code = check_splitting(us_code)
12
- if arr_code && check_length?(arr_code) && check_numbers?(arr_code)
12
+ if valid_number?(arr_code)
13
13
  arr_code
14
14
  else
15
15
  false
16
16
  end
17
17
  end
18
18
 
19
+ def check_input(input, command_list)
20
+ if input.to_i.zero? && command_list.include?(input.to_sym)
21
+ input.to_sym
22
+ else false
23
+ end
24
+ end
25
+
19
26
  private
20
27
 
28
+ def valid_number?(arr_code)
29
+ arr_code && check_length?(arr_code) && check_numbers?(arr_code)
30
+ end
31
+
21
32
  def check_splitting(code)
22
33
  code.chars.map!(&:to_i) if integer?(code)
23
34
  end
@@ -32,7 +43,7 @@ module Validate
32
43
 
33
44
  def check_numbers?(code)
34
45
  code.each do |number|
35
- return false if number < 1 || number > 6
46
+ return if number < 1 || number > 6
36
47
  end
37
48
  true
38
49
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: new_super_codebreaker_2021
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nazar Dakhno
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-23 00:00:00.000000000 Z
11
+ date: 2021-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fasterer
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.21.2
83
+ - !ruby/object:Gem::Dependency
84
+ name: terminal-table
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 3.0.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 3.0.1
83
97
  description: Game where you need to guess the secret code
84
98
  email:
85
99
  - dakhnonazar@gmail.com
@@ -96,6 +110,7 @@ files:
96
110
  - bin/console
97
111
  - bin/setup
98
112
  - lib/db_methods.rb
113
+ - lib/game.rb
99
114
  - lib/new_super_codebreaker_2021.rb
100
115
  - lib/new_super_codebreaker_2021/version.rb
101
116
  - lib/show_content.rb