rav_codebreaker 0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 60b94583302c16075ecdaefb98e2df8f624ddc63
4
+ data.tar.gz: 5077cb28e8a30f6742022b1ac54dd01b2f2a8b6a
5
+ SHA512:
6
+ metadata.gz: f225552172bbe2858c4a9e1c9baadf5ee09344ffbaa6952ca4ae5c40a4aee6f894303bbb477789f2a6130acc0f2b3442e88c0b5f4b98d05afe59e6bb5de6af7c
7
+ data.tar.gz: 262acf349d1c6ffb8496eb4f7fea9be6bf4f29127f65eaf8c19258f5738d3d5e6b1967fa65e4ec2c0021b9d7151ec20fc66ab84c448115c8ec6b0c0869a4afcf
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rav_codebreaker.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # RavCodebreaker
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/rav_codebreaker`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ The logic game in which a code-breaker tries to break a secret code created by a code-maker.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'rav_codebreaker'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install rav_codebreaker
22
+
23
+
24
+ ## Usage
25
+
26
+ require "rav_codebreaker"
27
+ RavCodebreaker.play(:beginner || :expert || : master)
28
+
29
+ ## Development
30
+
31
+ After checking out the repo, run `bin/setup` to install dependencies.
32
+ You can also run `bin/console` for an interactive prompt that will allow you to experiment.
33
+
34
+ To install this gem onto your local machine, run `bundle exec rake install`.
35
+ To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`,
36
+ which will create a git tag for the version, push git commits and tags,
37
+ and push the `.gem` file to [rubygems.org](https://rubygems.org).
38
+
39
+ ## Contributing
40
+
41
+ Bug reports and pull requests are welcome on GitHub at https://github.com/romanenko1976/CodeBreaker
42
+
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "rav_codebreaker"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/game.example ADDED
@@ -0,0 +1,50 @@
1
+ ================================================================================
2
+ Welcome to play the CodeBreaker Game!!!
3
+ ================================================================================
4
+ Try to guess the secret code! You have 10 attempts and 0 hints. Good luck!
5
+ Enter you four numbers code (from 1 to 6), please (or Q - for exit, H - for hint):
6
+ h
7
+ Sorry, but you have not any hints :(
8
+ Try to guess the secret code! You have 10 attempts and 0 hints. Good luck!
9
+ Enter you four numbers code (from 1 to 6), please (or Q - for exit, H - for hint):
10
+ 1111
11
+ You result is ""!
12
+ Try to guess the secret code! You have 9 attempts and 0 hints. Good luck!
13
+ Enter you four numbers code (from 1 to 6), please (or Q - for exit, H - for hint):
14
+ 2222
15
+ You result is ""!
16
+ Try to guess the secret code! You have 8 attempts and 0 hints. Good luck!
17
+ Enter you four numbers code (from 1 to 6), please (or Q - for exit, H - for hint):
18
+ 3333
19
+ You result is "+"!
20
+ Try to guess the secret code! You have 7 attempts and 0 hints. Good luck!
21
+ Enter you four numbers code (from 1 to 6), please (or Q - for exit, H - for hint):
22
+ 3444
23
+ You result is "+-"!
24
+ Try to guess the secret code! You have 6 attempts and 0 hints. Good luck!
25
+ Enter you four numbers code (from 1 to 6), please (or Q - for exit, H - for hint):
26
+ 4355
27
+ You result is "--"!
28
+ Try to guess the secret code! You have 5 attempts and 0 hints. Good luck!
29
+ Enter you four numbers code (from 1 to 6), please (or Q - for exit, H - for hint):
30
+ 6643
31
+ You result is "++--"!
32
+ Try to guess the secret code! You have 4 attempts and 0 hints. Good luck!
33
+ Enter you four numbers code (from 1 to 6), please (or Q - for exit, H - for hint):
34
+ 6634
35
+ You result is "++++"!
36
+ We congratulate you on your victory!!!
37
+ "Do you want to save your results (Y/N)?
38
+ y
39
+ Enter your name, please...
40
+ Kiril
41
+ --------------------------------------------------
42
+ | ## | player name | game level | turns | hints |
43
+ --------------------------------------------------
44
+ | 1 | John | beginner | 5 | 1 |
45
+ | 2 | roll | beginner | 5 | 2 |
46
+ | 3 | Kiril | expert | 7 | 0 |
47
+ | 4 | Andrey | beginner | 8 | 0 |
48
+ --------------------------------------------------
49
+ Do you want to play again (Y or N)
50
+ n
@@ -0,0 +1,3 @@
1
+ require 'rav_codebreaker'
2
+
3
+ RavCodebreaker.play(:beginner)
data/lib/play_test.rb ADDED
@@ -0,0 +1,7 @@
1
+ require_relative './rav_codebreaker.rb'
2
+
3
+ module Test
4
+ extend RavCodebreaker
5
+ end
6
+
7
+ RavCodebreaker::play('beginner')
@@ -0,0 +1,159 @@
1
+ module RavCodebreaker
2
+ class Game
3
+ TURNS_COUNT = {expert: 10, master: 15, beginner: 20}
4
+ HINTS_COUNT = {expert: 0, master: 1, beginner: 2}
5
+ SCORES_FILE_NAME = './score.dat'
6
+
7
+ attr_reader :turns_left, :hints_left, :offer
8
+
9
+ def initialize(level = :expert)
10
+ @secret_code = ''
11
+ @turns_left = 0
12
+ TURNS_COUNT.keys.include?(level) ? @level = level : @level = :expert
13
+ @score = []
14
+ end
15
+
16
+ def start
17
+ @secret_code = Array.new(4){rand(1..6)}*''
18
+ @turns_left = TURNS_COUNT[@level]
19
+ @hints_left = HINTS_COUNT[@level]
20
+ @offer = '6666'
21
+ end
22
+
23
+ def play
24
+ start
25
+ welcome_message
26
+ loop do
27
+ puts format_error? ? incorrect_message : invitation_message
28
+ get_offer
29
+ exit if exit?
30
+ next if show_hint? || format_error?
31
+ test_offer
32
+ show_winner_message if win?
33
+ show_game_over_message if game_over?
34
+ break if win? || game_over?
35
+ end
36
+ load_scores_from_file
37
+ save_results
38
+ show_results
39
+ end
40
+
41
+ def again?
42
+ puts 'Do you want to play again (Y or N)'
43
+ gets =~ /y|Y/
44
+ end
45
+
46
+ #private
47
+
48
+ def welcome_message
49
+ puts '='*80
50
+ puts 'Welcome to play the CodeBreaker Game!!!'
51
+ puts '='*80
52
+ end
53
+
54
+ def invitation_message
55
+ "Try to guess the secret code! You have #{@turns_left} attempts and #{@hints_left} hints. Good luck!" +
56
+ "\nEnter you four numbers code (from 1 to 6), please (or Q - for exit, H - for hint):"
57
+ end
58
+
59
+ def incorrect_message
60
+ "\nincorrect number format, try again, please..."
61
+ end
62
+
63
+ def decode_offer
64
+ code = @secret_code.split('')
65
+ offer = @offer.split('')
66
+ 4.times{|i| code[i] = offer[i] = nil if @secret_code[i] == @offer[i]}
67
+ offer.compact!
68
+ offer.each{|num| code[code.index(num)] = '-' if code.include? num}
69
+ '+' * code.count(nil) + '-' * code.count('-')
70
+ end
71
+
72
+ def get_offer
73
+ @offer = gets.chomp
74
+ end
75
+
76
+ def test_offer
77
+ @turns_left -= 1
78
+ puts "You result is \"#{decode_offer}\"!"
79
+ end
80
+
81
+ def win?
82
+ decode_offer == '++++'
83
+ end
84
+
85
+ def format_error?
86
+ @offer !~ /^[1-6]{4}$/ && @offer !~ /^[hH]$/
87
+ end
88
+
89
+ def exit?
90
+ @offer =~ /^[qQ]$/
91
+ end
92
+
93
+ def game_over?
94
+ @turns_left < 1
95
+ end
96
+
97
+ def show_game_over_message
98
+ puts "Sorry, you lose the game :(\nThe secret code was #{@secret_code}."
99
+ end
100
+
101
+ def show_winner_message
102
+ puts 'We congratulate you on your victory!!!'
103
+ end
104
+
105
+ def show_hint?
106
+ return false unless @offer =~ /^[hH]$/
107
+ if @hints_left < 1
108
+ puts 'Sorry, but you have not any hints :('
109
+ else
110
+ @hints_left -= 1
111
+ pos = rand(4)
112
+ puts "I exactly know that a number #{@secret_code[pos]} is at position ##{pos} (remember, it starts from 0)."
113
+ end
114
+ true
115
+ end
116
+
117
+ def load_scores_from_file
118
+ return unless File.exist? SCORES_FILE_NAME
119
+ File.open(SCORES_FILE_NAME) do |file|
120
+ @score = Marshal.load(file)
121
+ end
122
+ end
123
+
124
+ def save_scores_to_file
125
+ File.open(SCORES_FILE_NAME, 'w+') do |file|
126
+ Marshal.dump(@score, file)
127
+ end
128
+ end
129
+
130
+ def show_results
131
+ @score.sort_by!{|player| player[:turns]}
132
+ format_str = "| %02s | %12s | %10s | %5s | %5s |"
133
+ format_str_length = 50
134
+ puts '-' * format_str_length
135
+ puts format_str % %w(## player\ name game\ level turns hints)
136
+ puts '-' * format_str_length
137
+ @score.each_with_index do |player, index|
138
+ arr = [index + 1] + player.values
139
+ puts format_str % arr
140
+ end
141
+ puts '-' * format_str_length
142
+ end
143
+
144
+ def save_results
145
+ puts '"Do you want to save your results (Y/N)?'
146
+ return if gets !~ /y|Y/
147
+ player = {}
148
+ begin
149
+ puts 'Enter your name, please...'
150
+ player[:name] = gets.chomp
151
+ end while player[:name].empty?
152
+ player[:level] = @level
153
+ player[:turns] = TURNS_COUNT[@level] - @turns_left
154
+ player[:hints] = HINTS_COUNT[@level] - @hints_left
155
+ @score << player
156
+ save_scores_to_file
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,3 @@
1
+ module RavCodebreaker
2
+ VERSION = "0.1.3"
3
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'rav_codebreaker/version'
2
+ require_relative 'rav_codebreaker/game'
3
+
4
+ module RavCodebreaker
5
+ def self.play(level)
6
+ begin
7
+ game = Game.new(level)
8
+ game.play
9
+ end while game.again?
10
+ end
11
+ end
12
+
@@ -0,0 +1,35 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rav_codebreaker/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rav_codebreaker"
8
+ spec.version = RavCodebreaker::VERSION
9
+ spec.authors = ["Andrii Romanenko"]
10
+ spec.email = ["roand@ukr.net"]
11
+
12
+ spec.summary = %q{Codebreaker Game}
13
+ spec.description = %q{The logic game in which a code-breaker tries to break a secret code created by a code-maker.}
14
+ # spec.homepage = "TODO: Put your gem's website or public repo URL here."
15
+
16
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
18
+ if spec.respond_to?(:metadata)
19
+ spec.metadata['allowed_push_host'] = "https://rubygems.org"
20
+ else
21
+ raise "RubyGems 2.0 or newer is required to protect against " \
22
+ "public gem pushes."
23
+ end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
26
+ f.match(%r{^(test|spec|features)/})
27
+ end
28
+ spec.bindir = "exe"
29
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
+ spec.require_paths = ["lib"]
31
+
32
+ spec.add_development_dependency "bundler", "~> 1.13"
33
+ spec.add_development_dependency "rake", "~> 10.0"
34
+ spec.add_development_dependency "rspec"
35
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rav_codebreaker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.3
5
+ platform: ruby
6
+ authors:
7
+ - Andrii Romanenko
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-12-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.13'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: The logic game in which a code-breaker tries to break a secret code created
56
+ by a code-maker.
57
+ email:
58
+ - roand@ukr.net
59
+ executables: []
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - Gemfile
64
+ - README.md
65
+ - Rakefile
66
+ - bin/console
67
+ - bin/setup
68
+ - game.example
69
+ - lib/play_codebreaker.rb
70
+ - lib/play_test.rb
71
+ - lib/rav_codebreaker.rb
72
+ - lib/rav_codebreaker/game.rb
73
+ - lib/rav_codebreaker/version.rb
74
+ - rav_codebreaker.gemspec
75
+ homepage:
76
+ licenses: []
77
+ metadata:
78
+ allowed_push_host: https://rubygems.org
79
+ post_install_message:
80
+ rdoc_options: []
81
+ require_paths:
82
+ - lib
83
+ required_ruby_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ requirements: []
94
+ rubyforge_project:
95
+ rubygems_version: 2.6.7
96
+ signing_key:
97
+ specification_version: 4
98
+ summary: Codebreaker Game
99
+ test_files: []