""" Python 3 implementation of a popular 2022 word game by CMG Lee licensed under CC-BY-SA 4.0 Usage: python3 pyordle.py [GAME_MODE] [0 for no GUI or 1 to use tkinter] [ANSWER for testing] where GAME_MODE is one of game: Player guesses a word computer picks hint: Player guesses a word computer picks (possible words shown) solver: Computer solves a word player or http://hellowordl.net picks demo: Computer plays against itself TODO: Reimplement as a class TODO: Improve error-handling """ import sys, time, random DEFAULT_ANSWER = None DEFAULT_GAME_MODE = 'game' FIRST_GUESS = 'RAISE' LABEL_PX = 70 COLOUR_BG = 'white' COLOUR_MARK_L = ['white', 'grey', 'yellow', 'lime'] FREQUENCY_TIEBREAK_D = {letter:i_letter * 0.01 for (i_letter, letter) in enumerate('EARIOTNSLCUDPMHGBFYWKVXZJQ'[::-1])} FORMAT_KEYBOARD_MARK_L = [' {} ', ' ' , '<{}>', '[{}]'] ## 0=white, 1=grey, 2=amber, 3=green FORMAT_GUESS_MARK_L = [' {} ', ' {} ', '<{}>', '[{}]'] N_LETTER = 5 FILE_ANSWER = 'pyordle_answers.txt' FILE_VALID = 'pyordle_valid.txt' KEYBOARD = ''' Q W E R T Y U I O P A S D F G H J K L Z X C V B N M''' PRAISE_L = ['Genius', 'Magnificent', 'Impressive', 'Splendid', 'Great', 'Phew'] n_guess = len(PRAISE_L) ## Remove possible words not matching evaluation def trim_possible(possible_s, guess, guess_mark_l): for word in possible_s.copy(): if evaluate_guess(guess, word) != guess_mark_l: possible_s.remove(word) ## Choose next guess ## TODO: Implement a better algorithm using word commonness def choose_guess(possible_s): n_possible = len(possible_s) ## Rank letters by descending frequency in possible_s frequency_d = {} for word in possible_s: for letter in word: if letter not in frequency_d: frequency_d[letter] = 0 frequency_d[letter] += 1 # print(sorted(frequency_d.items(), key=lambda x:x[1])[:9]) ## Assign scores to words in possible_s score_d = {} for word in possible_s: score_d[word] = sum([frequency_d[letter] + FREQUENCY_TIEBREAK_D[letter] for letter in word]) / (N_LETTER - len(set(word)) + 2) sorted_score_l = sorted(list(score_d), key=lambda word:score_d[word], reverse=True) print(', '.join(['{}:{:.2f}'.format(word, score_d[word]) for word in sorted_score_l][:5])) if is_gui: label_title.configure(text=','.join(['{}'.format(word) for word in sorted_score_l][:5])) return sorted_score_l[0] ## Input guess for computer's word def input_guess(i_guess, n_guess, valid_s): global gui_input ## must set as global as value will be changed gui_input = '' prompt_guess = 'Enter guess {} out of {}: '.format(i_guess, n_guess) if game_mode == 'GAME' or i_guess == 1: display_message(prompt_guess, False) while True: if is_gui: window.mainloop() guess = gui_input else: guess = raw_input('\n{}'.format(prompt_guess)).strip().upper() if guess in valid_s: break display_message('"{}" is not in the word list.'.format(guess)) if i_guess == 1: print('\n[ ] = letter exactly right, < > = letter in wrong position') return guess ## Input results for computer's guess def input_evaluation(guess): prompt_mark = ''' Play {} and then enter the result as 5 digits, such as 12231 where 1=totally wrong, 2=wrong position, 3=exactly right: '''.format(guess) return [int(mark) for mark in raw_input(prompt_mark).strip()] ## Evaluate result for a given answer def evaluate_guess(guess, answer): guess_mark_l = [1] * N_LETTER for (i_letter_answer, letter_answer) in enumerate(answer): ## Mark greens if guess[i_letter_answer] == letter_answer: guess_mark_l[i_letter_answer] = 3 else: ## Mark ambers and greys for (i_letter_guess, letter_guess) in enumerate(guess): if letter_guess == letter_answer and guess_mark_l[i_letter_guess] < 2: guess_mark_l[i_letter_guess] = 2 break return guess_mark_l ## Animate letter def animate_letter(label, i_fraction): label.configure(width=LABEL_PX * i_fraction // 5) label.update() time.sleep(0.03) ## Output result def display_result(guess, i_guess, guess_mark_l, keyboard_mark_d): ## Update keyboard for (i_letter_guess, letter_guess) in enumerate(guess): if keyboard_mark_d[letter_guess] < guess_mark_l[i_letter_guess]: keyboard_mark_d[letter_guess] = guess_mark_l[i_letter_guess] ## Print evaluation output = '\n' for (i_letter, letter) in enumerate(guess): output += ' ' + FORMAT_GUESS_MARK_L[guess_mark_l[i_letter]].format(letter) print(output) ## Print keyboard output = KEYBOARD for letter in keyboard_mark_d: output = output.replace(letter, FORMAT_KEYBOARD_MARK_L[keyboard_mark_d[letter]].format(letter)) print(output) if is_gui: for (i_letter, letter) in enumerate(guess): label = label_ll[i_guess][i_letter] for i_frame in range(5): animate_letter(label, 4.5 - i_frame) label.configure(bg=COLOUR_MARK_L[guess_mark_l[i_letter]]) for i_frame in range(5): animate_letter(label, 1 + i_frame) button_d[letter].configure(bg=COLOUR_MARK_L[keyboard_mark_d[letter]]) ## Output message def display_message(message, is_print=True): if is_print: print('\n{}'.format(message)) if is_gui: for length in range(len(message)): label_title.configure(text=message[:length + 1]) label_title.update() time.sleep(0.01) ## Make compatible with both Python 2 and 3 try: raw_input except NameError: raw_input = input ## Set game mode (GAME by default) game_mode = (sys.argv[1] if len(sys.argv) > 1 else DEFAULT_GAME_MODE).upper() print('PYORDLE IN {} MODE'.format(game_mode)) ## TODO: Make GUI for solver mode is_gui = game_mode != 'SOLVER' and (len(sys.argv) <= 2 or sys.argv[2] == '1') ## Set up GUI if needed ## TODO: Run all program logic in mainloop instead of starting and stopping it ## TODO: Make window resizable if is_gui: try: import tkinter as tk, tkinter.font as tkFont except ImportError: is_gui = False if is_gui: window = tk.Tk(className='Pyordle') window.configure(bg=COLOUR_BG) window.resizable(False, False) window.bind_all('', lambda event:input_key(event.char)) window.bind_all('', exit) tkFont.nametofont('TkDefaultFont').configure(family='Courier', size=18) frame_header = tk.Frame(master=window, bg=COLOUR_BG) frame_guess = tk.Frame(master=window, bg=COLOUR_BG) frame_footer = tk.Frame(master=window, bg=COLOUR_BG, padx=20, pady=4) frame_header.pack() frame_guess .pack() frame_footer.pack() label_title = tk.Label(master=frame_header, font=('sans-serif', 10), bg=COLOUR_BG) label_title.pack() ## Draw guesses image_dummy = tk.PhotoImage() label_ll = [None] for i_guess in range(n_guess): label_l = [] for i_letter in range(N_LETTER): label = tk.Label(master=frame_guess, width=LABEL_PX, height=LABEL_PX, relief='groove', image=image_dummy, compound=tk.CENTER, bg=COLOUR_BG, text=' ') label.grid(row=i_guess, column=i_letter, padx=2, pady=4) label_l.append(label) label_ll.append(label_l) ## Draw keyboard button_d = {} button_label_d = {'ENTER':'\u21B5', 'BACKSPACE': '\u232B'} for (i_row, row) in enumerate(KEYBOARD.strip().split('\n')): i_column = i_row % 2 if i_row == 2: row = 'ENTER {} BACKSPACE'.format(row) for (i_key, key) in enumerate(row.split()): columnspan = 3 if key in button_label_d else 2 width = 2 if key in button_label_d else 1 button_d[key] = tk.Button(master=frame_footer, width=width, height=1, padx=1, pady=1, relief='raised', bg=COLOUR_BG, text=button_label_d.get(key, key), command=lambda key=key:input_key(key)) ## see Python closure button_d[key].grid(row=i_row, column=i_column, columnspan=columnspan, padx=2, pady=2) i_column += columnspan gui_input = '' ## input from GUI def input_key(key): ## callback on keypress or click on GUI global gui_input ## must set as global as value will be changed key = key.upper() if key == '\x1b': ## Escape exit() elif key == '\x08' or key == 'BACKSPACE': if len(gui_input) > 0: gui_input = gui_input[:-1] label_ll[i_guess][len(gui_input)].configure(text=' ') ## label shrinks if text='' elif key == '\x0d' or key == 'ENTER': window.quit() elif key >= 'A' and key <= 'Z' and len(gui_input) < N_LETTER: label_ll[i_guess][len(gui_input)].configure(text=key) gui_input += key ## Read words import base64, bz2 answer_s = set([line.strip().upper() for line in bz2.decompress(base64.b64decode('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')).decode('utf-8').strip().split('\n')]) # print(len(answer_s), list(answer_s)[0]) valid_s = set([line.strip().upper() for line in bz2.decompress(base64.b64decode('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')).decode('utf-8').strip().split('\n')]).union(answer_s) # print(len(valid_s), list(valid_s)[0]) ## Set puzzle if game_mode != 'SOLVER': answer = DEFAULT_ANSWER or random.choice(list(answer_s)) if len(sys.argv) > 3: answer = sys.argv[3] answer = answer.upper() i_guess = 0 keyboard_mark_d = {letter:0 for letter in KEYBOARD if 'A' <= letter <= 'Z'} status = 0 ## 0=answer not found, 1=answer found, 2=results do not match possible answers while i_guess < n_guess: i_guess += 1 ## Get guess if game_mode != 'GAME': if i_guess == 1: guess = FIRST_GUESS possible_s = valid_s.copy() ## set of words matching results so far else: trim_possible(possible_s, guess, guess_mark_l) n_possible = len(possible_s) print('\nPossible words left: {}'.format(n_possible)) if n_possible < 1: status = 2 break guess = choose_guess(possible_s) if game_mode in ['GAME', 'HINT']: guess = input_guess(i_guess, n_guess, valid_s) ## Evaluate guess if game_mode == 'SOLVER': guess_mark_l = input_evaluation(guess) else: guess_mark_l = evaluate_guess(guess, answer) display_result(guess, i_guess, guess_mark_l, keyboard_mark_d) if guess_mark_l == [3] * N_LETTER: status = 1 break if status == 0: display_message('Sorry, the answer is {}.'.format(answer)) elif status == 1: display_message('{}, got {} in {}!'.format(PRAISE_L[i_guess - 1], guess, i_guess)) else: display_message('No words fit the results above.') ## Wait until Esc is pressed or window is closed ## TODO: Disable backspace and letter keys if is_gui: window.mainloop()