diff --git a/src/pydle.py b/src/pydle.py index 10c7baf..3f62320 100644 --- a/src/pydle.py +++ b/src/pydle.py @@ -1,9 +1,11 @@ import os import random import sys +from datetime import date -def getGuess(number): +# Gets the input from a user - number param is used to display the guess number the user is on +def get_guess(number): validGuess = False guess = "" while not validGuess: @@ -21,23 +23,30 @@ def resource_path(relative_path): return os.path.join(base_path, relative_path) -def getWord(): - lines = open(resource_path('words.txt')).read().splitlines() - return random.choice(lines) +# Gets a random word from a words.txt file present in the same directory as this script. +# If file is not present, uses a small fallback list of words. +# Shuffles based on a seed and selects a consistent member of the list to allow consistency between runs on same day. +def get_random_word(): + lines = [] + try: + lines = open(resource_path('words.txt')).read().splitlines() + except IOError: + lines = ["Arrow", "Pride", "Whole", "React", "Chose", "Quote", "Adieu", "Story", "Whale", "Musty", "Korea", + "Snide", "Zebra", "Shite", "Plans", "Bride", "Blare", "Child", "Towns", "Treat", "Lusty", "Ocean"] + random.seed(int(date.today().day)) + random.shuffle(lines) + return lines[1] -def checkRight(wordToGuess, guessSoFar): - if str(wordToGuess).upper() == str(guessSoFar).upper(): +# Compares the users input with the word to be guessed. Returns true if the guess is correct, false otherwise +def check_word_is_right(word_guessed, word_to_guess): + if str(word_guessed).upper() == str(word_to_guess).upper(): return True else: return False - -def quit(): - input("Thanks for playing! Press ENTER to exit :)") - sys.exit(0) - +# Makes a cool header. def header(): return r" ______ ______ _ _____" + "\n" + \ r"| _ \ \ / / _ \| | | ____|" + "\n" + \ @@ -46,35 +55,61 @@ def header(): r"|_| |_| |____/|_____|_____|" -print("Welcome to...") -print(header()) -print("A totally original guessing game!") -emptyWordGuess = ["_"] * 5 -wrongLetters, rightLettersWrongPlace = set() -wordToGuess = list(getWord().upper()) -# print(wordToGuess) - -counter = 1 -while counter < 6: - userGuess = getGuess(counter) - emptyWordGuess = ["_"] * 5 - for i in range(len(userGuess)): - if wordToGuess[i] == userGuess[i]: - emptyWordGuess[i] = userGuess[i] - elif userGuess[i] in wordToGuess: - if userGuess[i] in emptyWordGuess and userGuess[i] not in wordToGuess[i:]: +# Prints welcome messages +def intro(): + print("Welcome to...") + print(header()) + print("A totally original guessing game!") + + +# Prints the results, a thank-you message and gracefully exits +def game_over(user_was_right, correct_word): + if user_was_right: + print("Congratulations! The word was", ''.join(correct_word).capitalize()) + else: + print("Ran out of guesses! The word was: ", "".join(correct_word)) + input("Thanks for playing! Press ENTER to exit :)") + sys.exit(0) + + +# Takes in the users guess and the myriad lists involved in the game logic, and compares the letters in the guess +# with the word to be guessed. +# Inserts the letter into the appropriate list, based on its presence & position (or lack thereof) +def check_letter_in_word(users_guess_input, word_to_be_guessed, users_guess_results, present_in_word, not_in_word): + for i in range(len(users_guess_input)): + if word_to_be_guessed[i] == users_guess_input[i]: + users_guess_results[i] = users_guess_input[i] + elif users_guess_input[i] in word_to_be_guessed: + if users_guess_input[i] in users_guess_results and users_guess_input[i] not in word_to_be_guessed[i:]: break else: - rightLettersWrongPlace.add(userGuess[i]) + present_in_word.add(users_guess_input[i]) else: - wrongLetters.add(userGuess[i]) - if checkRight(wordToGuess, emptyWordGuess): - print("Congratulations! The word was", ''.join(wordToGuess).capitalize()) - quit() - print("Incorrect letters: " + ', '.join(wrongLetters)) - print("Correct letters in the wrong place: " + ', '.join(rightLettersWrongPlace)) - print("Result: " + " ".join(emptyWordGuess)) - counter += 1 - -print("Ran out of guesses! The word was: ", "".join(wordToGuess)) -quit() + not_in_word.add(users_guess_input[i]) + + +# Main game flow. +def game_logic(): + not_in_word, present_in_word = set(), set() + word_to_be_guessed = list(get_random_word().upper()) + counter = 1 + while counter < 7: + users_guess_input = get_guess(counter) + users_guess_results = ["_"] * 5 + check_letter_in_word(users_guess_input, word_to_be_guessed, users_guess_results, present_in_word, not_in_word) + if check_word_is_right(word_to_be_guessed, users_guess_results): + game_over(True, word_to_be_guessed) + print("Incorrect letters: " + ', '.join(not_in_word)) + print("Correct letters in the wrong place: " + ', '.join(present_in_word)) + print("Result: " + " ".join(users_guess_results)) + counter += 1 + game_over(False, word_to_be_guessed) + + +def main(): + intro() + game_logic() + + +if __name__ == '__main__': + main()