From cd4138624cea643e4a01f7c7b3d707546b7db29c Mon Sep 17 00:00:00 2001 From: Conor Walker <39270500+conor-walker@users.noreply.github.com> Date: Sun, 6 Feb 2022 18:33:18 +0000 Subject: [PATCH 1/2] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index bdf25c8..34ce6aa 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ A word game similar to Wordle, implemented in Python! - Randomly selects a 5 letter word from over 5000 possibilities - Tells you what letters are in the right position, which are present in the word but not in the right place, and which are not in the word at all - Seed-based, so the word is the same when run on a given day - just like the real thing! -- That's about it - it's fairly barebones as-is! +- Coloured output similar to the original game - with thanks to @sgoudham ## Prerequisites & Running To run from source, you'll need to have Python installed and accessible on your system. @@ -17,7 +17,6 @@ Compiled binaries are provided in the releases section for Windows and Unix syst ## Future I don't anticipate spending a huge amount of time on this in the near future, but small things I'd like to throw in are: -- Make the output slightly prettier, or as pretty as it can be in a terminal. No plans of making a full GUI version just yet! - Validate that users word is an actual real word ## License From 1dde14d435b57a3ea35c89fb1d208476bcebbbc7 Mon Sep 17 00:00:00 2001 From: Conor Walker <2089327w@student.gla.ac.uk> Date: Sun, 6 Feb 2022 18:53:50 +0000 Subject: [PATCH 2/2] Revert "Merge pull request #3 from sgoudham/rework" This reverts commit 754e6c34d985bdc740a373eb277cbb148f161c27, reversing changes made to 1c9ef1c2eeabe4ffd8e85c7990b70a6127f8066e. --- requirements.txt | Bin 36 -> 0 bytes src/pydle.py | 84 ++++++++++++++++------------------------------- 2 files changed, 29 insertions(+), 55 deletions(-) delete mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 56c59d16e9da4ca1f7c250e95b76664b2eede257..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36 jcmezWFPR~qAqR+y7!nzBf!G!Z4H)zoOu(3zfr|kEvIGXv diff --git a/src/pydle.py b/src/pydle.py index e000061..3f62320 100644 --- a/src/pydle.py +++ b/src/pydle.py @@ -3,12 +3,6 @@ import random import sys from datetime import date -from colorama import init, Fore - - -def add_colour(colour, uncoloured_string): # I COULD NOT RESIST NAMING IT THIS I'M SORRY - Goudham - return colour + uncoloured_string + Fore.RESET # Add the given colour and then resets it - Goudham - # Gets the input from a user - number param is used to display the guess number the user is on def get_guess(number): @@ -33,6 +27,7 @@ def resource_path(relative_path): # 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: @@ -44,8 +39,11 @@ def get_random_word(): # 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_to_guess, word_guessed): - return "".join(word_to_guess) == str(word_guessed).upper() # The 'word_to_guess' will now be a list - Goudham +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 # Makes a cool header. @@ -60,70 +58,50 @@ def header(): # Prints welcome messages def intro(): print("Welcome to...") - print(add_colour(Fore.MAGENTA, header())) # You could make this multicoloured - Goudham + 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! You figured it out!") # No need to display the word again? - Goudham + print("Congratulations! The word was", ''.join(correct_word).capitalize()) else: - print("Ran out of guesses! The word was:", add_colour(Fore.GREEN, ''.join(correct_word).capitalize())) + print("Ran out of guesses! The word was: ", "".join(correct_word)) input("Thanks for playing! Press ENTER to exit :)") sys.exit(0) -# Store how many times each letter appears in the word - Goudham -def count_letter_frequency(word): - letter_frequency = {} - for letter in word: - letter_frequency[letter] = letter_frequency[letter] + 1 if letter in letter_frequency else 1 - return letter_frequency - - -# Initialise the letter frequency map to count up the way as a letter is encountered out of position - Goudham -def initialise_letter_frequency(word): - letter_frequency = {} - for letter in word: - letter_frequency[letter] = 0 - return letter_frequency - - -# So this is like a massive rework right, it's basically like the actual wordle game with colouring - Goudham -def get_wordle_string(users_guess_input, word_to_be_guessed): - green_letter_map = count_letter_frequency(word_to_be_guessed) - yellow_letter_map = initialise_letter_frequency(word_to_be_guessed) - raw_letters = [] - wordle_string = [] - - # Doing a first pass to just check the correct letters and updating 'green_letter_map' - Goudham - for index, letter in enumerate(users_guess_input): - if word_to_be_guessed[index] == letter: - green_letter_map[letter] = green_letter_map[letter] - 1 - wordle_string.append(add_colour(Fore.GREEN, letter)) # Green if it's in the right place - Goudham +# 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: + present_in_word.add(users_guess_input[i]) else: - wordle_string.append(add_colour(Fore.LIGHTBLACK_EX, letter)) # Grey if it doesn't exist - Goudham - raw_letters.append(letter) - - # On the second pass, if there are any letters out of position using the knowledge from the first pass - Goudham - for index, letter in enumerate(raw_letters): - if letter in word_to_be_guessed and yellow_letter_map[letter] < green_letter_map[letter]: - yellow_letter_map[letter] = yellow_letter_map[letter] + 1 - wordle_string[index] = add_colour(Fore.YELLOW, letter) # Yellow if it's in the wrong position - Goudham - - return " ".join(wordle_string) # Return the list as string since no need to keep track of other lists - Goudham + 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) - print("Result:", get_wordle_string(users_guess_input, word_to_be_guessed)) # No need to pass in lists - if check_word_is_right(word_to_be_guessed, users_guess_input): + 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) @@ -134,8 +112,4 @@ def main(): if __name__ == '__main__': - # READ THIS -> I promise that this just started out with wanting to add colours... - # And then it just turned into a rework sorry :( - Goudham - - init() # Read -> https://pypi.org/project/colorama/ - Goudham main()