cinch_hangman 0.0.2 → 0.0.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.
- data/lib/cinch/plugins/hangman.rb +3 -43
- data/lib/cinch_hangman/game.rb +33 -0
- data/lib/cinch_hangman/version.rb +1 -1
- data/lib/cinch_hangman.rb +1 -0
- data/spec/game_spec.rb +111 -0
- metadata +11 -10
- data/spec/hangman_spec.rb +0 -83
@@ -1,11 +1,10 @@
|
|
1
1
|
module Cinch::Plugins
|
2
2
|
class Hangman
|
3
3
|
include Cinch::Plugin
|
4
|
-
match /hang
|
5
|
-
match /hang new (
|
6
|
-
match /hang status/i, :method => :status
|
4
|
+
match /hang (.*)/i, :method => :guess
|
5
|
+
match /hang new (#\S*) (.*)/i, :method => :new_game
|
7
6
|
def new_game(m, channel, answer)
|
8
|
-
@game = Game.new(answer)
|
7
|
+
@game = CinchHangman::Game.new(answer)
|
9
8
|
Channel(channel).send(@game.describe)
|
10
9
|
end
|
11
10
|
def guess(m, guess)
|
@@ -16,43 +15,4 @@ module Cinch::Plugins
|
|
16
15
|
m.reply @game.describe
|
17
16
|
end
|
18
17
|
end
|
19
|
-
class Game
|
20
|
-
def initialize(answer, max_guesses = 6)
|
21
|
-
@answer = answer
|
22
|
-
@max_guesses = max_guesses
|
23
|
-
@correct_chars = Set.new
|
24
|
-
@incorrect_guesses = []
|
25
|
-
end
|
26
|
-
def guess(guess)
|
27
|
-
if @answer.include?(guess)
|
28
|
-
@correct_chars.merge(guess.chars)
|
29
|
-
else
|
30
|
-
@incorrect_guesses << guess
|
31
|
-
end
|
32
|
-
end
|
33
|
-
def describe
|
34
|
-
if @correct_chars.empty? && @incorrect_guesses.empty?
|
35
|
-
"(#{hint}) a new hangman riddle has started."
|
36
|
-
elsif won
|
37
|
-
"(#{hint}) that hangman riddle was solved, awesome!"
|
38
|
-
elsif lost
|
39
|
-
"(#{hint}) that hangman riddle was just too difficult, that sucks!"
|
40
|
-
else
|
41
|
-
"(#{hint}) #{guesses_left} guesses left on the current hangman riddle."
|
42
|
-
end
|
43
|
-
end
|
44
|
-
def won
|
45
|
-
@correct_chars.superset?(Set.new(@answer.chars))
|
46
|
-
end
|
47
|
-
def lost
|
48
|
-
guesses_left == 0
|
49
|
-
end
|
50
|
-
def guesses_left
|
51
|
-
@max_guesses - @incorrect_guesses.size
|
52
|
-
end
|
53
|
-
def hint
|
54
|
-
@answer.chars.map { |char| @correct_chars.include?(char) ? char : "_" }.join(" ")
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|
58
18
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module CinchHangman
|
2
|
+
class Game
|
3
|
+
MASK = "_"
|
4
|
+
def initialize(answer, max_guesses = 6)
|
5
|
+
@answer = answer.downcase
|
6
|
+
@max_guesses = max_guesses
|
7
|
+
@guesses = ""
|
8
|
+
end
|
9
|
+
def guess(guess)
|
10
|
+
@guesses << guess.downcase.gsub(/[^a-z]/, "")
|
11
|
+
end
|
12
|
+
def describe
|
13
|
+
if @guesses.empty?
|
14
|
+
"(#{hint}) hangman started."
|
15
|
+
elsif solved
|
16
|
+
"(#{@answer}) was solved!"
|
17
|
+
elsif guesses_left <= 0
|
18
|
+
"(#{@answer}) was too difficult!"
|
19
|
+
else
|
20
|
+
"(#{hint}) #{guesses_left} guesses left."
|
21
|
+
end
|
22
|
+
end
|
23
|
+
def solved
|
24
|
+
!hint.include?(MASK)
|
25
|
+
end
|
26
|
+
def guesses_left
|
27
|
+
@max_guesses - @guesses.gsub(/[#{@answer}]/, "").size
|
28
|
+
end
|
29
|
+
def hint
|
30
|
+
@answer.gsub(/[^\s#{@guesses}]/, MASK)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/cinch_hangman.rb
CHANGED
data/spec/game_spec.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), '..')
|
4
|
+
|
5
|
+
require 'cinch'
|
6
|
+
require 'cinch_hangman'
|
7
|
+
|
8
|
+
describe CinchHangman::Game do
|
9
|
+
subject do
|
10
|
+
CinchHangman::Game.new("oh")
|
11
|
+
end
|
12
|
+
it 'should have a start' do
|
13
|
+
subject.describe.should match /hangman.*started/
|
14
|
+
end
|
15
|
+
describe 'guesses' do
|
16
|
+
describe 'ignore' do
|
17
|
+
it 'digits' do
|
18
|
+
subject.guess("x3")
|
19
|
+
subject.describe.should include '5 guesses'
|
20
|
+
end
|
21
|
+
it 'whitespace' do
|
22
|
+
subject.guess("c a t")
|
23
|
+
subject.describe.should include '3 guesses'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
describe 'correct' do
|
27
|
+
it 'when containing a single character from the answer' do
|
28
|
+
subject.guess("h")
|
29
|
+
subject.describe.should include '6 guesses'
|
30
|
+
end
|
31
|
+
it 'when containing a single character from the answer in the wrong case' do
|
32
|
+
subject.guess("H")
|
33
|
+
subject.describe.should include '6 guesses'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
describe 'incorrect' do
|
37
|
+
it 'when containing a single character not in the answer' do
|
38
|
+
subject.guess("x")
|
39
|
+
subject.describe.should include '5 guesses'
|
40
|
+
end
|
41
|
+
it 'when containing multiple characters not in the answer' do
|
42
|
+
subject.guess("cat")
|
43
|
+
subject.describe.should include '3 guesses'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
describe 'hints' do
|
48
|
+
it 'show the number of letters in the answer' do
|
49
|
+
subject.describe.should include '__'
|
50
|
+
end
|
51
|
+
it 'show letters that have been guessed correctly' do
|
52
|
+
subject.guess("h")
|
53
|
+
subject.describe.should include '_h'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
describe 'winning' do
|
57
|
+
it 'occurs when the answer is guessed using individual characters' do
|
58
|
+
subject.guess("o")
|
59
|
+
subject.guess("h")
|
60
|
+
subject.describe.should include 'solved!'
|
61
|
+
end
|
62
|
+
it 'occurs when the answer is guessed in one go' do
|
63
|
+
subject.guess("oh")
|
64
|
+
subject.describe.should include 'solved!'
|
65
|
+
end
|
66
|
+
it 'occurs when the answer is given with a mixture of approaches' do
|
67
|
+
subject.guess("o")
|
68
|
+
subject.guess("oh")
|
69
|
+
subject.describe.should include 'solved!'
|
70
|
+
end
|
71
|
+
it 'occurs no matter what order guesses are given' do
|
72
|
+
subject.guess("h")
|
73
|
+
subject.guess("o")
|
74
|
+
subject.describe.should include 'solved!'
|
75
|
+
end
|
76
|
+
it 'should not be automatic for hassox' do
|
77
|
+
subject = CinchHangman::Game.new("hassox")
|
78
|
+
subject.guess("s")
|
79
|
+
subject.describe.should_not include 'solved!'
|
80
|
+
end
|
81
|
+
it 'should ignore answer case' do
|
82
|
+
subject = CinchHangman::Game.new("WoW")
|
83
|
+
subject.guess("wow")
|
84
|
+
subject.describe.should include 'solved!'
|
85
|
+
end
|
86
|
+
it 'should ignore whitespace' do
|
87
|
+
subject = CinchHangman::Game.new("oh my")
|
88
|
+
subject.guess("ohmy")
|
89
|
+
subject.describe.should include 'solved!'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
describe 'losing' do
|
93
|
+
before do
|
94
|
+
6.times do
|
95
|
+
subject.guess("z")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
it 'occurs when all the guesses run out' do
|
99
|
+
subject.describe.should include 'too difficult!'
|
100
|
+
end
|
101
|
+
it 'is permanent' do
|
102
|
+
2.times do
|
103
|
+
subject.guess("z")
|
104
|
+
end
|
105
|
+
subject.describe.should include 'too difficult!'
|
106
|
+
end
|
107
|
+
it 'informs players of the answer' do
|
108
|
+
subject.describe.should include 'oh'
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cinch_hangman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-09-
|
12
|
+
date: 2011-09-10 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cinch
|
16
|
-
requirement: &
|
16
|
+
requirement: &2151891120 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2151891120
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &2151888940 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2151888940
|
36
36
|
description:
|
37
37
|
email:
|
38
38
|
- shanonmcquay@gmail.com
|
@@ -46,8 +46,9 @@ files:
|
|
46
46
|
- cinch_hangman.gemspec
|
47
47
|
- lib/cinch/plugins/hangman.rb
|
48
48
|
- lib/cinch_hangman.rb
|
49
|
+
- lib/cinch_hangman/game.rb
|
49
50
|
- lib/cinch_hangman/version.rb
|
50
|
-
- spec/
|
51
|
+
- spec/game_spec.rb
|
51
52
|
homepage: https://github.com/compactcode/cinch_hangman
|
52
53
|
licenses: []
|
53
54
|
post_install_message:
|
@@ -62,7 +63,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
62
63
|
version: '0'
|
63
64
|
segments:
|
64
65
|
- 0
|
65
|
-
hash:
|
66
|
+
hash: -899560349152351154
|
66
67
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
68
|
none: false
|
68
69
|
requirements:
|
@@ -71,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
72
|
version: '0'
|
72
73
|
segments:
|
73
74
|
- 0
|
74
|
-
hash:
|
75
|
+
hash: -899560349152351154
|
75
76
|
requirements: []
|
76
77
|
rubyforge_project: cinch_hangman
|
77
78
|
rubygems_version: 1.8.6
|
@@ -79,4 +80,4 @@ signing_key:
|
|
79
80
|
specification_version: 3
|
80
81
|
summary: Let your IRC bot conduct a game of hangman.
|
81
82
|
test_files:
|
82
|
-
- spec/
|
83
|
+
- spec/game_spec.rb
|
data/spec/hangman_spec.rb
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
|
3
|
-
$:.unshift File.join(File.dirname(__FILE__), '..')
|
4
|
-
|
5
|
-
require 'cinch'
|
6
|
-
require 'cinch_hangman'
|
7
|
-
|
8
|
-
describe Cinch::Plugins::Game do
|
9
|
-
subject do
|
10
|
-
Cinch::Plugins::Game.new("oh")
|
11
|
-
end
|
12
|
-
describe 'game' do
|
13
|
-
it 'should have a start' do
|
14
|
-
subject.describe.should include 'new hangman'
|
15
|
-
end
|
16
|
-
describe 'guesses' do
|
17
|
-
describe 'correct' do
|
18
|
-
it 'when containing a single character in the answer' do
|
19
|
-
subject.guess("h")
|
20
|
-
subject.describe.should include '6 guesses'
|
21
|
-
end
|
22
|
-
end
|
23
|
-
describe 'incorrect' do
|
24
|
-
it 'when containing a single character not in the answer' do
|
25
|
-
subject.guess("x")
|
26
|
-
subject.describe.should include '5 guesses'
|
27
|
-
end
|
28
|
-
it 'when containing a word not in the answer' do
|
29
|
-
subject.guess("lol")
|
30
|
-
subject.describe.should include '5 guesses'
|
31
|
-
end
|
32
|
-
it 'when containing the correct answer in reverse' do
|
33
|
-
subject.guess("ho")
|
34
|
-
subject.describe.should include '5 guesses'
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
describe 'hints' do
|
39
|
-
it 'show the number of letters in the answer' do
|
40
|
-
subject.guess("x")
|
41
|
-
subject.describe.should include '_ _'
|
42
|
-
end
|
43
|
-
it 'show letters that have been guessed correctly' do
|
44
|
-
subject.guess("h")
|
45
|
-
subject.describe.should include '_ h'
|
46
|
-
end
|
47
|
-
end
|
48
|
-
describe 'winning' do
|
49
|
-
it 'occurs when the answer is guessed using individual characters' do
|
50
|
-
subject.guess("o")
|
51
|
-
subject.guess("h")
|
52
|
-
subject.describe.should include 'awesome!'
|
53
|
-
end
|
54
|
-
it 'occurs when the answer is guessed in one go' do
|
55
|
-
subject.guess("oh")
|
56
|
-
subject.describe.should include 'awesome!'
|
57
|
-
end
|
58
|
-
it 'occurs when the answer is given with a mixture of approaches' do
|
59
|
-
subject.guess("o")
|
60
|
-
subject.guess("oh")
|
61
|
-
subject.describe.should include 'awesome!'
|
62
|
-
end
|
63
|
-
it 'occurs no matter what order guesses are given' do
|
64
|
-
subject.guess("h")
|
65
|
-
subject.guess("o")
|
66
|
-
subject.describe.should include 'awesome!'
|
67
|
-
end
|
68
|
-
it 'should not be automatic for hassox' do
|
69
|
-
subject = Cinch::Plugins::Game.new("hassox")
|
70
|
-
subject.guess("s")
|
71
|
-
subject.describe.should_not include 'awesome!'
|
72
|
-
end
|
73
|
-
end
|
74
|
-
describe 'losing' do
|
75
|
-
it 'occurs when all the guesses run out' do
|
76
|
-
6.times do
|
77
|
-
subject.guess("z")
|
78
|
-
end
|
79
|
-
subject.describe.should include 'sucks!'
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|