mastermind-cli 0.0.1

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.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+
4
+ gem 'rspec'
@@ -0,0 +1,18 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ diff-lcs (1.1.3)
5
+ rspec (2.10.0)
6
+ rspec-core (~> 2.10.0)
7
+ rspec-expectations (~> 2.10.0)
8
+ rspec-mocks (~> 2.10.0)
9
+ rspec-core (2.10.1)
10
+ rspec-expectations (2.10.0)
11
+ diff-lcs (~> 1.1.3)
12
+ rspec-mocks (2.10.1)
13
+
14
+ PLATFORMS
15
+ ruby
16
+
17
+ DEPENDENCIES
18
+ rspec
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'mastermind'
5
+
6
+ console = Mastermind::ConsoleInterface.new($stdin, $stdout)
7
+ console.run
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ module Mastermind
4
+
5
+ end
6
+
7
+ require 'mastermind/code_generator'
8
+ require 'mastermind/game'
9
+ require 'mastermind/console'
@@ -0,0 +1,10 @@
1
+ module Mastermind
2
+ class CodeGenerator
3
+ def self.generate
4
+ zeichen = %w{a b c d e f}
5
+ value = ""
6
+ 4.times {value << zeichen.sample}
7
+ value
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+
4
+ module Mastermind
5
+ class ConsoleInterface
6
+ def initialize(input, output)
7
+ @input = input
8
+ @output = output
9
+ @spiel = Game.new(startup())
10
+ end
11
+ def run()
12
+
13
+ ausgabe()
14
+ gewonnen()
15
+ end
16
+
17
+ def ausgabe
18
+ zaehler = 1
19
+ while @spiel.gewonnen? == false
20
+ @output.print "Versuch #{zaehler}: "
21
+ eingabe = @input.gets
22
+ begin
23
+ @spiel.neuer_versuch(eingabe.strip)
24
+ zaehler += 1
25
+ @output.puts "==>> #{@spiel.letzte_wertung.join(',')}"
26
+ rescue Exception => e
27
+ @output.puts e.message
28
+ end
29
+ end
30
+ end
31
+
32
+ def startup
33
+ @output.puts "Willkommen bei Mastermind!"
34
+ @output.puts "---"
35
+ @output.puts "Wollen Sie den Lösungscode automatisch generieren? y/n"
36
+ if @input.gets.strip == "y"
37
+ b = CodeGenerator.generate
38
+ else
39
+ @output.puts "Ihre Eingabe:"
40
+ b = @input.gets
41
+ end
42
+ @output.puts "Versuchen Sie nun den vierstelligen Code zu erraten! abcdef steht zur Verfügung. W entspricht der Anzahl richtiger Buchstaben am falschen Ort. S entspricht der Anzahl richtiger Buchstaben"
43
+ b.downcase!
44
+ b.strip
45
+ end
46
+
47
+ def gewonnen
48
+ @output.puts "Gratulation sie haben gewonnen!!"
49
+ @output.puts "Wollen sie ein neues spiel starten? y"
50
+ if @input.gets == "y"
51
+ startup()
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,112 @@
1
+ # encoding: utf-8
2
+
3
+ module Mastermind
4
+ class Game
5
+
6
+ def initialize(loesungsfolge)
7
+ codefolge_laenge_pruefen(loesungsfolge)
8
+ codefolge_zeichen_pruefen(loesungsfolge)
9
+ @letzterversuch = []
10
+ @loesungsfolge = loesungsfolge
11
+ @history = []
12
+ end
13
+
14
+ def neuer_versuch(codefolge)
15
+ codefolge_laenge_pruefen(codefolge)
16
+ codefolge_zeichen_pruefen(codefolge)
17
+
18
+ @letzterversuch = pruefen(codefolge)
19
+ @history << codefolge
20
+ end
21
+
22
+ def codefolge_laenge_pruefen(codefolge)
23
+ if codefolge.length > 4
24
+ raise ArgumentError, "Der Code '#{codefolge.strip}' ist nicht 4 Zeichen lang"
25
+ end
26
+ if codefolge.length < 4
27
+ raise ArgumentError, "Der Code '#{codefolge.strip}' ist nicht 4 Zeichen lang"
28
+ end
29
+ end
30
+
31
+ private :codefolge_laenge_pruefen
32
+
33
+ def codefolge_zeichen_pruefen(codefolge)
34
+ unless codefolge =~ /^[abcdef]+$/
35
+ raise ArgumentError, "Der Code '#{codefolge.strip}' enthält ungültige Zeichen"
36
+ end
37
+ end
38
+ private :codefolge_zeichen_pruefen
39
+
40
+
41
+ def letzte_wertung
42
+ @letzterversuch
43
+ end
44
+
45
+ def versuche
46
+ @history
47
+ end
48
+
49
+ def pruefen(loesung)
50
+ test = CodePreufung.new(@loesungsfolge, loesung.strip)
51
+ test.weisseminusschwarze
52
+ end
53
+
54
+ def gewonnen?
55
+ @letzterversuch == ['s', 's', 's', 's']
56
+ end
57
+ end
58
+
59
+ class CodePreufung
60
+
61
+ def initialize(loesungsfolge, testfolge)
62
+ @loesungsfolge = codezuarray(loesungsfolge)
63
+ @testfolge = codezuarray(testfolge)
64
+ end
65
+
66
+ def codezuarray(y)
67
+ y.chars.to_a
68
+ end
69
+ private :codezuarray
70
+
71
+ def weisseminusschwarze
72
+ resultat = []
73
+ weiss = falscher_ort_richtige_farbe()
74
+ schwarz = richtiger_ort_richtige_farbe()
75
+
76
+ resultat += ["w"] * weiss
77
+ resultat += ["s"] * schwarz
78
+ resultat
79
+ end
80
+
81
+ def falscher_ort_richtige_farbe
82
+ richtige_farbe - richtiger_ort_richtige_farbe
83
+ end
84
+ private :falscher_ort_richtige_farbe
85
+
86
+ def richtige_farbe
87
+ vorhandene_zeichen = @loesungsfolge.each_with_object(Hash.new(0)) do |zeichen, hash|
88
+ hash[zeichen] += 1
89
+ end
90
+ anzahl = 0
91
+ @testfolge.each do |zeichen|
92
+ if vorhandene_zeichen[zeichen] > 0
93
+ vorhandene_zeichen[zeichen] -= 1
94
+ anzahl += 1
95
+ end
96
+ end
97
+ anzahl
98
+ end
99
+ private :richtige_farbe
100
+
101
+
102
+ def richtiger_ort_richtige_farbe
103
+ result = 0
104
+ @testfolge.each_with_index do |b, index|
105
+ result += 1 if @loesungsfolge.include?(b) && @loesungsfolge[index] == b
106
+ end
107
+ result
108
+ end
109
+ private :richtiger_ort_richtige_farbe
110
+
111
+ end
112
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mastermind::CodeGenerator do
4
+
5
+ it 'Der Code ist ein String' do
6
+ Mastermind::CodeGenerator.generate.should be_kind_of(String)
7
+ end
8
+
9
+
10
+ it 'generiert einen 4-stelligen Code' do
11
+ Mastermind::CodeGenerator.generate.size.should == 4
12
+ end
13
+
14
+ it 'Jeder Code ist anders' do
15
+ Mastermind::CodeGenerator.generate.should_not == Mastermind::CodeGenerator.generate
16
+ end
17
+
18
+
19
+ end
@@ -0,0 +1,121 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+
5
+ describe Mastermind::Game do
6
+
7
+ describe 'Eingabeprüfung: ' do
8
+ it 'der Schlüsselcode ist auf 4 Zeichen beschränk' do
9
+ lambda do
10
+ Mastermind::Game.new('aaaaa')
11
+ end.should raise_error(ArgumentError, "Der Code 'aaaaa' ist nicht 4 Zeichen lang")
12
+ end
13
+
14
+ it 'der Schlüsselcode ist auf 4 Zeichen beschränk und nicht kürzer' do
15
+ lambda do
16
+ Mastermind::Game.new('aaa')
17
+ end.should raise_error(ArgumentError, "Der Code 'aaa' ist nicht 4 Zeichen lang")
18
+ end
19
+
20
+ it 'Die Versuche des Benutzers sind 4 Zeichen lang' do
21
+ spiel = Mastermind::Game.new('aaaa')
22
+ lambda do
23
+ spiel.neuer_versuch('aaaaa')
24
+ end.should raise_error(ArgumentError, "Der Code 'aaaaa' ist nicht 4 Zeichen lang")
25
+ end
26
+
27
+ it 'Die Versuche des Benutzers sind 4 Zeichen lang und nicht kürzer' do
28
+ spiel = Mastermind::Game.new('aaaa')
29
+ lambda do
30
+ spiel.neuer_versuch('aaa')
31
+ end.should raise_error(ArgumentError, "Der Code 'aaa' ist nicht 4 Zeichen lang")
32
+ end
33
+
34
+ it 'der Schlüsselcode darf nur die Zeichen a,b,c,d und f enthalten' do
35
+ lambda do
36
+ Mastermind::Game.new('abcx')
37
+ end.should raise_error(ArgumentError, "Der Code 'abcx' enthält ungültige Zeichen")
38
+ end
39
+
40
+
41
+ it 'Die Versuche des Benutzers dürfen nur die Zeichen a,b,c,d und f enthalten' do
42
+ spiel = Mastermind::Game.new('aaaa')
43
+ lambda do
44
+ spiel.neuer_versuch('abcx')
45
+ end.should raise_error(ArgumentError, "Der Code 'abcx' enthält ungültige Zeichen")
46
+ end
47
+ end
48
+
49
+ describe 'Logik: ' do
50
+ it 'Ein neues Spiel ist nicht gewonnen' do
51
+ Mastermind::Game.new('aaaa').gewonnen?.should == false
52
+ end
53
+
54
+ it 'Gibt einen weissen Pin für die Richtige Farbe am falschen Ort' do
55
+ spiel = Mastermind::Game.new('abcf')
56
+ spiel.neuer_versuch('feee')
57
+ spiel.letzte_wertung.should == ['w']
58
+ end
59
+
60
+ it 'Gibt einen schwarzen Pin für die Richtige Farbe am richtigen Ort' do
61
+ spiel = Mastermind::Game.new('abcf')
62
+ spiel.neuer_versuch('eeef')
63
+ spiel.letzte_wertung.should == ['s']
64
+ end
65
+
66
+ it 'Wertet Zeichen nur doppelt, wenn diese auch doppelt in der Lösung vorhanden sind' do
67
+ spiel = Mastermind::Game.new('abbb')
68
+ spiel.neuer_versuch('aaaa')
69
+ spiel.letzte_wertung.should == ['s']
70
+ end
71
+
72
+ it 'Die Versuche werden aufgezeichnet' do
73
+ spiel = Mastermind::Game.new('abbb')
74
+ spiel.neuer_versuch('aaaa')
75
+ spiel.neuer_versuch('bbbb')
76
+ spiel.neuer_versuch('cccc')
77
+ spiel.neuer_versuch('dddd')
78
+ spiel.versuche.should == ['aaaa', 'bbbb', 'cccc', 'dddd']
79
+ end
80
+
81
+ context 'zwei richtige Farben am falschen Ort' do
82
+ subject { Mastermind::Game.new('abcf') }
83
+ before { subject.neuer_versuch('cefe') }
84
+
85
+ it 'Das Spiel ist nicht gewonnen' do
86
+ subject.gewonnen?.should == false
87
+ end
88
+
89
+ it 'Gibt zwei weisse Pins' do
90
+ subject.letzte_wertung.should == ['w', 'w']
91
+ end
92
+ end
93
+
94
+ context 'eine richtige Farbe am falschen Ort und zwei am richtigen Ort' do
95
+ subject { Mastermind::Game.new('abcf') }
96
+ before { subject.neuer_versuch('abfd') }
97
+
98
+ it 'Das Spiel ist nicht gewonnen' do
99
+ subject.gewonnen?.should == false
100
+ end
101
+
102
+ it 'Gibt einen weissen Pin und zwei shwarze' do
103
+ subject.letzte_wertung.should == ['w', 's', 's']
104
+ end
105
+ end
106
+
107
+ context 'alle Pins sind korrekt' do
108
+ subject { Mastermind::Game.new('abcf') }
109
+ before { subject.neuer_versuch('abcf') }
110
+
111
+ it 'Das Spiel ist gewonnen' do
112
+ subject.gewonnen?.should == true
113
+ end
114
+
115
+ it 'Gibt 4 schwarze Pins' do
116
+ subject.letzte_wertung.should == ['s', 's', 's', 's']
117
+ end
118
+ end
119
+ end
120
+
121
+ end
@@ -0,0 +1,107 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+
5
+ describe Mastermind::Game do
6
+
7
+ describe 'Eingabeprüfung: ' do
8
+ it 'der Schlüsselcode ist auf 4 Zeichen beschränk' do
9
+ lambda do
10
+ Mastermind::Game.new('aaaaa')
11
+ end.should raise_error(ArgumentError, "Der Code 'aaaaa' ist nicht 4 Zeichen lang")
12
+ end
13
+
14
+ it 'Die Versuche des Benutzers sind 4 Zeichen lang' do
15
+ spiel = Mastermind::Game.new('aaaa')
16
+ lambda do
17
+ spiel.neuer_versuch('aaaaa')
18
+ end.should raise_error(ArgumentError, "Der Code 'aaaaa' ist nicht 4 Zeichen lang")
19
+ end
20
+
21
+ it 'der Schlüsselcode darf nur die Zeichen a,b,c,d und f enthalten' do
22
+ lambda do
23
+ Mastermind::Game.new('abcx')
24
+ end.should raise_error(ArgumentError, "Der Code 'abcx' enthält ungültige Zeichen")
25
+ end
26
+
27
+ it 'Die Versuche des Benutzers dürfen nur die Zeichen a,b,c,d und f enthalten' do
28
+ spiel = Mastermind::Game.new('aaaa')
29
+ lambda do
30
+ spiel.neuer_versuch('abcx')
31
+ end.should raise_error(ArgumentError, "Der Code 'abcx' enthält ungültige Zeichen")
32
+ end
33
+ end
34
+
35
+ describe 'Logik: ' do
36
+ it 'Ein neues Spiel ist nicht gewonnen' do
37
+ Mastermind::Game.new('aaaa').gewonnen?.should == false
38
+ end
39
+
40
+ it 'Gibt einen weissen Pin für die Richtige Farbe am falschen Ort' do
41
+ spiel = Mastermind::Game.new('abcf')
42
+ spiel.neuer_versuch('feee')
43
+ spiel.letzte_wertung.should == ['w']
44
+ end
45
+
46
+ it 'Gibt einen schwarzen Pin für die Richtige Farbe am richtigen Ort' do
47
+ spiel = Mastermind::Game.new('abcf')
48
+ spiel.neuer_versuch('eeef')
49
+ spiel.letzte_wertung.should == ['s']
50
+ end
51
+
52
+ it 'Wertet Zeichen nur doppelt, wenn diese auch doppelt in der Lösung vorhanden sind' do
53
+ spiel = Mastermind::Game.new('abbb')
54
+ spiel.neuer_versuch('aaaa')
55
+ spiel.letzte_wertung.should == ['s']
56
+ end
57
+
58
+ it 'Die Versuche werden aufgezeichnet' do
59
+ spiel = Mastermind::Game.new('abbb')
60
+ spiel.neuer_versuch('aaaa')
61
+ spiel.neuer_versuch('bbbb')
62
+ spiel.neuer_versuch('cccc')
63
+ spiel.neuer_versuch('dddd')
64
+ spiel.versuche.should == ['aaaa', 'bbbb', 'cccc', 'dddd']
65
+ end
66
+
67
+ context 'zwei richtige Farben am falschen Ort' do
68
+ subject { Mastermind::Game.new('abcf') }
69
+ before { subject.neuer_versuch('cefe') }
70
+
71
+ it 'Das Spiel ist nicht gewonnen' do
72
+ subject.gewonnen?.should == false
73
+ end
74
+
75
+ it 'Gibt zwei weisse Pins' do
76
+ subject.letzte_wertung.should == ['w', 'w']
77
+ end
78
+ end
79
+
80
+ context 'eine richtige Farbe am falschen Ort und zwei am richtigen Ort' do
81
+ subject { Mastermind::Game.new('abcf') }
82
+ before { subject.neuer_versuch('abfd') }
83
+
84
+ it 'Das Spiel ist nicht gewonnen' do
85
+ subject.gewonnen?.should == false
86
+ end
87
+
88
+ it 'Gibt einen weissen Pin und zwei shwarze' do
89
+ subject.letzte_wertung.should == ['w', 's', 's']
90
+ end
91
+ end
92
+
93
+ context 'alle Pins sind korrekt' do
94
+ subject { Mastermind::Game.new('abcf') }
95
+ before { subject.neuer_versuch('abcf') }
96
+
97
+ it 'Das Spiel ist gewonnen' do
98
+ subject.gewonnen?.should == true
99
+ end
100
+
101
+ it 'Gibt 4 schwarze Pins' do
102
+ subject.letzte_wertung.should == ['s', 's', 's', 's']
103
+ end
104
+ end
105
+ end
106
+
107
+ end
@@ -0,0 +1,2 @@
1
+ require 'rspec'
2
+ require 'mastermind'
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mastermind-cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Marcel Portillo
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '2.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '2.3'
30
+ description: Mastermind
31
+ email:
32
+ executables:
33
+ - mastermind
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - Gemfile
38
+ - Gemfile.lock
39
+ - bin/mastermind
40
+ - lib/mastermind.rb
41
+ - lib/mastermind/code_generator.rb
42
+ - lib/mastermind/console.rb
43
+ - lib/mastermind/game.rb
44
+ - spec/mastermind/code_generator_spec.rb
45
+ - spec/mastermind/game_spec.rb
46
+ - spec/mastermind_spec.rb
47
+ - spec/spec_helper.rb
48
+ homepage:
49
+ licenses: []
50
+ post_install_message:
51
+ rdoc_options:
52
+ - --charset=UTF-8
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ requirements: []
68
+ rubyforge_project:
69
+ rubygems_version: 1.8.24
70
+ signing_key:
71
+ specification_version: 3
72
+ summary: Mastermind
73
+ test_files:
74
+ - spec/mastermind/code_generator_spec.rb
75
+ - spec/mastermind/game_spec.rb
76
+ - spec/mastermind_spec.rb
77
+ - spec/spec_helper.rb