hangman 0.0.1 → 0.1.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.
@@ -1,63 +1,2 @@
1
- module Hangman
2
- class Clue
3
- # A list of letters in the order you should try them
4
- # Note that the order may change based on the next letter so the
5
- # only signinficant item, in ths list is the first one
6
- attr_reader :guesses
7
- # A list of words that could be the solution
8
- attr_reader :possible_words
9
-
10
- # Create a new clue
11
- # the clue format is a string with underscores for unknown letters
12
- # Example: "he__o"
13
- # The wrong letters is a list of letters that were guessed but aren't correct
14
- def initialize(clue, wrong_letters)
15
- @clue = clue.to_s.downcase
16
- @wrong_letters = wrong_letters
17
- @letter_counts = {}
18
- @possible_words = []
19
- @used_letters = @clue.split(//).reject { |c| c == "_" }
20
- end
21
-
22
- # Pass a list of words to this method to come up wth the best next guess
23
- # It will return true if there are any potential guesses
24
- # You can call this method multiple times on a single Clue (if you have multiple wordlists this may be helpful)
25
- def solve(words)
26
- length = @clue.length
27
-
28
- words.each do |w|
29
- w = w.chomp.downcase
30
- next if w.size != length
31
- next if @wrong_letters.any? { |c| w.include? c }
32
-
33
- if match_word w
34
- @possible_words << w
35
- end
36
- end
37
- @guesses = @letter_counts.sort{ |a,b| b[1] <=> a[1] }.map{ |e| e[0] }
38
-
39
- return !@guesses.empty?
40
- end
41
-
42
- private
43
-
44
- def match_word(w)
45
- wcount = {}
46
- @clue.each_char.with_index do |c, i|
47
- if c == '_'
48
- if @used_letters.include? w[i]
49
- return false
50
- end
51
- wcount[w[i]] = 1 # equals instead of += because we want unique per word
52
- elsif w[i] != c
53
- return false
54
- end
55
- end
56
-
57
- @letter_counts.merge! wcount do |k, o, n|
58
- o + n
59
- end
60
- true
61
- end
62
- end
63
- end
1
+ require_relative 'hangman/clue'
2
+ require_relative 'hangman/game'
@@ -0,0 +1,63 @@
1
+ module Hangman
2
+ class Clue
3
+ # A list of letters in the order you should try them
4
+ # Note that the order may change based on the next letter so the
5
+ # only signinficant item, in ths list is the first one
6
+ attr_reader :guesses
7
+ # A list of words that could be the solution
8
+ attr_reader :possible_words
9
+
10
+ # Create a new clue
11
+ # the clue format is a string with underscores for unknown letters
12
+ # Example: "he__o"
13
+ # The wrong letters is a list of letters that were guessed but aren't correct
14
+ def initialize(clue, wrong_letters)
15
+ @clue = clue.to_s.downcase
16
+ @wrong_letters = wrong_letters
17
+ @letter_counts = {}
18
+ @possible_words = []
19
+ @used_letters = @clue.split(//).reject { |c| c == "_" }
20
+ end
21
+
22
+ # Pass a list of words to this method to come up wth the best next guess
23
+ # It will return true if there are any potential guesses
24
+ # You can call this method multiple times on a single Clue (if you have multiple wordlists this may be helpful)
25
+ def solve(words)
26
+ length = @clue.length
27
+
28
+ words.each do |w|
29
+ w = w.chomp.downcase
30
+ next if w.size != length
31
+ next if @wrong_letters.any? { |c| w.include? c }
32
+
33
+ if match_word w
34
+ @possible_words << w
35
+ end
36
+ end
37
+ @guesses = @letter_counts.sort{ |a,b| b[1] <=> a[1] }.map{ |e| e[0] }
38
+
39
+ return !@guesses.empty?
40
+ end
41
+
42
+ private
43
+
44
+ def match_word(w)
45
+ wcount = {}
46
+ @clue.each_char.with_index do |c, i|
47
+ if c == '_'
48
+ if @used_letters.include? w[i]
49
+ return false
50
+ end
51
+ wcount[w[i]] = 1 # equals instead of += because we want unique per word
52
+ elsif w[i] != c
53
+ return false
54
+ end
55
+ end
56
+
57
+ @letter_counts.merge! wcount do |k, o, n|
58
+ o + n
59
+ end
60
+ true
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,48 @@
1
+ module Hangman
2
+ class Game
3
+ # The word to guess
4
+ attr_reader :word
5
+ # A list of wrong characters guessed
6
+ attr_reader :wrong
7
+ # A list of correct characters guessed
8
+ attr_reader :correct
9
+ # The number of incorrect guesses
10
+ attr_reader :wrong_guesses
11
+
12
+ # Set the word this puzzle wil be for
13
+ def initialize(word)
14
+ @word = word
15
+ @wrong = []
16
+ @correct = []
17
+ @wrong_guesses = 0
18
+ end
19
+
20
+ # Guess a letter for the puzzle
21
+ def guess(c)
22
+ c = c.to_s.chr.upcase
23
+ if @word.upcase.include? c
24
+ if not @correct.include? c
25
+ @correct << c
26
+ end
27
+ true
28
+ else
29
+ if not @wrong.include? c
30
+ @wrong << c
31
+ @wrong_guesses += 1
32
+ end
33
+ false
34
+ end
35
+ end
36
+
37
+ # Whether or not the puzzle is completed
38
+ def solved?
39
+ @word.upcase.each_char.all? { |c| @correct.include? c }
40
+ end
41
+
42
+ # The word with only the correct guesses given. Others will be shown as '_'
43
+ def to_s
44
+ # There is probably a better way to do this...
45
+ @word.upcase.each_char.map { |c| @correct.include?(c) ? c : '_' }.join
46
+ end
47
+ end
48
+ end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 0
8
7
  - 1
9
- version: 0.0.1
8
+ - 1
9
+ version: 0.1.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Ben Olive
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-01-04 00:00:00 -05:00
17
+ date: 2011-01-27 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -28,6 +28,8 @@ extra_rdoc_files: []
28
28
 
29
29
  files:
30
30
  - bin/hangman
31
+ - lib/hangman/clue.rb
32
+ - lib/hangman/game.rb
31
33
  - lib/hangman.rb
32
34
  has_rdoc: true
33
35
  homepage: http://github.com/sionide21/Hangman