Skip to content

Instantly share code, notes, and snippets.

@BrianDunlap89
Created September 23, 2015 22:39
Show Gist options
  • Select an option

  • Save BrianDunlap89/4a4a223519c8a16642a6 to your computer and use it in GitHub Desktop.

Select an option

Save BrianDunlap89/4a4a223519c8a16642a6 to your computer and use it in GitHub Desktop.
require "pry"
require "set"
word_list = [
"chicken", "dog", "duck", "cat", "clown", "brick",
"bananas", "totalitarianism", "Wednesday", "chicanery",
"ruby", "evaluation", "consternation"
]
MAX_TURNS = 6
answer = word_list.sample.downcase
def turns_left(current_guesses, answer)
answer_set = answer.chars.to_set
wrong_guesses = current_guesses.difference(answer_set).count
MAX_TURNS - wrong_guesses
end
def greeting
puts "\nWelcome to Hangman!\n "
puts "It's so simple, I'm not even going to explain it."
puts "You just guess a letter, dummi.\n "
end
def game_over?(answer, current_guesses)
turns_left(current_guesses, answer).zero? || win?(answer, current_guesses)
end
def show_progress(partial_word, answer, current_guesses)
turns_remaining = turns_left(current_guesses, answer)
puts
puts "The current word is: #{partial_word}"
puts "You have #{turns_remaining} guesses left."
end
def prompt_player(player1, player2, current_player)
puts
if current_player == player1
puts "#{player1}, please guess a letter: "
else
puts "#{player2}, please guess a letter: "
end
guess = gets.chomp
unless ('a'..'z').to_a.include?(guess)
puts "#{guess} is not a valid character. Please guess a single letter:"
guess = gets.chomp
end
guess
end
def make_partial(current_guesses, answer)
answer.chars.map do |letter|
if current_guesses.include?(letter)
letter
else
"_"
end
end
end
def win?(answer, current_guesses)
answer_set = answer.chars.to_set
current_guesses >= answer_set # contents of guesses is greater than or equal to
# the contents of answer_set
end
# Variants:
# guesses.superset?(answer_set)
# answer_set.subset?(guesses)
# answer.chars.all? do |letter|
# guesses.include?(letter)
# winner = true
# answer.chars.each do |letter|
# winner = false unless guesses.include?(letter)
# end
# winner
def take_turn(current_guesses, answer, player1, player2, current_player)
partial_word = make_partial(current_guesses, answer).join
show_progress(partial_word, answer, current_guesses) # Could also do partial_word.join
prompt_player(player1, player2, current_player)
end
def play_again?(word_list)
response = feedback
until response == "N"
hangman(word_list.sample)
response = feedback
end
puts "\nGoodbye!"
end
def feedback
puts "\nWould you like to play again? 'Y'es or 'N'o."
gets.chomp.upcase
end
def postmortem(answer, current_guesses, player1, player2)
if win?(answer, current_guesses) && current_player = player1
puts "\nNice work, #{player1}! You win."
puts "Haha, #{player2}! You lose! The word was #{answer}, you imbecile."
else
puts "\nNice work, #{player2}! You win."
puts "Haha, #{player1}! You lose! The word was #{answer}, you imbecile."
end
end
def hangman(answer)
p1_guesses = Set.new
p2_guesses = Set.new
greeting
puts "Player 1, please provide your name: "
player1 = gets.chomp
puts "\nPlayer 2, please provide your name: "
player2 = gets.chomp
current_guesses = p1_guesses
current_player = player1
until game_over?(answer, current_guesses)
guess = take_turn(current_guesses, answer, player1, player2, current_player)
current_guesses.add(guess)
if current_player == player1
current_player = player2
current_guesses = p2_guesses
else
current_player = player1
current_guesses = p1_guesses
end
end
postmortem(answer, current_guesses, player1, player2)
end
hangman(answer)
play_again?(word_list)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment