Created
September 23, 2015 22:39
-
-
Save BrianDunlap89/4a4a223519c8a16642a6 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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