Skip to content

Instantly share code, notes, and snippets.

@daneah
Last active December 4, 2018 14:43
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save daneah/303cf0d6650e50d721d75bf3afbebd22 to your computer and use it in GitHub Desktop.
Save daneah/303cf0d6650e50d721d75bf3afbebd22 to your computer and use it in GitHub Desktop.
Hangman
#!/usr/bin/env python
import os
import pathlib
import random
DICTIONARY = 'popular-words.txt'
DIFFICULTY_LEVEL = 3
NUM_TRIES_OFFSET = 2
def build_guess_string(word, guessed_letters):
return ' '.join([char if char in guessed_letters else '_' for char in word])
def get_words():
with open(DICTIONARY) as words_file:
return words_file.readlines()
def get_a_word(all_words):
return random.choice(all_words).strip().upper()
def determine_number_of_allowed_guesses(word):
num_distinct_letters = len(set(word))
return (num_distinct_letters // DIFFICULTY_LEVEL) + NUM_TRIES_OFFSET
def guess_format_is_valid(guess):
return len(guess) == 1 and not guess.isspace()
def guess_was_good(guess, guessed_letters, word):
good = guess in word or guess in guessed_letters
guessed_letters.add(guess)
return good
def did_win(guessed_letters, word):
if all(char in guessed_letters for char in word):
print(f'\n{build_guess_string(word, guessed_letters)}')
print('\nYAY')
return True
else:
return False
def did_lose(tries_left, word):
if tries_left == 0:
print(f'\nYOU LOSE. The word was {word}')
return True
else:
return False
def play_a_round(tries_left, word, guessed_letters, message):
print(f'\n{build_guess_string(word, guessed_letters)}')
wrong_letters = ' '.join(letter for letter in guessed_letters if letter not in word)
if wrong_letters:
print(f'\n\033[09m{wrong_letters}\033[0m')
plural = 'es' if tries_left > 1 else ''
guess = input(f'\n{message} You have {tries_left} guess{plural} left. Pick a letter: ').upper()
if guess_format_is_valid(guess):
if guess_was_good(guess, guessed_letters, word):
return False, 'Nice!'
else:
return True, f'{guess} is not in the word!'
else:
return False, f'{guess} is not a valid guess!'
def clear():
if os.name == 'nt':
os.system('cls')
else:
os.system('clear')
def hangman():
message = 'Hello!'
guessed_letters = set()
words = get_words()
word = get_a_word(words)
tries_left = determine_number_of_allowed_guesses(word)
while not did_lose(tries_left, word):
clear()
was_wrong_guess, message = play_a_round(tries_left, word, guessed_letters, message)
if was_wrong_guess:
tries_left -= 1
elif did_win(guessed_letters, word):
return
if __name__ == '__main__':
hangman()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment