Skip to content

Instantly share code, notes, and snippets.

@Joeventures
Created September 24, 2015 12:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Joeventures/e2e208be08f067990044 to your computer and use it in GitHub Desktop.
Save Joeventures/e2e208be08f067990044 to your computer and use it in GitHub Desktop.
Hard Mode answer
require "pry"
require "set"
word_list = [
"acres", "adult", "advice", "arrangement", "attempt",
"august", "autumn", "border", "breeze",
"brick", "calm", "canal", "casey",
"cast", "chose", "claws", "coach",
"constantly", "contrast", "cookies", "customs",
"damage", "danny", "deeply", "depth",
"discussion", "doll", "donkey", "egypt",
"ellen", "essential", "exchange", "exist",
"explanation", "facing", "film", "finest",
"fireplace", "floating", "folks", "fort",
"garage", "grabbed", "grandmother", "habit",
"happily", "harry", "heading", "hunter",
"illinois", "image", "independent", "instant",
"january", "kids", "label", "lee",
"lungs", "manufacturing", "martin", "mathematics",
"melted", "memory", "mill", "mission",
"monkey", "mount", "mysterious", "neighborhood",
"norway", "nuts", "occasionally", "official",
"ourselves", "palace", "pennsylvania", "philadelphia",
"plates", "poetry", "policeman", "positive",
"possibly", "practical", "pride", "promised",
"recall", "relationship", "remarkable", "require",
"rhyme", "rocky", "rubbed", "rush",
"sale", "satellites", "satisfied", "scared",
"selection", "shake", "shaking", "shallow",
"shout", "silly", "simplest", "slight",
"slip", "slope", "soap","solar",
"species", "spin", "stiff", "swung",
"tales", "thumb", "tobacco", "toy",
"trap", "treated", "tune", "university",
"vapor", "vessels", "wealth", "wolf", "zoo"
]
MAX_TURNS = 6
answer = word_list.sample
def greeting
puts "Welcome to the game of Hangman!\n\n"
puts "1 or 2 players?"
num_players = gets.chomp.to_i
until (1..2).to_a.include?(num_players)
puts "How many players? 1 or 2?"
num_players = gets.chomp.to_i
end
num_players
end
def game_over?(answer, guesses)
turns_left(guesses, answer).zero? || win?(answer, guesses)
end
def show_progress(partial_word, answer, guesses)
turns_remaining = turns_left(guesses, answer)
puts
puts "The current word is: #{partial_word}"
puts "You have #{turns_remaining} guesses left."
end
def prompt_player
puts
puts "Please guess a letter: "
letter = gets.chomp
until ('a'..'z').to_a.include?(letter)
puts "#{letter} is not a single lowercase letter. Please guess again: "
letter = gets.chomp
end
letter
end
def make_partial(guesses, answer)
# blank a letter in the answer if it isn't in the guesses
# binding.pry
answer.chars.map do |letter|
if guesses.include?(letter)
letter
else
"-"
end
end
end
def take_turn(guesses, answer)
partial_word = make_partial(guesses, answer).join
show_progress(partial_word, answer, guesses)
prompt_player
end
def win?(answer, guesses)
answer_set = answer.chars.to_set
# guesses.superset?(answer_set)
guesses >= answer_set
end
def postmortem(answer, guesses)
if win?(answer, guesses)
puts "Nice work! You win."
else
puts "The word was #{answer}. Better luck next time."
end
end
def turns_left(guesses, answer)
answer_set = answer.chars.to_set
wrong_guesses = (guesses - answer_set).count
# wrong_guesses = guesses.difference(answer_set).count
MAX_TURNS - wrong_guesses
end
def get_player_names(num_players)
puts "Player 1 Name:"
player1 = gets.chomp
if num_players == 2
puts "Player 2 Name:"
player2 = gets.chomp
end
if player1 == player2
player1 += " #1"
player2 += " #2"
end
[player1, player2]
end
def switch_players(current_player, num_players)
current_player == 0 && num_players == 2 ? 1 : 0
end
def hangman(answer)
guesses = Set.new
wrong = true
num_players = greeting
players = get_player_names(num_players)
current_player = 1
until game_over?(answer, guesses)
player1_guesses = guesses if current_player == 0
player2_guesses = guesses if current_player == 1
if wrong == true
current_player = switch_players(current_player, num_players)
puts "\n" * 20
puts "Your Turn, #{players[current_player]}"
else
puts "Good answer! Go again."
end
if current_player == 0
guesses = player1_guesses
else
guesses = player2_guesses
end
guesses = Set.new if guesses == nil
turns_remaining = turns_left(guesses, answer)
guess = take_turn(guesses, answer)
guesses.add(guess)
if turns_left(guesses,answer) < turns_remaining
wrong = true
else
wrong = false
end
end
postmortem(answer, guesses)
end
def play_again?
puts "Would you like to play again? (y/n)"
gets.chomp
end
def play_hangman(words)
answer = words.sample
hangman(answer)
end
def play(words)
play_hangman(words)
choice = play_again?
until choice == "n"
play_hangman(words)
choice = play_again?
end
end
play(word_list)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment