Правила игры Палач приведены на его Wiki . Я предположил, что игрок пытается угадать слово теряет, когда все семь частей человека на виселице были нарисованы (голова, шея, левая рука, тело, правая рука, левая нога, правая нога).
Вспомогательные методы
Нарисуйте повешенного
Сначала создайте хеш, который можно использовать для рисования частичного или полного палача:
MAN = [" O\n", " |\n", "\\", "|", "/\n", " |\n/", " \\"].
map.each_with_object([""]) { |s,arr| arr << (arr.last + s) }.
each.with_index.with_object({}) { |(s,i),h| h[i] = s }
Ключами являются количество неверных догадок. Например:
puts MAN[2]
O
|
puts MAN[6]
O
|
\|/
|
/
Следите за положением букв слова
Затем создайте хэш, ключами которого являются уникальные буквы секретного слова и чьизначения - это массивы индексов расположения ключей в слове.
def construct_unknown(word)
word.each_char.with_index.with_object({}) { |(c,i),h| (h[c] ||= []) << i }
end
Например,
unknown = construct_unknown("beetle")
#=> {"b"=>[0], "e"=>[1, 2, 5], "t"=>[3], "l"=>[4]}
Мы также создадим пустой хэш для букв, позиции которых известны:
known = {}
Переместить угаданные буквы из хеша unknown
в хеш known
Если угаданная буква является ключом unknown
этот ключ и значение перемещаются в known
.
def move_unknown_to_known(letter, unknown, known)
known.update(letter=>unknown[letter])
unknown.delete(letter)
end
Например (для unknown
и known
и выше),
move_unknown_to_known("e", unknown, known)
unknown #=> {"b"=>[0], "t"=>[3], "l"=>[4]}
known #=> {"e"=>[1, 2, 5]}
Проверьте, является ли гадательвыиграл или проиграл
Мы определяем, когда, после угадывания буквы, игрок выиграл или проиграл или должен продолжить:
def win?(word_size, known)
known.values.flatten.sum == word_size
end
def lose?(wrong_guess_count)
wrong_guess_count == HANGMAN.size
end
Например,
win?(word.size, known)
#=> false
lose?(6) #=> false
lose?(7) #=> true
Отображение известных букв
def display_known(word_size, known)
known.each_with_object('_' * word_size) { |(k,a),s| a.each { |i| s[i] = k } }
end
Например (вспомните word #=> "beetle"
),
puts display_known(word.size, known)
_ee__e
Основной метод
МыТеперь вы готовы написать основной метод.
def hangman
puts "Player 2, please avert your eyes for a moment."
print "Player 1: enter a secret word with at least two letters: "
word = gets.chomp.downcase
unknown = construct_unknown(word)
known = {}
wrong_guess_count = 0
loop do
puts display_known(word.size, known)
puts MAN[wrong_guess_count] if wrong_guess_count > 0
if win?(word.size, known)
puts "You win! You win! Congratulations!"
break
end
if lose?(wrong_guess_count)
puts "Sorry, but you've run out of guesses"
break
end
print "Player 2: enter a letter or your guess of the word: "
guess = gets.chomp.downcase
if guess.size > 1
if guess == word
puts word
puts "You win! You win! Congratulations!"
break
else
puts "Sorry, that's not the word"
wrong_guess_count += 1
end
elsif unknown.key?(guess)
nbr = unknown[guess].size
puts nbr == 1 ? "There is 1 #{guess}" : "There are #{nbr} #{guess}'s"
move_unknown_to_known(guess, unknown, known)
else
puts "Sorry, the word contains no #{guess}'s"
wrong_guess_count += 1
end
end
end
Пример
После объяснения правил для двух игроков и аудитории, гостевой хост заканчивает словами, "И не забывайте, когда вы угадываете букву или слово, оно должно быть выражено как вопрос ... один момент ... держите это ... Мне сказали, что нет необходимости формулировать это как вопрос".
Предположим, что слово beetle
, а угаданные буквы: 't'
, 'i'
, 'a'
, 'l'
, 'r'
, 's'
, 't'
, 'u'
, 'e'
, 'beetle'
.
hangman
Player 2, please avert your eyes for a moment.
Player 1: enter a secret word with at least two letters: beetle
______
Player 2: enter a letter or your guess of the word: t
There is 1 t
___t__
Player 2: enter a letter or your guess of the word: i
Sorry, the word contains no i's
___t__
O
Player 2: enter a letter or your guess of the word: a
Sorry, the word contains no a's
___t__
O
|
Player 2: enter a letter or your guess of the word: l
There is 1 l
___tl_
O
|
Player 2: enter a letter or your guess of the word: r
Sorry, the word contains no r's
___tl_
O
|
\
Player 2: enter a letter or your guess of the word: s
Sorry, the word contains no s's
___tl_
O
|
\|
Player 2: enter a letter or your guess of the word: t
Sorry, the word contains no t's
___tl_
O
|
\|/
Player 2: enter a letter or your guess of the word: u
Sorry, the word contains no u's
___tl_
O
|
\|/
|
/
Player 2: enter a letter or your guess of the word: e
There are 3 e's
_eetle
O
|
\|/
|
/
Player 2: enter a letter or your guess of the word: beetle
beetle
You win! You win! Congratulations!